Rewrote Cursor with new API and OS X implementation
This commit is contained in:
parent
6f5a7d1b1b
commit
f65459d0e1
@ -32,6 +32,7 @@
|
|||||||
#include <SFML/System.hpp>
|
#include <SFML/System.hpp>
|
||||||
#include <SFML/Window/Context.hpp>
|
#include <SFML/Window/Context.hpp>
|
||||||
#include <SFML/Window/ContextSettings.hpp>
|
#include <SFML/Window/ContextSettings.hpp>
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
#include <SFML/Window/Event.hpp>
|
#include <SFML/Window/Event.hpp>
|
||||||
#include <SFML/Window/Joystick.hpp>
|
#include <SFML/Window/Joystick.hpp>
|
||||||
#include <SFML/Window/Keyboard.hpp>
|
#include <SFML/Window/Keyboard.hpp>
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#ifndef SFML_CONTEXTSETTINGS_HPP
|
#ifndef SFML_CONTEXTSETTINGS_HPP
|
||||||
#define SFML_CONTEXTSETTINGS_HPP
|
#define SFML_CONTEXTSETTINGS_HPP
|
||||||
|
|
||||||
|
#include <SFML/Config.hpp>
|
||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
{
|
{
|
||||||
|
214
include/SFML/Window/Cursor.hpp
Normal file
214
include/SFML/Window/Cursor.hpp
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SFML_CURSOR_HPP
|
||||||
|
#define SFML_CURSOR_HPP
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Export.hpp>
|
||||||
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
class CursorImpl;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Cursor defines the appearance of a system cursor
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
class SFML_WINDOW_API Cursor : NonCopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Enumeration of the native system cursor types
|
||||||
|
///
|
||||||
|
/// Refer to the following table to determine which cursor
|
||||||
|
/// is available on which platform.
|
||||||
|
///
|
||||||
|
/// Type | Linux | Mac OS X | Windows
|
||||||
|
/// ------------------------------------|:-----:|:--------:|:--------:
|
||||||
|
/// sf::Cursor::Arrow | yes | yes | yes
|
||||||
|
/// sf::Cursor::ArrowWait | no | no | no
|
||||||
|
/// sf::Cursor::Wait | no | no | no
|
||||||
|
/// sf::Cursor::Text | no | yes | no
|
||||||
|
/// sf::Cursor::Hand | no | yes | no
|
||||||
|
/// sf::Cursor::SizeHorizontal | no | yes | no
|
||||||
|
/// sf::Cursor::SizeVertical | no | yes | no
|
||||||
|
/// sf::Cursor::SizeTopLeftBottomRight | no | no | no
|
||||||
|
/// sf::Cursor::SizeBottomLeftTopRight | no | no | no
|
||||||
|
/// sf::Cursor::SizeAll | no | no | no
|
||||||
|
/// sf::Cursor::Cross | no | yes | no
|
||||||
|
/// sf::Cursor::Help | no | no | no
|
||||||
|
/// sf::Cursor::NotAllowed | no | yes | no
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
enum Type
|
||||||
|
{
|
||||||
|
Arrow, ///< Arrow cursor (default)
|
||||||
|
ArrowWait, ///< Busy arrow cursor
|
||||||
|
Wait, ///< Busy cursor
|
||||||
|
Text, ///< I-beam, cursor when hovering over a field allowing text entry
|
||||||
|
Hand, ///< Pointing hand cursor
|
||||||
|
SizeHorizontal, ///< Horizontal double arrow cursor
|
||||||
|
SizeVertical, ///< Vertical double arrow cursor
|
||||||
|
SizeTopLeftBottomRight, ///< Double arrow cursor going from top-left to bottom-right
|
||||||
|
SizeBottomLeftTopRight, ///< Double arrow cursor going from bottom-left to top-right
|
||||||
|
SizeAll, ///< Combination of SizeHorizontal and SizeVertical
|
||||||
|
Cross, ///< Crosshair cursor
|
||||||
|
Help, ///< Help cursor
|
||||||
|
NotAllowed ///< Action not allowed cursor
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Default constructor
|
||||||
|
///
|
||||||
|
/// This constructor doesn't actually create the cursor;
|
||||||
|
/// initially the new instance is invalid and must not be
|
||||||
|
/// used until either loadFromPixels() or loadFromSystem()
|
||||||
|
/// is called and successfully created a cursor.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Cursor();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Destructor
|
||||||
|
///
|
||||||
|
/// This destructor releases the system resources
|
||||||
|
/// associated with this cursor, if any.
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
~Cursor();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a cursor with the provided image
|
||||||
|
///
|
||||||
|
/// \a pixels must be an array of \a width by \a height pixels
|
||||||
|
/// in 32-bit RGBA format. If not, this will cause undefined behavior.
|
||||||
|
///
|
||||||
|
/// If \a pixels is null or either \a width or \a height are 0,
|
||||||
|
/// the current cursor is left unchanged and the function will
|
||||||
|
/// return false.
|
||||||
|
///
|
||||||
|
/// In addition to specifying the pixel data, you can also
|
||||||
|
/// specify the location of the hotspot of the cursor. The
|
||||||
|
/// hotspot is the pixel coordinate within the cursor image
|
||||||
|
/// which will be located exactly where the mouse pointer
|
||||||
|
/// position is. Any mouse actions that are performed will
|
||||||
|
/// return the window/screen location of the hotspot.
|
||||||
|
///
|
||||||
|
/// \param pixels Array of pixels of the image
|
||||||
|
/// \param size Width and height of the image
|
||||||
|
/// \param hotspot (x,y) location of the hotspot
|
||||||
|
/// \return true if the cursor was successfully loaded;
|
||||||
|
/// false otherwise
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a native system cursor
|
||||||
|
///
|
||||||
|
/// Refer to the list of cursor available on each system
|
||||||
|
/// (see sf::Cursor::Type) to know whether a given cursor is
|
||||||
|
/// expected to load successfully or is not supported by
|
||||||
|
/// the operating system.
|
||||||
|
///
|
||||||
|
/// \param type Native system cursor type
|
||||||
|
/// \return true if and only if the corresponding cursor is
|
||||||
|
/// natively supported by the operating system;
|
||||||
|
/// false otherwise
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromSystem(Type type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend class Window;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Get access to the underlying implementation
|
||||||
|
///
|
||||||
|
/// This is primarily designed for sf::Window::setMouseCursor,
|
||||||
|
/// hence the friendship.
|
||||||
|
///
|
||||||
|
/// \return a reference to the OS-specific implementation
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
const priv::CursorImpl& getImpl() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Member data
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
priv::CursorImpl* m_impl; ///< Platform-specific implementation of the cursor
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
||||||
|
|
||||||
|
#endif // SFML_CURSOR_HPP
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \class sf::Cursor
|
||||||
|
/// \ingroup window
|
||||||
|
///
|
||||||
|
/// \warning Features related to Cursor are not supported on
|
||||||
|
/// iOS and Android.
|
||||||
|
///
|
||||||
|
/// This class abstracts the operating system resources
|
||||||
|
/// associated with either a native system cursor or a custom
|
||||||
|
/// cursor.
|
||||||
|
///
|
||||||
|
/// After loading the cursor the graphical appearance
|
||||||
|
/// with either loadFromPixels() or loadFromSystem(), the
|
||||||
|
/// cursor can be changed with sf::Window::setMouseCursor().
|
||||||
|
///
|
||||||
|
/// \todo Does Windows or Linux requires the Cursor instance
|
||||||
|
/// to outlive it's usage?
|
||||||
|
///
|
||||||
|
/// Usage example:
|
||||||
|
/// \code
|
||||||
|
/// sf::Window window;
|
||||||
|
///
|
||||||
|
/// // ... create window as usual ...
|
||||||
|
///
|
||||||
|
/// sf::Cursor cursor;
|
||||||
|
/// if (cursor.loadFromSystem(sf::Cursor::Hand))
|
||||||
|
/// window.setMouseCursor(cursor);
|
||||||
|
/// \endcode
|
||||||
|
///
|
||||||
|
/// \see sf::Window::setMouseCursor
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
@ -28,16 +28,17 @@
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
// Headers
|
// Headers
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
#include <SFML/Window/Export.hpp>
|
|
||||||
#include <SFML/Window/ContextSettings.hpp>
|
#include <SFML/Window/ContextSettings.hpp>
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
|
#include <SFML/Window/Export.hpp>
|
||||||
|
#include <SFML/Window/GlResource.hpp>
|
||||||
#include <SFML/Window/VideoMode.hpp>
|
#include <SFML/Window/VideoMode.hpp>
|
||||||
#include <SFML/Window/WindowHandle.hpp>
|
#include <SFML/Window/WindowHandle.hpp>
|
||||||
#include <SFML/Window/WindowStyle.hpp>
|
#include <SFML/Window/WindowStyle.hpp>
|
||||||
#include <SFML/Window/GlResource.hpp>
|
|
||||||
#include <SFML/System/Clock.hpp>
|
#include <SFML/System/Clock.hpp>
|
||||||
#include <SFML/System/Vector2.hpp>
|
|
||||||
#include <SFML/System/NonCopyable.hpp>
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
#include <SFML/System/String.hpp>
|
#include <SFML/System/String.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
|
||||||
namespace sf
|
namespace sf
|
||||||
@ -56,29 +57,6 @@ class Event;
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
class SFML_WINDOW_API Window : GlResource, NonCopyable
|
class SFML_WINDOW_API Window : GlResource, NonCopyable
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Enumeration of the native system cursor types
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
enum Cursor
|
|
||||||
{
|
|
||||||
Arrow, ///< Arrow cursor (default)
|
|
||||||
ArrowWait, ///< Busy arrow cursor
|
|
||||||
Wait, ///< Busy cursor
|
|
||||||
Text, ///< I-beam, cursor when hovering over a field allowing text entry
|
|
||||||
Hand, ///< Pointing hand cursor
|
|
||||||
SizeHorizontal, ///< Horizontal double arrow cursor
|
|
||||||
SizeVertical, ///< Vertical double arrow cursor
|
|
||||||
SizeTopLeftBottomRight, ///< Double arrow cursor going from top-left to bottom-right
|
|
||||||
SizeBottomLeftTopRight, ///< Double arrow cursor going from bottom-left to top-right
|
|
||||||
SizeAll, ///< Combination of CursorSizeHorizontal and CursorSizeVertical
|
|
||||||
Cross, ///< Crosshair cursor
|
|
||||||
Help, ///< Help cursor
|
|
||||||
NotAllowed ///< Action not allowed cursor
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
@ -389,37 +367,16 @@ public:
|
|||||||
///
|
///
|
||||||
/// Upon window creation, the arrow cursor is used by default.
|
/// Upon window creation, the arrow cursor is used by default.
|
||||||
///
|
///
|
||||||
|
/// \warning Features related to Cursor are not supported on
|
||||||
|
/// iOS and Android.
|
||||||
|
///
|
||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
/// \see sf::Cursor::loadFromSystem
|
||||||
void setMouseCursor(Cursor cursor);
|
/// \see sf::Cursor::loadFromPixels
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \a pixels must be an array of \a width x \a height pixels
|
|
||||||
/// in 32-bit RGBA format. If not, this will cause undefined behavior.
|
|
||||||
///
|
|
||||||
/// If \a pixels is null or either \a width or \a height are 0,
|
|
||||||
/// the current cursor is left unchanged.
|
|
||||||
///
|
|
||||||
/// In addition to specifying the pixel data, you can also
|
|
||||||
/// specify the location of the hotspot of the cursor. The
|
|
||||||
/// hotspot is the pixel coordinate within the cursor image
|
|
||||||
/// which will be located exactly where the mouse pointer
|
|
||||||
/// position is. Any mouse actions that are performed will
|
|
||||||
/// return the window/screen location of the hotspot.
|
|
||||||
///
|
|
||||||
/// Upon window creation, the arrow cursor is used by default.
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
void setMouseCursor(const Cursor& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -186,14 +186,7 @@ void WindowImplAndroid::setMouseCursorGrabbed(bool grabbed)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplAndroid::setMouseCursor(Window::Cursor cursor)
|
void WindowImplAndroid::setMouseCursor(const CursorImpl& cursor)
|
||||||
{
|
|
||||||
// Not applicable
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void WindowImplAndroid::setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY)
|
|
||||||
{
|
{
|
||||||
// Not applicable
|
// Not applicable
|
||||||
}
|
}
|
||||||
|
@ -160,19 +160,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor);
|
virtual void setMouseCursor(const CursorImpl& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -6,6 +6,9 @@ set(SRCROOT ${PROJECT_SOURCE_DIR}/src/SFML/Window)
|
|||||||
set(SRC
|
set(SRC
|
||||||
${SRCROOT}/Context.cpp
|
${SRCROOT}/Context.cpp
|
||||||
${INCROOT}/Context.hpp
|
${INCROOT}/Context.hpp
|
||||||
|
${SRCROOT}/Cursor.cpp
|
||||||
|
${INCROOT}/Cursor.hpp
|
||||||
|
${SRCROOT}/CursorImpl.hpp
|
||||||
${INCROOT}/Export.hpp
|
${INCROOT}/Export.hpp
|
||||||
${SRCROOT}/GlContext.cpp
|
${SRCROOT}/GlContext.cpp
|
||||||
${SRCROOT}/GlContext.hpp
|
${SRCROOT}/GlContext.hpp
|
||||||
@ -51,6 +54,8 @@ source_group("" FILES ${SRC})
|
|||||||
# add platform specific sources
|
# add platform specific sources
|
||||||
if(SFML_OS_WINDOWS)
|
if(SFML_OS_WINDOWS)
|
||||||
set(PLATFORM_SRC
|
set(PLATFORM_SRC
|
||||||
|
${SRCROOT}/Win32/CursorImpl.hpp
|
||||||
|
${SRCROOT}/Win32/CursorImpl.cpp
|
||||||
${SRCROOT}/Win32/WglContext.cpp
|
${SRCROOT}/Win32/WglContext.cpp
|
||||||
${SRCROOT}/Win32/WglContext.hpp
|
${SRCROOT}/Win32/WglContext.hpp
|
||||||
${SRCROOT}/Win32/WglExtensions.cpp
|
${SRCROOT}/Win32/WglExtensions.cpp
|
||||||
@ -71,6 +76,8 @@ if(SFML_OS_WINDOWS)
|
|||||||
add_definitions(-DUNICODE -D_UNICODE)
|
add_definitions(-DUNICODE -D_UNICODE)
|
||||||
elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
|
elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD)
|
||||||
set(PLATFORM_SRC
|
set(PLATFORM_SRC
|
||||||
|
${SRCROOT}/Unix/CursorImpl.hpp
|
||||||
|
${SRCROOT}/Unix/CursorImpl.cpp
|
||||||
${SRCROOT}/Unix/Display.cpp
|
${SRCROOT}/Unix/Display.cpp
|
||||||
${SRCROOT}/Unix/Display.hpp
|
${SRCROOT}/Unix/Display.hpp
|
||||||
${SRCROOT}/Unix/InputImpl.cpp
|
${SRCROOT}/Unix/InputImpl.cpp
|
||||||
@ -110,6 +117,8 @@ elseif(SFML_OS_MACOSX)
|
|||||||
${SRCROOT}/OSX/cpp_objc_conversion.mm
|
${SRCROOT}/OSX/cpp_objc_conversion.mm
|
||||||
${SRCROOT}/OSX/cg_sf_conversion.hpp
|
${SRCROOT}/OSX/cg_sf_conversion.hpp
|
||||||
${SRCROOT}/OSX/cg_sf_conversion.mm
|
${SRCROOT}/OSX/cg_sf_conversion.mm
|
||||||
|
${SRCROOT}/OSX/CursorImpl.hpp
|
||||||
|
${SRCROOT}/OSX/CursorImpl.mm
|
||||||
${SRCROOT}/OSX/InputImpl.mm
|
${SRCROOT}/OSX/InputImpl.mm
|
||||||
${SRCROOT}/OSX/InputImpl.hpp
|
${SRCROOT}/OSX/InputImpl.hpp
|
||||||
${SRCROOT}/OSX/HIDInputManager.hpp
|
${SRCROOT}/OSX/HIDInputManager.hpp
|
||||||
@ -155,6 +164,8 @@ elseif(SFML_OS_MACOSX)
|
|||||||
source_group("mac" FILES ${PLATFORM_SRC})
|
source_group("mac" FILES ${PLATFORM_SRC})
|
||||||
elseif(SFML_OS_IOS)
|
elseif(SFML_OS_IOS)
|
||||||
set(PLATFORM_SRC
|
set(PLATFORM_SRC
|
||||||
|
${SRCROOT}/iOS/CursorImpl.hpp
|
||||||
|
${SRCROOT}/iOS/CursorImpl.cpp
|
||||||
${SRCROOT}/iOS/EaglContext.mm
|
${SRCROOT}/iOS/EaglContext.mm
|
||||||
${SRCROOT}/iOS/EaglContext.hpp
|
${SRCROOT}/iOS/EaglContext.hpp
|
||||||
${SRCROOT}/iOS/InputImpl.mm
|
${SRCROOT}/iOS/InputImpl.mm
|
||||||
@ -179,6 +190,8 @@ elseif(SFML_OS_IOS)
|
|||||||
source_group("ios" FILES ${PLATFORM_SRC})
|
source_group("ios" FILES ${PLATFORM_SRC})
|
||||||
elseif(SFML_OS_ANDROID)
|
elseif(SFML_OS_ANDROID)
|
||||||
set(PLATFORM_SRC
|
set(PLATFORM_SRC
|
||||||
|
${SRCROOT}/Android/CursorImpl.hpp
|
||||||
|
${SRCROOT}/Android/CursorImpl.cpp
|
||||||
${SRCROOT}/Android/WindowImplAndroid.hpp
|
${SRCROOT}/Android/WindowImplAndroid.hpp
|
||||||
${SRCROOT}/Android/WindowImplAndroid.cpp
|
${SRCROOT}/Android/WindowImplAndroid.cpp
|
||||||
${SRCROOT}/Android/VideoModeImpl.cpp
|
${SRCROOT}/Android/VideoModeImpl.cpp
|
||||||
|
73
src/SFML/Window/Cursor.cpp
Normal file
73
src/SFML/Window/Cursor.cpp
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
|
#include <SFML/Window/CursorImpl.hpp>
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Cursor::Cursor() :
|
||||||
|
m_impl(new priv::CursorImpl())
|
||||||
|
{
|
||||||
|
// That's it
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
Cursor::~Cursor()
|
||||||
|
{
|
||||||
|
delete m_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool Cursor::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
|
||||||
|
{
|
||||||
|
if ((pixels == 0) || (size.x == 0) || (size.y == 0))
|
||||||
|
return false;
|
||||||
|
else
|
||||||
|
return m_impl->loadFromPixels(pixels, size, hotspot);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool Cursor::loadFromSystem(Type type)
|
||||||
|
{
|
||||||
|
return m_impl->loadFromSystem(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
const priv::CursorImpl& Cursor::getImpl() const
|
||||||
|
{
|
||||||
|
return *m_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
56
src/SFML/Window/CursorImpl.hpp
Normal file
56
src/SFML/Window/CursorImpl.hpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SFML_CURSORIMPL_HPP
|
||||||
|
#define SFML_CURSORIMPL_HPP
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Config.hpp>
|
||||||
|
|
||||||
|
#if defined(SFML_SYSTEM_WINDOWS)
|
||||||
|
|
||||||
|
#include <SFML/Window/Win32/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#elif defined(SFML_SYSTEM_LINUX) || defined(SFML_SYSTEM_FREEBSD)
|
||||||
|
|
||||||
|
#include <SFML/Window/Unix/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#elif defined(SFML_SYSTEM_MACOS)
|
||||||
|
|
||||||
|
#include <SFML/Window/OSX/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#elif defined(SFML_SYSTEM_IOS)
|
||||||
|
|
||||||
|
#include <SFML/Window/iOS/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#elif defined(SFML_SYSTEM_ANDROID)
|
||||||
|
|
||||||
|
#include <SFML/Window/Android/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif // SFML_CURSORIMPL_HPP
|
109
src/SFML/Window/OSX/CursorImpl.hpp
Normal file
109
src/SFML/Window/OSX/CursorImpl.hpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Marco Antognini (antognini.marco@gmail.com),
|
||||||
|
// Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SFML_CURSORIMPLOSX_HPP
|
||||||
|
#define SFML_CURSORIMPLOSX_HPP
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Predefine OBJ-C classes
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#ifdef __OBJC__
|
||||||
|
|
||||||
|
@class NSCursor;
|
||||||
|
typedef NSCursor* NSCursorRef;
|
||||||
|
|
||||||
|
#else // If C++
|
||||||
|
|
||||||
|
typedef void* NSCursorRef;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Mac OS X implementation of Cursor
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
class CursorImpl : NonCopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Default constructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Destructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::~Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
~CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a cursor with the provided image
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromPixels().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a native system cursor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromSystem().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromSystem(Cursor::Type type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend class WindowImplCocoa;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Member data
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
NSCursorRef m_cursor; ///< System cursor handle
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
||||||
|
#endif // SFML_CURSORIMPLOSX_HPP
|
97
src/SFML/Window/OSX/CursorImpl.mm
Normal file
97
src/SFML/Window/OSX/CursorImpl.mm
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Marco Antognini (antognini.marco@gmail.com),
|
||||||
|
// Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/OSX/CursorImpl.hpp>
|
||||||
|
|
||||||
|
#import <SFML/Window/OSX/AutoreleasePoolWrapper.h>
|
||||||
|
#import <SFML/Window/OSX/NSImage+raw.h>
|
||||||
|
#import <AppKit/AppKit.h>
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::CursorImpl() :
|
||||||
|
m_cursor(nil)
|
||||||
|
{
|
||||||
|
// Just ask for a pool
|
||||||
|
ensureThreadHasPool();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::~CursorImpl()
|
||||||
|
{
|
||||||
|
[m_cursor release];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
|
||||||
|
{
|
||||||
|
NSSize nssize = NSMakeSize(size.x, size.y);
|
||||||
|
NSImage* image = [NSImage imageWithRawData:pixels andSize:nssize];
|
||||||
|
NSPoint nshotspot = NSMakePoint(hotspot.x, hotspot.y);
|
||||||
|
|
||||||
|
m_cursor = [[NSCursor alloc] initWithImage:image hotSpot:nshotspot];
|
||||||
|
|
||||||
|
return m_cursor != nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromSystem(Cursor::Type type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
default: return false;
|
||||||
|
|
||||||
|
case Cursor::Arrow: m_cursor = [NSCursor arrowCursor]; break;
|
||||||
|
case Cursor::Text: m_cursor = [NSCursor IBeamCursor]; break;
|
||||||
|
case Cursor::Hand: m_cursor = [NSCursor pointingHandCursor]; break;
|
||||||
|
case Cursor::SizeHorizontal: m_cursor = [NSCursor resizeLeftRightCursor]; break;
|
||||||
|
case Cursor::SizeVertical: m_cursor = [NSCursor resizeUpDownCursor]; break;
|
||||||
|
case Cursor::Cross: m_cursor = [NSCursor crosshairCursor]; break;
|
||||||
|
case Cursor::NotAllowed: m_cursor = [NSCursor operationNotAllowedCursor]; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Since we didn't allocate the cursor ourself, we have to retain it
|
||||||
|
// in order to not break the retain count.
|
||||||
|
[m_cursor retain];
|
||||||
|
|
||||||
|
// For all non-default cases, it was a success.
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
@ -40,6 +40,25 @@
|
|||||||
|
|
||||||
@implementation SFOpenGLView (mouse)
|
@implementation SFOpenGLView (mouse)
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursor:(NSCursor*)cursor
|
||||||
|
{
|
||||||
|
m_cursor = cursor;
|
||||||
|
|
||||||
|
// indirect call to resetCursorRects to set the cursor
|
||||||
|
[self.window invalidateCursorRectsForView:self];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(void)resetCursorRects
|
||||||
|
{
|
||||||
|
// addCursorRect:cursor: has to be called from within this function!
|
||||||
|
[self addCursorRect:[self frame] cursor:m_cursor];
|
||||||
|
[m_cursor setOnMouseEntered:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////
|
||||||
-(BOOL)isMouseInside
|
-(BOOL)isMouseInside
|
||||||
{
|
{
|
||||||
|
@ -71,6 +71,7 @@ namespace sf {
|
|||||||
sf::priv::WindowImplCocoa* m_requester; ///< View's requester
|
sf::priv::WindowImplCocoa* m_requester; ///< View's requester
|
||||||
BOOL m_useKeyRepeat; ///< Key repeat setting
|
BOOL m_useKeyRepeat; ///< Key repeat setting
|
||||||
BOOL m_mouseIsIn; ///< Mouse positional state
|
BOOL m_mouseIsIn; ///< Mouse positional state
|
||||||
|
NSCursor* m_cursor; ///< Active cursor
|
||||||
NSTrackingArea* m_trackingArea; ///< Mouse tracking area
|
NSTrackingArea* m_trackingArea; ///< Mouse tracking area
|
||||||
BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not
|
BOOL m_fullscreen; ///< Indicate whether the window is fullscreen or not
|
||||||
CGFloat m_scaleFactor; ///< Display scale factor (e.g. 1x for classic display, 2x for retina)
|
CGFloat m_scaleFactor; ///< Display scale factor (e.g. 1x for classic display, 2x for retina)
|
||||||
@ -154,6 +155,12 @@ namespace sf {
|
|||||||
|
|
||||||
@interface SFOpenGLView (mouse)
|
@interface SFOpenGLView (mouse)
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Set the system cursor for the window area
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursor:(NSCursor*)cursor;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Compute the position of the cursor
|
/// \brief Compute the position of the cursor
|
||||||
///
|
///
|
||||||
|
@ -111,6 +111,7 @@
|
|||||||
m_cursorGrabbed = NO;
|
m_cursorGrabbed = NO;
|
||||||
m_deltaXBuffer = 0;
|
m_deltaXBuffer = 0;
|
||||||
m_deltaYBuffer = 0;
|
m_deltaYBuffer = 0;
|
||||||
|
m_cursor = [NSCursor arrowCursor];
|
||||||
|
|
||||||
// Create a hidden text view for parsing key down event properly
|
// Create a hidden text view for parsing key down event properly
|
||||||
m_silentResponder = [[SFSilentResponder alloc] init];
|
m_silentResponder = [[SFSilentResponder alloc] init];
|
||||||
|
@ -128,6 +128,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursor:(NSCursor*)cursor
|
||||||
|
{
|
||||||
|
return [m_oglView setCursor:cursor];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
-(NSPoint)position
|
-(NSPoint)position
|
||||||
{
|
{
|
||||||
|
@ -371,6 +371,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursor:(NSCursor*)cursor
|
||||||
|
{
|
||||||
|
return [m_oglView setCursor:cursor];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
-(NSPoint)position
|
-(NSPoint)position
|
||||||
{
|
{
|
||||||
|
@ -327,19 +327,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor);
|
virtual void setMouseCursor(const CursorImpl& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -494,16 +494,9 @@ void WindowImplCocoa::setMouseCursorGrabbed(bool grabbed)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplCocoa::setMouseCursor(Window::Cursor cursor)
|
void WindowImplCocoa::setMouseCursor(const CursorImpl& cursor)
|
||||||
{
|
{
|
||||||
// TODO: Implement OS X cursor setting
|
[m_delegate setCursor:cursor.m_cursor];
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void WindowImplCocoa::setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY)
|
|
||||||
{
|
|
||||||
// TODO: Implement OS X cursor setting
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -104,6 +104,12 @@ namespace sf {
|
|||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
-(void)setCursorGrabbed:(BOOL)grabbed;
|
-(void)setCursorGrabbed:(BOOL)grabbed;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Set the system cursor for the window area
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
-(void)setCursor:(NSCursor*)cursor;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Get window position
|
/// \brief Get window position
|
||||||
///
|
///
|
||||||
|
66
src/SFML/Window/Unix/CursorImpl.cpp
Normal file
66
src/SFML/Window/Unix/CursorImpl.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Unix/CursorImpl.hpp>
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::CursorImpl()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::~CursorImpl()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromSystem(Cursor::Type type)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
94
src/SFML/Window/Unix/CursorImpl.hpp
Normal file
94
src/SFML/Window/Unix/CursorImpl.hpp
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SFML_CURSORIMPLUNIX_HPP
|
||||||
|
#define SFML_CURSORIMPLUNIX_HPP
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Unix implementation of Cursor
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
class CursorImpl : NonCopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Default constructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Destructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::~Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
~CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a cursor with the provided image
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromPixels().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a native system cursor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromSystem().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromSystem(Cursor::Type type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend class WindowImplX11;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Member data
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
||||||
|
#endif // SFML_CUSROSIMPLUNIX_HPP
|
@ -901,246 +901,9 @@ void WindowImplX11::setMouseCursorVisible(bool visible)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplX11::setMouseCursor(Window::Cursor cursor)
|
void WindowImplX11::setMouseCursor(const CursorImpl& cursor)
|
||||||
{
|
{
|
||||||
xcb_cursor_t newCursor = 0;
|
// TODO
|
||||||
|
|
||||||
xcb_cursor_context_t* cursorContext = NULL;
|
|
||||||
|
|
||||||
if (xcb_cursor_context_new(m_connection, m_screen, &cursorContext) < 0)
|
|
||||||
{
|
|
||||||
err() << "Could not create XCB cursor context" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(cursor)
|
|
||||||
{
|
|
||||||
case Window::Arrow: newCursor = xcb_cursor_load_cursor(cursorContext, "left_ptr"); break;
|
|
||||||
case Window::ArrowWait: newCursor = xcb_cursor_load_cursor(cursorContext, "left_ptr"); break;
|
|
||||||
case Window::Wait: newCursor = xcb_cursor_load_cursor(cursorContext, "watch"); break;
|
|
||||||
case Window::Text: newCursor = xcb_cursor_load_cursor(cursorContext, "xterm"); break;
|
|
||||||
case Window::Hand: newCursor = xcb_cursor_load_cursor(cursorContext, "hand2"); break;
|
|
||||||
case Window::SizeHorizontal: newCursor = xcb_cursor_load_cursor(cursorContext, "sb_h_double_arrow"); break;
|
|
||||||
case Window::SizeVertical: newCursor = xcb_cursor_load_cursor(cursorContext, "sb_v_double_arrow"); break;
|
|
||||||
case Window::SizeTopLeftBottomRight: newCursor = xcb_cursor_load_cursor(cursorContext, "fleur"); break;
|
|
||||||
case Window::SizeBottomLeftTopRight: newCursor = xcb_cursor_load_cursor(cursorContext, "fleur"); break;
|
|
||||||
case Window::SizeAll: newCursor = xcb_cursor_load_cursor(cursorContext, "fleur"); break;
|
|
||||||
case Window::Cross: newCursor = xcb_cursor_load_cursor(cursorContext, "crosshair"); break;
|
|
||||||
case Window::Help: newCursor = xcb_cursor_load_cursor(cursorContext, "question_arrow"); break;
|
|
||||||
case Window::NotAllowed: newCursor = xcb_cursor_load_cursor(cursorContext, "left_ptr"); break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_cursor_context_free(cursorContext);
|
|
||||||
|
|
||||||
if (m_loadedCursor)
|
|
||||||
xcb_free_cursor(m_connection, m_loadedCursor);
|
|
||||||
|
|
||||||
if (!newCursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
m_loadedCursor = newCursor;
|
|
||||||
|
|
||||||
if (!m_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> changeAttributesError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_change_window_attributes(
|
|
||||||
m_connection,
|
|
||||||
m_window,
|
|
||||||
XCB_CW_CURSOR,
|
|
||||||
&m_loadedCursor
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (changeAttributesError)
|
|
||||||
{
|
|
||||||
err() << "Failed to change window attributes" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_cursor = m_loadedCursor;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void WindowImplX11::setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY)
|
|
||||||
{
|
|
||||||
// Get the picture format from XCB
|
|
||||||
ScopedXcbPtr<xcb_render_query_pict_formats_reply_t> pictFormatsreply(xcb_render_query_pict_formats_reply(
|
|
||||||
m_connection,
|
|
||||||
xcb_render_query_pict_formats(
|
|
||||||
m_connection
|
|
||||||
),
|
|
||||||
NULL
|
|
||||||
));
|
|
||||||
|
|
||||||
xcb_render_pictformat_t pictureFormat = xcb_render_util_find_standard_format(pictFormatsreply.get(), XCB_PICT_STANDARD_ARGB_32)->id;
|
|
||||||
|
|
||||||
if (!pictureFormat)
|
|
||||||
{
|
|
||||||
err() << "Failed to get picture format from XCB" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// X11 wants BGRA pixels: swap red and blue channels
|
|
||||||
Uint8 cursorPixels[width * height * 4];
|
|
||||||
for (std::size_t i = 0; i < width * height; ++i)
|
|
||||||
{
|
|
||||||
cursorPixels[i * 4 + 0] = pixels[i * 4 + 2];
|
|
||||||
cursorPixels[i * 4 + 1] = pixels[i * 4 + 1];
|
|
||||||
cursorPixels[i * 4 + 2] = pixels[i * 4 + 0];
|
|
||||||
cursorPixels[i * 4 + 3] = pixels[i * 4 + 3];
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_pixmap_t cursorPixmap = xcb_generate_id(m_connection);
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> pixmapError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_create_pixmap(
|
|
||||||
m_connection,
|
|
||||||
32,
|
|
||||||
cursorPixmap,
|
|
||||||
m_window,
|
|
||||||
width,
|
|
||||||
height
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (pixmapError)
|
|
||||||
{
|
|
||||||
err() << "Failed to create XCB cursor pixmap" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_gcontext_t cursorGC = xcb_generate_id(m_connection);
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> gcError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_create_gc(
|
|
||||||
m_connection,
|
|
||||||
cursorGC,
|
|
||||||
cursorPixmap,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (gcError)
|
|
||||||
{
|
|
||||||
err() << "Failed to create XCB graphics context" << std::endl;
|
|
||||||
xcb_free_pixmap(m_connection, cursorPixmap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_image_t* cursorImage = xcb_image_create_native(
|
|
||||||
m_connection,
|
|
||||||
width,
|
|
||||||
height,
|
|
||||||
XCB_IMAGE_FORMAT_Z_PIXMAP,
|
|
||||||
32,
|
|
||||||
NULL,
|
|
||||||
width * height * 4,
|
|
||||||
cursorPixels
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!cursorImage)
|
|
||||||
{
|
|
||||||
err() << "Failed to create XCB cursor image" << std::endl;
|
|
||||||
xcb_free_gc(m_connection, cursorGC);
|
|
||||||
xcb_free_pixmap(m_connection, cursorPixmap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> imagePutError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_image_put(
|
|
||||||
m_connection,
|
|
||||||
cursorPixmap,
|
|
||||||
cursorGC,
|
|
||||||
cursorImage,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
0
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (imagePutError)
|
|
||||||
{
|
|
||||||
err() << "Failed to put XCB image on the X server" << std::endl;
|
|
||||||
xcb_image_destroy(cursorImage);
|
|
||||||
xcb_free_gc(m_connection, cursorGC);
|
|
||||||
xcb_free_pixmap(m_connection, cursorPixmap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_render_picture_t cursorPicture = xcb_generate_id(m_connection);
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> createPictureError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_render_create_picture(
|
|
||||||
m_connection,
|
|
||||||
cursorPicture,
|
|
||||||
cursorPixmap,
|
|
||||||
pictureFormat,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (createPictureError)
|
|
||||||
{
|
|
||||||
err() << "Failed to create XCB cursor picture" << std::endl;
|
|
||||||
xcb_image_destroy(cursorImage);
|
|
||||||
xcb_free_gc(m_connection, cursorGC);
|
|
||||||
xcb_free_pixmap(m_connection, cursorPixmap);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_cursor_t newCursor = xcb_generate_id(m_connection);
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> createCursorError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_render_create_cursor(
|
|
||||||
m_connection,
|
|
||||||
newCursor,
|
|
||||||
cursorPicture,
|
|
||||||
hotspotX,
|
|
||||||
hotspotY
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
xcb_render_free_picture(m_connection, cursorPicture);
|
|
||||||
xcb_image_destroy(cursorImage);
|
|
||||||
xcb_free_gc(m_connection, cursorGC);
|
|
||||||
xcb_free_pixmap(m_connection, cursorPixmap);
|
|
||||||
|
|
||||||
if (createCursorError)
|
|
||||||
{
|
|
||||||
err() << "Failed to create XCB cursor" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
xcb_free_cursor(m_connection, m_loadedCursor);
|
|
||||||
m_loadedCursor = newCursor;
|
|
||||||
|
|
||||||
if (!m_cursor)
|
|
||||||
return;
|
|
||||||
|
|
||||||
ScopedXcbPtr<xcb_generic_error_t> changeAttributesError(xcb_request_check(
|
|
||||||
m_connection,
|
|
||||||
xcb_change_window_attributes(
|
|
||||||
m_connection,
|
|
||||||
m_window,
|
|
||||||
XCB_CW_CURSOR,
|
|
||||||
&m_loadedCursor
|
|
||||||
)
|
|
||||||
));
|
|
||||||
|
|
||||||
if (changeAttributesError)
|
|
||||||
{
|
|
||||||
err() << "Failed to change window attributes" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_cursor = m_loadedCursor;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1583,26 +1346,6 @@ void WindowImplX11::updateLastInputTime(::Time time)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void WindowImplX11::createHiddenCursor()
|
|
||||||
{
|
|
||||||
// Create the cursor's pixmap (1x1 pixels)
|
|
||||||
Pixmap cursorPixmap = XCreatePixmap(m_display, m_window, 1, 1, 1);
|
|
||||||
GC graphicsContext = XCreateGC(m_display, cursorPixmap, 0, NULL);
|
|
||||||
XDrawPoint(m_display, cursorPixmap, graphicsContext, 0, 0);
|
|
||||||
XFreeGC(m_display, graphicsContext);
|
|
||||||
|
|
||||||
// Create the cursor, using the pixmap as both the shape and the mask of the cursor
|
|
||||||
XColor color;
|
|
||||||
color.flags = DoRed | DoGreen | DoBlue;
|
|
||||||
color.red = color.blue = color.green = 0;
|
|
||||||
m_hiddenCursor = XCreatePixmapCursor(m_display, cursorPixmap, cursorPixmap, &color, &color, 0, 0);
|
|
||||||
|
|
||||||
// We don't need the pixmap any longer, free it
|
|
||||||
XFreePixmap(m_display, cursorPixmap);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplX11::cleanup()
|
void WindowImplX11::cleanup()
|
||||||
{
|
{
|
||||||
|
@ -160,19 +160,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor);
|
virtual void setMouseCursor(const CursorImpl& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
@ -279,7 +267,7 @@ private:
|
|||||||
XIC m_inputContext; ///< Input context used to get unicode input in our window
|
XIC m_inputContext; ///< Input context used to get unicode input in our window
|
||||||
bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
|
bool m_isExternal; ///< Tell whether the window has been created externally or by SFML
|
||||||
int m_oldVideoMode; ///< Video mode in use before we switch to fullscreen
|
int m_oldVideoMode; ///< Video mode in use before we switch to fullscreen
|
||||||
Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hidding, we must create a transparent one
|
::Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hidding, we must create a transparent one
|
||||||
bool m_keyRepeat; ///< Is the KeyRepeat feature enabled?
|
bool m_keyRepeat; ///< Is the KeyRepeat feature enabled?
|
||||||
Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only)
|
Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only)
|
||||||
bool m_useSizeHints; ///< Is the size of the window fixed with size hints?
|
bool m_useSizeHints; ///< Is the size of the window fixed with size hints?
|
||||||
|
66
src/SFML/Window/Win32/CursorImpl.cpp
Normal file
66
src/SFML/Window/Win32/CursorImpl.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Win32/CursorImpl.hpp>
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::CursorImpl()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl::~CursorImpl()
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool CursorImpl::loadFromSystem(Cursor::Type type)
|
||||||
|
{
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
95
src/SFML/Window/Win32/CursorImpl.hpp
Normal file
95
src/SFML/Window/Win32/CursorImpl.hpp
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// SFML - Simple and Fast Multimedia Library
|
||||||
|
// Copyright (C) 2007-2016 Laurent Gomila (laurent@sfml-dev.org)
|
||||||
|
//
|
||||||
|
// This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
// In no event will the authors be held liable for any damages arising from the use of this software.
|
||||||
|
//
|
||||||
|
// Permission is granted to anyone to use this software for any purpose,
|
||||||
|
// including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
// subject to the following restrictions:
|
||||||
|
//
|
||||||
|
// 1. The origin of this software must not be misrepresented;
|
||||||
|
// you must not claim that you wrote the original software.
|
||||||
|
// If you use this software in a product, an acknowledgment
|
||||||
|
// in the product documentation would be appreciated but is not required.
|
||||||
|
//
|
||||||
|
// 2. Altered source versions must be plainly marked as such,
|
||||||
|
// and must not be misrepresented as being the original software.
|
||||||
|
//
|
||||||
|
// 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef SFML_CURSORIMPLWIN32_HPP
|
||||||
|
#define SFML_CURSORIMPLWIN32_HPP
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Headers
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
#include <SFML/Window/Cursor.hpp>
|
||||||
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
namespace sf
|
||||||
|
{
|
||||||
|
|
||||||
|
namespace priv
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Win32 implementation of Cursor
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
class CursorImpl : NonCopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Default constructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Destructor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::~Cursor().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
~CursorImpl();
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a cursor with the provided image
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromPixels().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromPixels(const Uint8* pixels, Vector2u size, Vector2u hotspot);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
/// \brief Create a native system cursor
|
||||||
|
///
|
||||||
|
/// Refer to sf::Cursor::loadFromSystem().
|
||||||
|
///
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
bool loadFromSystem(Cursor::Type type);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
friend class WindowImplWin32;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
// Member data
|
||||||
|
////////////////////////////////////////////////////////////
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace priv
|
||||||
|
|
||||||
|
} // namespace sf
|
||||||
|
|
||||||
|
#endif // SFML_CUSROSIMPLWIN32_HPP
|
||||||
|
|
@ -224,7 +224,7 @@ m_cursorGrabbed (m_fullscreen)
|
|||||||
|
|
||||||
++handleCount;
|
++handleCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// By default, the OS limits the size of the window the the desktop size,
|
// By default, the OS limits the size of the window the the desktop size,
|
||||||
// we have to resize it after creation to apply the real size
|
// we have to resize it after creation to apply the real size
|
||||||
setSize(Vector2u(mode.width, mode.height));
|
setSize(Vector2u(mode.width, mode.height));
|
||||||
@ -418,48 +418,8 @@ void WindowImplWin32::setMouseCursorGrabbed(bool grabbed)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplWin32::setMouseCursor(Window::Cursor cursor)
|
void WindowImplWin32::setMouseCursor(const CursorImpl& cursor)
|
||||||
{
|
{
|
||||||
HCURSOR newCursor = NULL;
|
|
||||||
|
|
||||||
switch (cursor)
|
|
||||||
{
|
|
||||||
case Window::Arrow: newCursor = LoadCursor(NULL, IDC_ARROW); break;
|
|
||||||
case Window::ArrowWait: newCursor = LoadCursor(NULL, IDC_APPSTARTING); break;
|
|
||||||
case Window::Wait: newCursor = LoadCursor(NULL, IDC_WAIT); break;
|
|
||||||
case Window::Text: newCursor = LoadCursor(NULL, IDC_IBEAM); break;
|
|
||||||
case Window::Hand: newCursor = LoadCursor(NULL, IDC_HAND); break;
|
|
||||||
case Window::SizeHorizontal: newCursor = LoadCursor(NULL, IDC_SIZEWE); break;
|
|
||||||
case Window::SizeVertical: newCursor = LoadCursor(NULL, IDC_SIZENS); break;
|
|
||||||
case Window::SizeTopLeftBottomRight: newCursor = LoadCursor(NULL, IDC_SIZENWSE); break;
|
|
||||||
case Window::SizeBottomLeftTopRight: newCursor = LoadCursor(NULL, IDC_SIZENESW); break;
|
|
||||||
case Window::SizeAll: newCursor = LoadCursor(NULL, IDC_SIZEALL); break;
|
|
||||||
case Window::Cross: newCursor = LoadCursor(NULL, IDC_CROSS); break;
|
|
||||||
case Window::Help: newCursor = LoadCursor(NULL, IDC_HELP); break;
|
|
||||||
case Window::NotAllowed: newCursor = LoadCursor(NULL, IDC_NO); break;
|
|
||||||
default: return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a copy of the shared system cursor that we can destroy later
|
|
||||||
newCursor = CopyCursor(newCursor);
|
|
||||||
|
|
||||||
if (!newCursor)
|
|
||||||
{
|
|
||||||
err() << "Could not create copy of a system cursor" << std::endl;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
HCURSOR oldCursor = m_loadedCursor;
|
|
||||||
m_loadedCursor = newCursor;
|
|
||||||
|
|
||||||
if (m_cursor)
|
|
||||||
{
|
|
||||||
m_cursor = m_loadedCursor;
|
|
||||||
SetCursor(m_cursor);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldCursor)
|
|
||||||
DestroyCursor(oldCursor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -159,19 +159,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor);
|
virtual void setMouseCursor(const CursorImpl& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -297,18 +297,10 @@ void Window::setMouseCursorGrabbed(bool grabbed)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void Window::setMouseCursor(Cursor cursor)
|
void Window::setMouseCursor(const Cursor& cursor)
|
||||||
{
|
{
|
||||||
if (m_impl)
|
if (m_impl)
|
||||||
m_impl->setMouseCursor(cursor);
|
m_impl->setMouseCursor(cursor.getImpl());
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void Window::setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY)
|
|
||||||
{
|
|
||||||
if (m_impl && pixels && width && height)
|
|
||||||
m_impl->setMouseCursor(pixels, width, height, hotspotX, hotspotY);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@
|
|||||||
#include <SFML/Config.hpp>
|
#include <SFML/Config.hpp>
|
||||||
#include <SFML/System/NonCopyable.hpp>
|
#include <SFML/System/NonCopyable.hpp>
|
||||||
#include <SFML/System/String.hpp>
|
#include <SFML/System/String.hpp>
|
||||||
|
#include <SFML/Window/ContextSettings.hpp>
|
||||||
|
#include <SFML/Window/CursorImpl.hpp>
|
||||||
#include <SFML/Window/Event.hpp>
|
#include <SFML/Window/Event.hpp>
|
||||||
#include <SFML/Window/Joystick.hpp>
|
#include <SFML/Window/Joystick.hpp>
|
||||||
#include <SFML/Window/JoystickImpl.hpp>
|
#include <SFML/Window/JoystickImpl.hpp>
|
||||||
@ -38,7 +40,6 @@
|
|||||||
#include <SFML/Window/SensorImpl.hpp>
|
#include <SFML/Window/SensorImpl.hpp>
|
||||||
#include <SFML/Window/VideoMode.hpp>
|
#include <SFML/Window/VideoMode.hpp>
|
||||||
#include <SFML/Window/WindowHandle.hpp>
|
#include <SFML/Window/WindowHandle.hpp>
|
||||||
#include <SFML/Window/ContextSettings.hpp>
|
|
||||||
#include <SFML/Window/Window.hpp>
|
#include <SFML/Window/Window.hpp>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
#include <set>
|
#include <set>
|
||||||
@ -201,19 +202,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor) = 0;
|
virtual void setMouseCursor(const CursorImpl& cursor) = 0;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY) = 0;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -163,19 +163,7 @@ public:
|
|||||||
/// \param cursor Native system cursor type to display
|
/// \param cursor Native system cursor type to display
|
||||||
///
|
///
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
virtual void setMouseCursor(Window::Cursor cursor);
|
virtual void setMouseCursor(const CursorImpl& cursor);
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
/// \brief Set the displayed cursor to the provided image
|
|
||||||
///
|
|
||||||
/// \param pixels Array of pixels of the image
|
|
||||||
/// \param width Width of the image
|
|
||||||
/// \param height Height of the image
|
|
||||||
/// \param hotspotX X location of the hotspot
|
|
||||||
/// \param hotspotY Y location of the hotspot
|
|
||||||
///
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
virtual void setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY);
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
/// \brief Enable or disable automatic key-repeat
|
/// \brief Enable or disable automatic key-repeat
|
||||||
|
@ -191,14 +191,7 @@ void WindowImplUIKit::setMouseCursorGrabbed(bool grabbed)
|
|||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////
|
||||||
void WindowImplUIKit::setMouseCursor(Window::Cursor cursor)
|
void WindowImplUIKit::setMouseCursor(const CursorImpl& cursor)
|
||||||
{
|
|
||||||
// Not applicable
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////
|
|
||||||
void WindowImplUIKit::setMouseCursor(const Uint8* pixels, unsigned int width, unsigned int height, Uint16 hotspotX, Uint16 hotspotY)
|
|
||||||
{
|
{
|
||||||
// Not applicable
|
// Not applicable
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user