mirror of
https://github.com/glfw/glfw.git
synced 2025-10-04 05:36:35 +00:00
Merge 4a8877bdf2
into 994d8ae54d
This commit is contained in:
commit
96e56d8373
@ -1,5 +1,5 @@
|
|||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* GLFW 3.2 - www.glfw.org
|
* GLFW 3.1 - www.glfw.org
|
||||||
* A library for OpenGL, window and input
|
* A library for OpenGL, window and input
|
||||||
*------------------------------------------------------------------------
|
*------------------------------------------------------------------------
|
||||||
* Copyright (c) 2002-2006 Marcus Geelnard
|
* Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
@ -38,14 +38,6 @@ extern "C" {
|
|||||||
* Doxygen documentation
|
* Doxygen documentation
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
|
||||||
/*! @file glfw3.h
|
|
||||||
* @brief The header of the GLFW 3 API.
|
|
||||||
*
|
|
||||||
* This is the header file of the GLFW 3 API. It defines all its types and
|
|
||||||
* declares all its functions.
|
|
||||||
*
|
|
||||||
* For more information about how to use this file, see @ref build_include.
|
|
||||||
*/
|
|
||||||
/*! @defgroup context Context handling
|
/*! @defgroup context Context handling
|
||||||
*
|
*
|
||||||
* This is the reference documentation for context related functions. For more
|
* This is the reference documentation for context related functions. For more
|
||||||
@ -212,32 +204,14 @@ extern "C" {
|
|||||||
* backward-compatible.
|
* backward-compatible.
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
#define GLFW_VERSION_MINOR 2
|
#define GLFW_VERSION_MINOR 1
|
||||||
/*! @brief The revision number of the GLFW library.
|
/*! @brief The revision number of the GLFW library.
|
||||||
*
|
*
|
||||||
* This is incremented when a bug fix release is made that does not contain any
|
* This is incremented when a bug fix release is made that does not contain any
|
||||||
* API changes.
|
* API changes.
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
*/
|
*/
|
||||||
#define GLFW_VERSION_REVISION 0
|
#define GLFW_VERSION_REVISION 2
|
||||||
/*! @} */
|
|
||||||
|
|
||||||
/*! @name Boolean values
|
|
||||||
* @{ */
|
|
||||||
/*! @brief One.
|
|
||||||
*
|
|
||||||
* One. Seriously. You don't _need_ to use this symbol in your code. It's
|
|
||||||
* just semantic sugar for the number 1. You can use `1` or `true` or `_True`
|
|
||||||
* or `GL_TRUE` or whatever you want.
|
|
||||||
*/
|
|
||||||
#define GLFW_TRUE 1
|
|
||||||
/*! @brief Zero.
|
|
||||||
*
|
|
||||||
* Zero. Seriously. You don't _need_ to use this symbol in your code. It's
|
|
||||||
* just just semantic sugar for the number 0. You can use `0` or `false` or
|
|
||||||
* `_False` or `GL_FALSE` or whatever you want.
|
|
||||||
*/
|
|
||||||
#define GLFW_FALSE 0
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
/*! @name Key and button actions
|
/*! @name Key and button actions
|
||||||
@ -414,7 +388,6 @@ extern "C" {
|
|||||||
#define GLFW_KEY_RIGHT_ALT 346
|
#define GLFW_KEY_RIGHT_ALT 346
|
||||||
#define GLFW_KEY_RIGHT_SUPER 347
|
#define GLFW_KEY_RIGHT_SUPER 347
|
||||||
#define GLFW_KEY_MENU 348
|
#define GLFW_KEY_MENU 348
|
||||||
|
|
||||||
#define GLFW_KEY_LAST GLFW_KEY_MENU
|
#define GLFW_KEY_LAST GLFW_KEY_MENU
|
||||||
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
@ -614,15 +587,6 @@ extern "C" {
|
|||||||
* the user, as appropriate.
|
* the user, as appropriate.
|
||||||
*/
|
*/
|
||||||
#define GLFW_FORMAT_UNAVAILABLE 0x00010009
|
#define GLFW_FORMAT_UNAVAILABLE 0x00010009
|
||||||
/*! @brief The specified window does not have an OpenGL or OpenGL ES context.
|
|
||||||
*
|
|
||||||
* A window that does not have an OpenGL or OpenGL ES context was passed to
|
|
||||||
* a function that requires it to have one.
|
|
||||||
*
|
|
||||||
* @par Analysis
|
|
||||||
* Application programmer error. Fix the offending call.
|
|
||||||
*/
|
|
||||||
#define GLFW_NO_WINDOW_CONTEXT 0x0001000A
|
|
||||||
/*! @} */
|
/*! @} */
|
||||||
|
|
||||||
#define GLFW_FOCUSED 0x00020001
|
#define GLFW_FOCUSED 0x00020001
|
||||||
@ -659,9 +623,7 @@ extern "C" {
|
|||||||
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007
|
#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007
|
||||||
#define GLFW_OPENGL_PROFILE 0x00022008
|
#define GLFW_OPENGL_PROFILE 0x00022008
|
||||||
#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009
|
#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009
|
||||||
#define GLFW_CONTEXT_NO_ERROR 0x0002200A
|
|
||||||
|
|
||||||
#define GLFW_NO_API 0
|
|
||||||
#define GLFW_OPENGL_API 0x00030001
|
#define GLFW_OPENGL_API 0x00030001
|
||||||
#define GLFW_OPENGL_ES_API 0x00030002
|
#define GLFW_OPENGL_ES_API 0x00030002
|
||||||
|
|
||||||
@ -739,9 +701,6 @@ extern "C" {
|
|||||||
* Generic function pointer used for returning client API function pointers
|
* Generic function pointer used for returning client API function pointers
|
||||||
* without forcing a cast from a regular pointer.
|
* without forcing a cast from a regular pointer.
|
||||||
*
|
*
|
||||||
* @sa @ref context_glext
|
|
||||||
* @sa glfwGetProcAddress
|
|
||||||
*
|
|
||||||
* @ingroup context
|
* @ingroup context
|
||||||
*/
|
*/
|
||||||
typedef void (*GLFWglproc)(void);
|
typedef void (*GLFWglproc)(void);
|
||||||
@ -750,8 +709,6 @@ typedef void (*GLFWglproc)(void);
|
|||||||
*
|
*
|
||||||
* Opaque monitor object.
|
* Opaque monitor object.
|
||||||
*
|
*
|
||||||
* @see @ref monitor_object
|
|
||||||
*
|
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
*/
|
*/
|
||||||
typedef struct GLFWmonitor GLFWmonitor;
|
typedef struct GLFWmonitor GLFWmonitor;
|
||||||
@ -760,8 +717,6 @@ typedef struct GLFWmonitor GLFWmonitor;
|
|||||||
*
|
*
|
||||||
* Opaque window object.
|
* Opaque window object.
|
||||||
*
|
*
|
||||||
* @see @ref window_object
|
|
||||||
*
|
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
*/
|
*/
|
||||||
typedef struct GLFWwindow GLFWwindow;
|
typedef struct GLFWwindow GLFWwindow;
|
||||||
@ -770,8 +725,6 @@ typedef struct GLFWwindow GLFWwindow;
|
|||||||
*
|
*
|
||||||
* Opaque cursor object.
|
* Opaque cursor object.
|
||||||
*
|
*
|
||||||
* @see @ref cursor_object
|
|
||||||
*
|
|
||||||
* @ingroup cursor
|
* @ingroup cursor
|
||||||
*/
|
*/
|
||||||
typedef struct GLFWcursor GLFWcursor;
|
typedef struct GLFWcursor GLFWcursor;
|
||||||
@ -783,7 +736,6 @@ typedef struct GLFWcursor GLFWcursor;
|
|||||||
* @param[in] error An [error code](@ref errors).
|
* @param[in] error An [error code](@ref errors).
|
||||||
* @param[in] description A UTF-8 encoded string describing the error.
|
* @param[in] description A UTF-8 encoded string describing the error.
|
||||||
*
|
*
|
||||||
* @sa @ref error_handling
|
|
||||||
* @sa glfwSetErrorCallback
|
* @sa glfwSetErrorCallback
|
||||||
*
|
*
|
||||||
* @ingroup init
|
* @ingroup init
|
||||||
@ -800,7 +752,6 @@ typedef void (* GLFWerrorfun)(int,const char*);
|
|||||||
* @param[in] ypos The new y-coordinate, in screen coordinates, of the
|
* @param[in] ypos The new y-coordinate, in screen coordinates, of the
|
||||||
* upper-left corner of the client area of the window.
|
* upper-left corner of the client area of the window.
|
||||||
*
|
*
|
||||||
* @sa @ref window_pos
|
|
||||||
* @sa glfwSetWindowPosCallback
|
* @sa glfwSetWindowPosCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -815,7 +766,6 @@ typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int);
|
|||||||
* @param[in] width The new width, in screen coordinates, of the window.
|
* @param[in] width The new width, in screen coordinates, of the window.
|
||||||
* @param[in] height The new height, in screen coordinates, of the window.
|
* @param[in] height The new height, in screen coordinates, of the window.
|
||||||
*
|
*
|
||||||
* @sa @ref window_size
|
|
||||||
* @sa glfwSetWindowSizeCallback
|
* @sa glfwSetWindowSizeCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -828,7 +778,6 @@ typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int);
|
|||||||
*
|
*
|
||||||
* @param[in] window The window that the user attempted to close.
|
* @param[in] window The window that the user attempted to close.
|
||||||
*
|
*
|
||||||
* @sa @ref window_close
|
|
||||||
* @sa glfwSetWindowCloseCallback
|
* @sa glfwSetWindowCloseCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -841,7 +790,6 @@ typedef void (* GLFWwindowclosefun)(GLFWwindow*);
|
|||||||
*
|
*
|
||||||
* @param[in] window The window whose content needs to be refreshed.
|
* @param[in] window The window whose content needs to be refreshed.
|
||||||
*
|
*
|
||||||
* @sa @ref window_refresh
|
|
||||||
* @sa glfwSetWindowRefreshCallback
|
* @sa glfwSetWindowRefreshCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -853,10 +801,9 @@ typedef void (* GLFWwindowrefreshfun)(GLFWwindow*);
|
|||||||
* This is the function signature for window focus callback functions.
|
* This is the function signature for window focus callback functions.
|
||||||
*
|
*
|
||||||
* @param[in] window The window that gained or lost input focus.
|
* @param[in] window The window that gained or lost input focus.
|
||||||
* @param[in] focused `GLFW_TRUE` if the window was given input focus, or
|
* @param[in] focused `GL_TRUE` if the window was given input focus, or
|
||||||
* `GLFW_FALSE` if it lost it.
|
* `GL_FALSE` if it lost it.
|
||||||
*
|
*
|
||||||
* @sa @ref window_focus
|
|
||||||
* @sa glfwSetWindowFocusCallback
|
* @sa glfwSetWindowFocusCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -869,10 +816,9 @@ typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int);
|
|||||||
* functions.
|
* functions.
|
||||||
*
|
*
|
||||||
* @param[in] window The window that was iconified or restored.
|
* @param[in] window The window that was iconified or restored.
|
||||||
* @param[in] iconified `GLFW_TRUE` if the window was iconified, or
|
* @param[in] iconified `GL_TRUE` if the window was iconified, or `GL_FALSE`
|
||||||
* `GLFW_FALSE` if it was restored.
|
* if it was restored.
|
||||||
*
|
*
|
||||||
* @sa @ref window_iconify
|
|
||||||
* @sa glfwSetWindowIconifyCallback
|
* @sa glfwSetWindowIconifyCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -888,7 +834,6 @@ typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int);
|
|||||||
* @param[in] width The new width, in pixels, of the framebuffer.
|
* @param[in] width The new width, in pixels, of the framebuffer.
|
||||||
* @param[in] height The new height, in pixels, of the framebuffer.
|
* @param[in] height The new height, in pixels, of the framebuffer.
|
||||||
*
|
*
|
||||||
* @sa @ref window_fbsize
|
|
||||||
* @sa glfwSetFramebufferSizeCallback
|
* @sa glfwSetFramebufferSizeCallback
|
||||||
*
|
*
|
||||||
* @ingroup window
|
* @ingroup window
|
||||||
@ -906,7 +851,6 @@ typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int);
|
|||||||
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
||||||
* held down.
|
* held down.
|
||||||
*
|
*
|
||||||
* @sa @ref input_mouse_button
|
|
||||||
* @sa glfwSetMouseButtonCallback
|
* @sa glfwSetMouseButtonCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -921,7 +865,6 @@ typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int);
|
|||||||
* @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor.
|
* @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor.
|
||||||
* @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor.
|
* @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor.
|
||||||
*
|
*
|
||||||
* @sa @ref cursor_pos
|
|
||||||
* @sa glfwSetCursorPosCallback
|
* @sa glfwSetCursorPosCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -933,10 +876,9 @@ typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double);
|
|||||||
* This is the function signature for cursor enter/leave callback functions.
|
* This is the function signature for cursor enter/leave callback functions.
|
||||||
*
|
*
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] entered `GLFW_TRUE` if the cursor entered the window's client
|
* @param[in] entered `GL_TRUE` if the cursor entered the window's client
|
||||||
* area, or `GLFW_FALSE` if it left it.
|
* area, or `GL_FALSE` if it left it.
|
||||||
*
|
*
|
||||||
* @sa @ref cursor_enter
|
|
||||||
* @sa glfwSetCursorEnterCallback
|
* @sa glfwSetCursorEnterCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -951,13 +893,23 @@ typedef void (* GLFWcursorenterfun)(GLFWwindow*,int);
|
|||||||
* @param[in] xoffset The scroll offset along the x-axis.
|
* @param[in] xoffset The scroll offset along the x-axis.
|
||||||
* @param[in] yoffset The scroll offset along the y-axis.
|
* @param[in] yoffset The scroll offset along the y-axis.
|
||||||
*
|
*
|
||||||
* @sa @ref scrolling
|
|
||||||
* @sa glfwSetScrollCallback
|
* @sa glfwSetScrollCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
*/
|
*/
|
||||||
typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
|
typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
|
||||||
|
|
||||||
|
/*! @brief The function signature for menu item callbacks
|
||||||
|
*
|
||||||
|
* This is the function signature for menu item callbacks
|
||||||
|
*
|
||||||
|
* @param[in] window The window that received the event.
|
||||||
|
* @param[in] id The menu item ID that was selected
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef void (* GLFWmenufun)(GLFWwindow*,int);
|
||||||
|
|
||||||
|
|
||||||
/*! @brief The function signature for keyboard key callbacks.
|
/*! @brief The function signature for keyboard key callbacks.
|
||||||
*
|
*
|
||||||
* This is the function signature for keyboard key callback functions.
|
* This is the function signature for keyboard key callback functions.
|
||||||
@ -969,7 +921,6 @@ typedef void (* GLFWscrollfun)(GLFWwindow*,double,double);
|
|||||||
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
||||||
* held down.
|
* held down.
|
||||||
*
|
*
|
||||||
* @sa @ref input_key
|
|
||||||
* @sa glfwSetKeyCallback
|
* @sa glfwSetKeyCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -983,7 +934,6 @@ typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
|
|||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] codepoint The Unicode code point of the character.
|
* @param[in] codepoint The Unicode code point of the character.
|
||||||
*
|
*
|
||||||
* @sa @ref input_char
|
|
||||||
* @sa glfwSetCharCallback
|
* @sa glfwSetCharCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -1002,7 +952,6 @@ typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int);
|
|||||||
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
* @param[in] mods Bit field describing which [modifier keys](@ref mods) were
|
||||||
* held down.
|
* held down.
|
||||||
*
|
*
|
||||||
* @sa @ref input_char
|
|
||||||
* @sa glfwSetCharModsCallback
|
* @sa glfwSetCharModsCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -1017,7 +966,6 @@ typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int);
|
|||||||
* @param[in] count The number of dropped files.
|
* @param[in] count The number of dropped files.
|
||||||
* @param[in] paths The UTF-8 encoded file and/or directory path names.
|
* @param[in] paths The UTF-8 encoded file and/or directory path names.
|
||||||
*
|
*
|
||||||
* @sa @ref path_drop
|
|
||||||
* @sa glfwSetDropCallback
|
* @sa glfwSetDropCallback
|
||||||
*
|
*
|
||||||
* @ingroup input
|
* @ingroup input
|
||||||
@ -1031,7 +979,6 @@ typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**);
|
|||||||
* @param[in] monitor The monitor that was connected or disconnected.
|
* @param[in] monitor The monitor that was connected or disconnected.
|
||||||
* @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.
|
* @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`.
|
||||||
*
|
*
|
||||||
* @sa @ref monitor_event
|
|
||||||
* @sa glfwSetMonitorCallback
|
* @sa glfwSetMonitorCallback
|
||||||
*
|
*
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
@ -1042,9 +989,6 @@ typedef void (* GLFWmonitorfun)(GLFWmonitor*,int);
|
|||||||
*
|
*
|
||||||
* This describes a single video mode.
|
* This describes a single video mode.
|
||||||
*
|
*
|
||||||
* @sa @ref monitor_modes
|
|
||||||
* @sa glfwGetVideoMode glfwGetVideoModes
|
|
||||||
*
|
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
*/
|
*/
|
||||||
typedef struct GLFWvidmode
|
typedef struct GLFWvidmode
|
||||||
@ -1073,7 +1017,6 @@ typedef struct GLFWvidmode
|
|||||||
*
|
*
|
||||||
* This describes the gamma ramp for a monitor.
|
* This describes the gamma ramp for a monitor.
|
||||||
*
|
*
|
||||||
* @sa @ref monitor_gamma
|
|
||||||
* @sa glfwGetGammaRamp glfwSetGammaRamp
|
* @sa glfwGetGammaRamp glfwSetGammaRamp
|
||||||
*
|
*
|
||||||
* @ingroup monitor
|
* @ingroup monitor
|
||||||
@ -1095,8 +1038,6 @@ typedef struct GLFWgammaramp
|
|||||||
} GLFWgammaramp;
|
} GLFWgammaramp;
|
||||||
|
|
||||||
/*! @brief Image data.
|
/*! @brief Image data.
|
||||||
*
|
|
||||||
* @sa @ref cursor_custom
|
|
||||||
*/
|
*/
|
||||||
typedef struct GLFWimage
|
typedef struct GLFWimage
|
||||||
{
|
{
|
||||||
@ -1127,9 +1068,9 @@ typedef struct GLFWimage
|
|||||||
* succeeds, you should call @ref glfwTerminate before the application exits.
|
* succeeds, you should call @ref glfwTerminate before the application exits.
|
||||||
*
|
*
|
||||||
* Additional calls to this function after successful initialization but before
|
* Additional calls to this function after successful initialization but before
|
||||||
* termination will return `GLFW_TRUE` immediately.
|
* termination will return `GL_TRUE` immediately.
|
||||||
*
|
*
|
||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an
|
* @return `GL_TRUE` if successful, or `GL_FALSE` if an
|
||||||
* [error](@ref error_handling) occurred.
|
* [error](@ref error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @remarks __OS X:__ This function will change the current directory of the
|
* @remarks __OS X:__ This function will change the current directory of the
|
||||||
@ -1418,6 +1359,9 @@ GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor);
|
|||||||
* @return The previously set callback, or `NULL` if no callback was set or the
|
* @return The previously set callback, or `NULL` if no callback was set or the
|
||||||
* library had not been [initialized](@ref intro_init).
|
* library had not been [initialized](@ref intro_init).
|
||||||
*
|
*
|
||||||
|
* @bug __X11:__ This callback is not yet called on monitor configuration
|
||||||
|
* changes.
|
||||||
|
*
|
||||||
* @par Thread Safety
|
* @par Thread Safety
|
||||||
* This function may only be called from the main thread.
|
* This function may only be called from the main thread.
|
||||||
*
|
*
|
||||||
@ -1894,77 +1838,6 @@ GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height);
|
||||||
|
|
||||||
/*! @brief Sets the size limits of the specified window.
|
|
||||||
*
|
|
||||||
* This function sets the size limits of the client area of the specified
|
|
||||||
* window. If the window is full screen or not resizable, this function does
|
|
||||||
* nothing.
|
|
||||||
*
|
|
||||||
* The size limits are applied immediately and may cause the window to be
|
|
||||||
* resized.
|
|
||||||
*
|
|
||||||
* @param[in] window The window to set limits for.
|
|
||||||
* @param[in] minwidth The minimum width, in screen coordinates, of the client
|
|
||||||
* area, or `GLFW_DONT_CARE`.
|
|
||||||
* @param[in] minheight The minimum height, in screen coordinates, of the
|
|
||||||
* client area, or `GLFW_DONT_CARE`.
|
|
||||||
* @param[in] maxwidth The maximum width, in screen coordinates, of the client
|
|
||||||
* area, or `GLFW_DONT_CARE`.
|
|
||||||
* @param[in] maxheight The maximum height, in screen coordinates, of the
|
|
||||||
* client area, or `GLFW_DONT_CARE`.
|
|
||||||
*
|
|
||||||
* @remarks If you set size limits and an aspect ratio that conflict, the
|
|
||||||
* results are undefined.
|
|
||||||
*
|
|
||||||
* @par Thread Safety
|
|
||||||
* This function may only be called from the main thread.
|
|
||||||
*
|
|
||||||
* @sa @ref window_sizelimits
|
|
||||||
* @sa glfwSetWindowAspectRatio
|
|
||||||
*
|
|
||||||
* @since Added in GLFW 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup window
|
|
||||||
*/
|
|
||||||
GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
|
||||||
|
|
||||||
/*! @brief Sets the aspect ratio of the specified window.
|
|
||||||
*
|
|
||||||
* This function sets the required aspect ratio of the client area of the
|
|
||||||
* specified window. If the window is full screen or not resizable, this
|
|
||||||
* function does nothing.
|
|
||||||
*
|
|
||||||
* The aspect ratio is specified as a numerator and a denominator and both
|
|
||||||
* values must be greater than zero. For example, the common 16:9 aspect ratio
|
|
||||||
* is specified as 16 and 9, respectively.
|
|
||||||
*
|
|
||||||
* If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect
|
|
||||||
* ratio limit is disabled.
|
|
||||||
*
|
|
||||||
* The aspect ratio is applied immediately and may cause the window to be
|
|
||||||
* resized.
|
|
||||||
*
|
|
||||||
* @param[in] window The window to set limits for.
|
|
||||||
* @param[in] numer The numerator of the desired aspect ratio, or
|
|
||||||
* `GLFW_DONT_CARE`.
|
|
||||||
* @param[in] denom The denominator of the desired aspect ratio, or
|
|
||||||
* `GLFW_DONT_CARE`.
|
|
||||||
*
|
|
||||||
* @remarks If you set size limits and an aspect ratio that conflict, the
|
|
||||||
* results are undefined.
|
|
||||||
*
|
|
||||||
* @par Thread Safety
|
|
||||||
* This function may only be called from the main thread.
|
|
||||||
*
|
|
||||||
* @sa @ref window_sizelimits
|
|
||||||
* @sa glfwSetWindowSizeLimits
|
|
||||||
*
|
|
||||||
* @since Added in GLFW 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup window
|
|
||||||
*/
|
|
||||||
GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom);
|
|
||||||
|
|
||||||
/*! @brief Sets the size of the client area of the specified window.
|
/*! @brief Sets the size of the client area of the specified window.
|
||||||
*
|
*
|
||||||
* This function sets the size, in screen coordinates, of the client area of
|
* This function sets the size, in screen coordinates, of the client area of
|
||||||
@ -2558,20 +2431,20 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
* and unlimited cursor movement. This is useful for implementing for
|
* and unlimited cursor movement. This is useful for implementing for
|
||||||
* example 3D camera controls.
|
* example 3D camera controls.
|
||||||
*
|
*
|
||||||
* If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to
|
* If the mode is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to
|
||||||
* enable sticky keys, or `GLFW_FALSE` to disable it. If sticky keys are
|
* enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are
|
||||||
* enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS`
|
* enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS`
|
||||||
* the next time it is called even if the key had been released before the
|
* the next time it is called even if the key had been released before the
|
||||||
* call. This is useful when you are only interested in whether keys have been
|
* call. This is useful when you are only interested in whether keys have been
|
||||||
* pressed but not when or in which order.
|
* pressed but not when or in which order.
|
||||||
*
|
*
|
||||||
* If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either
|
* If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either
|
||||||
* `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it.
|
* `GL_TRUE` to enable sticky mouse buttons, or `GL_FALSE` to disable it. If
|
||||||
* If sticky mouse buttons are enabled, a mouse button press will ensure that
|
* sticky mouse buttons are enabled, a mouse button press will ensure that @ref
|
||||||
* @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even
|
* glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even if
|
||||||
* if the mouse button had been released before the call. This is useful when
|
* the mouse button had been released before the call. This is useful when you
|
||||||
* you are only interested in whether mouse buttons have been pressed but not
|
* are only interested in whether mouse buttons have been pressed but not when
|
||||||
* when or in which order.
|
* or in which order.
|
||||||
*
|
*
|
||||||
* @param[in] window The window whose input mode to set.
|
* @param[in] window The window whose input mode to set.
|
||||||
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or
|
* @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or
|
||||||
@ -2589,33 +2462,6 @@ GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);
|
GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value);
|
||||||
|
|
||||||
/*! @brief Returns the localized name of the specified printable key.
|
|
||||||
*
|
|
||||||
* This function returns the localized name of the specified printable key.
|
|
||||||
*
|
|
||||||
* If the key is `GLFW_KEY_UNKNOWN`, the scancode is used, otherwise the
|
|
||||||
* scancode is ignored.
|
|
||||||
*
|
|
||||||
* @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`.
|
|
||||||
* @param[in] scancode The scancode of the key to query.
|
|
||||||
* @return The localized name of the key.
|
|
||||||
*
|
|
||||||
* @par Pointer Lifetime
|
|
||||||
* The returned string is allocated and freed by GLFW. You should not free it
|
|
||||||
* yourself. It is valid until the next call to @ref glfwGetKeyName, or until
|
|
||||||
* the library is terminated.
|
|
||||||
*
|
|
||||||
* @par Thread Safety
|
|
||||||
* This function may only be called from the main thread.
|
|
||||||
*
|
|
||||||
* @sa @ref input_key_name
|
|
||||||
*
|
|
||||||
* @since Added in GLFW 3.2.
|
|
||||||
*
|
|
||||||
* @ingroup input
|
|
||||||
*/
|
|
||||||
GLFWAPI const char* glfwGetKeyName(int key, int scancode);
|
|
||||||
|
|
||||||
/*! @brief Returns the last reported state of a keyboard key for the specified
|
/*! @brief Returns the last reported state of a keyboard key for the specified
|
||||||
* window.
|
* window.
|
||||||
*
|
*
|
||||||
@ -2635,8 +2481,6 @@ GLFWAPI const char* glfwGetKeyName(int key, int scancode);
|
|||||||
* The [modifier key bit masks](@ref mods) are not key tokens and cannot be
|
* The [modifier key bit masks](@ref mods) are not key tokens and cannot be
|
||||||
* used with this function.
|
* used with this function.
|
||||||
*
|
*
|
||||||
* __Do not use this function__ to implement [text input](@ref input_char).
|
|
||||||
*
|
|
||||||
* @param[in] window The desired window.
|
* @param[in] window The desired window.
|
||||||
* @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is
|
* @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is
|
||||||
* not a valid key for this function.
|
* not a valid key for this function.
|
||||||
@ -2873,6 +2717,19 @@ GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor);
|
|||||||
*/
|
*/
|
||||||
GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
|
GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor);
|
||||||
|
|
||||||
|
|
||||||
|
/*! @brief Sets the menu item callback
|
||||||
|
*
|
||||||
|
* This function sets the menu item callback of the specified window,
|
||||||
|
* which is called when a menu item is selected.
|
||||||
|
*
|
||||||
|
* @param[in] window The window whose callback to set
|
||||||
|
* @param[in] cbfun The new menu item callback
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLFWAPI GLFWmenufun glfwSetMenuCallback(GLFWwindow* window, GLFWmenufun cbfun);
|
||||||
|
|
||||||
|
|
||||||
/*! @brief Sets the key callback.
|
/*! @brief Sets the key callback.
|
||||||
*
|
*
|
||||||
* This function sets the key callback of the specified window, which is called
|
* This function sets the key callback of the specified window, which is called
|
||||||
@ -3124,7 +2981,7 @@ GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun);
|
|||||||
* This function returns whether the specified joystick is present.
|
* This function returns whether the specified joystick is present.
|
||||||
*
|
*
|
||||||
* @param[in] joy The [joystick](@ref joysticks) to query.
|
* @param[in] joy The [joystick](@ref joysticks) to query.
|
||||||
* @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise.
|
* @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @par Thread Safety
|
||||||
* This function may only be called from the main thread.
|
* This function may only be called from the main thread.
|
||||||
@ -3330,10 +3187,6 @@ GLFWAPI void glfwSetTime(double time);
|
|||||||
* whether a context performs this flush by setting the
|
* whether a context performs this flush by setting the
|
||||||
* [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint.
|
* [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint.
|
||||||
*
|
*
|
||||||
* The specified window must have an OpenGL or OpenGL ES context. Specifying
|
|
||||||
* a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT
|
|
||||||
* error.
|
|
||||||
*
|
|
||||||
* @param[in] window The window whose context to make current, or `NULL` to
|
* @param[in] window The window whose context to make current, or `NULL` to
|
||||||
* detach the current context.
|
* detach the current context.
|
||||||
*
|
*
|
||||||
@ -3375,10 +3228,6 @@ GLFWAPI GLFWwindow* glfwGetCurrentContext(void);
|
|||||||
* the swap interval is greater than zero, the GPU driver waits the specified
|
* the swap interval is greater than zero, the GPU driver waits the specified
|
||||||
* number of screen updates before swapping the buffers.
|
* number of screen updates before swapping the buffers.
|
||||||
*
|
*
|
||||||
* The specified window must have an OpenGL or OpenGL ES context. Specifying
|
|
||||||
* a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT
|
|
||||||
* error.
|
|
||||||
*
|
|
||||||
* @param[in] window The window whose buffers to swap.
|
* @param[in] window The window whose buffers to swap.
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @par Thread Safety
|
||||||
@ -3454,8 +3303,7 @@ GLFWAPI void glfwSwapInterval(int interval);
|
|||||||
* a context, so there is no danger in doing this.
|
* a context, so there is no danger in doing this.
|
||||||
*
|
*
|
||||||
* @param[in] extension The ASCII encoded name of the extension.
|
* @param[in] extension The ASCII encoded name of the extension.
|
||||||
* @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE`
|
* @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise.
|
||||||
* otherwise.
|
|
||||||
*
|
*
|
||||||
* @par Thread Safety
|
* @par Thread Safety
|
||||||
* This function may be called from any thread.
|
* This function may be called from any thread.
|
||||||
@ -3480,8 +3328,8 @@ GLFWAPI int glfwExtensionSupported(const char* extension);
|
|||||||
* without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.
|
* without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error.
|
||||||
*
|
*
|
||||||
* @param[in] procname The ASCII encoded name of the function.
|
* @param[in] procname The ASCII encoded name of the function.
|
||||||
* @return The address of the function, or `NULL` if an
|
* @return The address of the function, or `NULL` if an [error](@ref
|
||||||
* [error](@ref error_handling) occurred.
|
* error_handling) occurred.
|
||||||
*
|
*
|
||||||
* @remarks The address of a given function is not guaranteed to be the same
|
* @remarks The address of a given function is not guaranteed to be the same
|
||||||
* between contexts.
|
* between contexts.
|
||||||
|
50
src/input.c
50
src/input.c
@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.2 - www.glfw.org
|
// GLFW 3.1 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
@ -78,7 +78,7 @@ static void setCursorMode(_GLFWwindow* window, int newMode)
|
|||||||
_glfwPlatformSetCursorPos(window, width / 2, height / 2);
|
_glfwPlatformSetCursorPos(window, width / 2, height / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwPlatformSetCursorMode(window, window->cursorMode);
|
_glfwPlatformApplyCursorMode(window);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,13 +135,13 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
|
|||||||
{
|
{
|
||||||
if (key >= 0 && key <= GLFW_KEY_LAST)
|
if (key >= 0 && key <= GLFW_KEY_LAST)
|
||||||
{
|
{
|
||||||
GLFWbool repeated = GLFW_FALSE;
|
GLboolean repeated = GL_FALSE;
|
||||||
|
|
||||||
if (action == GLFW_RELEASE && window->keys[key] == GLFW_RELEASE)
|
if (action == GLFW_RELEASE && window->keys[key] == GLFW_RELEASE)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (action == GLFW_PRESS && window->keys[key] == GLFW_PRESS)
|
if (action == GLFW_PRESS && window->keys[key] == GLFW_PRESS)
|
||||||
repeated = GLFW_TRUE;
|
repeated = GL_TRUE;
|
||||||
|
|
||||||
if (action == GLFW_RELEASE && window->stickyKeys)
|
if (action == GLFW_RELEASE && window->stickyKeys)
|
||||||
window->keys[key] = _GLFW_STICK;
|
window->keys[key] = _GLFW_STICK;
|
||||||
@ -156,7 +156,14 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
|
|||||||
window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);
|
window->callbacks.key((GLFWwindow*) window, key, scancode, action, mods);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain)
|
//EDIT
|
||||||
|
void _glfwInputMenuItem(_GLFWwindow* window, int id)
|
||||||
|
{
|
||||||
|
if (window->callbacks.menuitem)
|
||||||
|
window->callbacks.menuitem((GLFWwindow*)window, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, int plain)
|
||||||
{
|
{
|
||||||
if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
|
if (codepoint < 32 || (codepoint > 126 && codepoint < 160))
|
||||||
return;
|
return;
|
||||||
@ -210,7 +217,7 @@ void _glfwInputCursorMotion(_GLFWwindow* window, double x, double y)
|
|||||||
window->callbacks.cursorPos((GLFWwindow*) window, x, y);
|
window->callbacks.cursorPos((GLFWwindow*) window, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered)
|
void _glfwInputCursorEnter(_GLFWwindow* window, int entered)
|
||||||
{
|
{
|
||||||
if (window->callbacks.cursorEnter)
|
if (window->callbacks.cursorEnter)
|
||||||
window->callbacks.cursorEnter((GLFWwindow*) window, entered);
|
window->callbacks.cursorEnter((GLFWwindow*) window, entered);
|
||||||
@ -223,18 +230,6 @@ void _glfwInputDrop(_GLFWwindow* window, int count, const char** paths)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
////// GLFW internal API //////
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
GLFWbool _glfwIsPrintable(int key)
|
|
||||||
{
|
|
||||||
return (key >= GLFW_KEY_APOSTROPHE && key <= GLFW_KEY_WORLD_2) ||
|
|
||||||
(key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_ADD) ||
|
|
||||||
key == GLFW_KEY_KP_EQUAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
////// GLFW public API //////
|
////// GLFW public API //////
|
||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
@ -271,10 +266,10 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
|||||||
setCursorMode(window, value);
|
setCursorMode(window, value);
|
||||||
break;
|
break;
|
||||||
case GLFW_STICKY_KEYS:
|
case GLFW_STICKY_KEYS:
|
||||||
setStickyKeys(window, value ? GLFW_TRUE : GLFW_FALSE);
|
setStickyKeys(window, value ? GL_TRUE : GL_FALSE);
|
||||||
break;
|
break;
|
||||||
case GLFW_STICKY_MOUSE_BUTTONS:
|
case GLFW_STICKY_MOUSE_BUTTONS:
|
||||||
setStickyMouseButtons(window, value ? GLFW_TRUE : GLFW_FALSE);
|
setStickyMouseButtons(window, value ? GL_TRUE : GL_FALSE);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
_glfwInputError(GLFW_INVALID_ENUM, "Invalid input mode");
|
||||||
@ -282,12 +277,6 @@ GLFWAPI void glfwSetInputMode(GLFWwindow* handle, int mode, int value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLFWAPI const char* glfwGetKeyName(int key, int scancode)
|
|
||||||
{
|
|
||||||
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
|
||||||
return _glfwPlatformGetKeyName(key, scancode);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLFWAPI int glfwGetKey(GLFWwindow* handle, int key)
|
GLFWAPI int glfwGetKey(GLFWwindow* handle, int key)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
@ -473,6 +462,15 @@ GLFWAPI void glfwSetCursor(GLFWwindow* windowHandle, GLFWcursor* cursorHandle)
|
|||||||
window->cursor = cursor;
|
window->cursor = cursor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//EDIT
|
||||||
|
GLFWAPI GLFWmenufun glfwSetMenuCallback(GLFWwindow* handle, GLFWmenufun cbfun)
|
||||||
|
{
|
||||||
|
_GLFWwindow* window = (_GLFWwindow*)handle;
|
||||||
|
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
|
||||||
|
_GLFW_SWAP_POINTERS(window->callbacks.menuitem, cbfun);
|
||||||
|
return cbfun;
|
||||||
|
}
|
||||||
|
|
||||||
GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)
|
GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* handle, GLFWkeyfun cbfun)
|
||||||
{
|
{
|
||||||
_GLFWwindow* window = (_GLFWwindow*) handle;
|
_GLFWwindow* window = (_GLFWwindow*) handle;
|
||||||
|
217
src/internal.h
217
src/internal.h
@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.2 - www.glfw.org
|
// GLFW 3.1 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
@ -33,6 +33,8 @@
|
|||||||
#include "glfw_config.h"
|
#include "glfw_config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define _GLFW_VERSION_NUMBER "3.1.2"
|
||||||
|
|
||||||
#if defined(GLFW_INCLUDE_GLCOREARB) || \
|
#if defined(GLFW_INCLUDE_GLCOREARB) || \
|
||||||
defined(GLFW_INCLUDE_ES1) || \
|
defined(GLFW_INCLUDE_ES1) || \
|
||||||
defined(GLFW_INCLUDE_ES2) || \
|
defined(GLFW_INCLUDE_ES2) || \
|
||||||
@ -44,49 +46,41 @@
|
|||||||
#error "You may not define any header option macros when compiling GLFW"
|
#error "You may not define any header option macros when compiling GLFW"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GLFW_INCLUDE_NONE
|
#if defined(_GLFW_USE_OPENGL)
|
||||||
|
// This is the default for glfw3.h
|
||||||
|
#elif defined(_GLFW_USE_GLESV1)
|
||||||
|
#define GLFW_INCLUDE_ES1
|
||||||
|
#elif defined(_GLFW_USE_GLESV2)
|
||||||
|
#define GLFW_INCLUDE_ES2
|
||||||
|
#else
|
||||||
|
#error "No supported client library selected"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Disable the inclusion of the platform glext.h by gl.h to allow proper
|
||||||
|
// inclusion of our own, newer glext.h below
|
||||||
|
#define GL_GLEXT_LEGACY
|
||||||
|
|
||||||
#include "../include/GLFW/glfw3.h"
|
#include "../include/GLFW/glfw3.h"
|
||||||
|
|
||||||
#define GL_VERSION 0x1f02
|
#if defined(_GLFW_USE_OPENGL)
|
||||||
#define GL_NONE 0
|
// This path may need to be changed if you build GLFW using your own setup
|
||||||
#define GL_COLOR_BUFFER_BIT 0x00004000
|
// GLFW comes with its own copy of glext.h since it uses fairly new extensions
|
||||||
#define GL_EXTENSIONS 0x1f03
|
// and not all development environments come with an up-to-date version
|
||||||
#define GL_NUM_EXTENSIONS 0x821d
|
#include "../deps/GL/glext.h"
|
||||||
#define GL_CONTEXT_FLAGS 0x821e
|
#endif
|
||||||
#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001
|
|
||||||
#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002
|
|
||||||
#define GL_CONTEXT_PROFILE_MASK 0x9126
|
|
||||||
#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
|
|
||||||
#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001
|
|
||||||
#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256
|
|
||||||
#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252
|
|
||||||
#define GL_NO_RESET_NOTIFICATION_ARB 0x8261
|
|
||||||
#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82fb
|
|
||||||
#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82fc
|
|
||||||
#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008
|
|
||||||
|
|
||||||
typedef int GLint;
|
|
||||||
typedef unsigned int GLuint;
|
|
||||||
typedef unsigned int GLenum;
|
|
||||||
typedef unsigned int GLbitfield;
|
|
||||||
typedef unsigned char GLubyte;
|
|
||||||
|
|
||||||
typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
|
typedef void (APIENTRY * PFNGLCLEARPROC)(GLbitfield);
|
||||||
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
|
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGPROC)(GLenum);
|
||||||
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
|
typedef void (APIENTRY * PFNGLGETINTEGERVPROC)(GLenum,GLint*);
|
||||||
typedef const GLubyte* (APIENTRY * PFNGLGETSTRINGIPROC)(GLenum,GLuint);
|
|
||||||
|
|
||||||
typedef struct _GLFWwndconfig _GLFWwndconfig;
|
typedef struct _GLFWwndconfig _GLFWwndconfig;
|
||||||
typedef struct _GLFWctxconfig _GLFWctxconfig;
|
typedef struct _GLFWctxconfig _GLFWctxconfig;
|
||||||
typedef struct _GLFWfbconfig _GLFWfbconfig;
|
typedef struct _GLFWfbconfig _GLFWfbconfig;
|
||||||
typedef struct _GLFWcontext _GLFWcontext;
|
|
||||||
typedef struct _GLFWwindow _GLFWwindow;
|
typedef struct _GLFWwindow _GLFWwindow;
|
||||||
typedef struct _GLFWlibrary _GLFWlibrary;
|
typedef struct _GLFWlibrary _GLFWlibrary;
|
||||||
typedef struct _GLFWmonitor _GLFWmonitor;
|
typedef struct _GLFWmonitor _GLFWmonitor;
|
||||||
typedef struct _GLFWcursor _GLFWcursor;
|
typedef struct _GLFWcursor _GLFWcursor;
|
||||||
|
|
||||||
typedef int GLFWbool;
|
|
||||||
|
|
||||||
#if defined(_GLFW_COCOA)
|
#if defined(_GLFW_COCOA)
|
||||||
#include "cocoa_platform.h"
|
#include "cocoa_platform.h"
|
||||||
#elif defined(_GLFW_WIN32)
|
#elif defined(_GLFW_WIN32)
|
||||||
@ -133,13 +127,6 @@ typedef int GLFWbool;
|
|||||||
// Helper macros
|
// Helper macros
|
||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
// Constructs a version number string from the public header macros
|
|
||||||
#define _GLFW_CONCAT_VERSION(m, n, r) #m "." #n "." #r
|
|
||||||
#define _GLFW_MAKE_VERSION(m, n, r) _GLFW_CONCAT_VERSION(m, n, r)
|
|
||||||
#define _GLFW_VERSION_NUMBER _GLFW_MAKE_VERSION(GLFW_VERSION_MAJOR, \
|
|
||||||
GLFW_VERSION_MINOR, \
|
|
||||||
GLFW_VERSION_REVISION)
|
|
||||||
|
|
||||||
// Checks for whether the library has been initialized
|
// Checks for whether the library has been initialized
|
||||||
#define _GLFW_REQUIRE_INIT() \
|
#define _GLFW_REQUIRE_INIT() \
|
||||||
if (!_glfwInitialized) \
|
if (!_glfwInitialized) \
|
||||||
@ -179,12 +166,12 @@ struct _GLFWwndconfig
|
|||||||
int width;
|
int width;
|
||||||
int height;
|
int height;
|
||||||
const char* title;
|
const char* title;
|
||||||
GLFWbool resizable;
|
GLboolean resizable;
|
||||||
GLFWbool visible;
|
GLboolean visible;
|
||||||
GLFWbool decorated;
|
GLboolean decorated;
|
||||||
GLFWbool focused;
|
GLboolean focused;
|
||||||
GLFWbool autoIconify;
|
GLboolean autoIconify;
|
||||||
GLFWbool floating;
|
GLboolean floating;
|
||||||
_GLFWmonitor* monitor;
|
_GLFWmonitor* monitor;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -200,9 +187,8 @@ struct _GLFWctxconfig
|
|||||||
int api;
|
int api;
|
||||||
int major;
|
int major;
|
||||||
int minor;
|
int minor;
|
||||||
GLFWbool forward;
|
GLboolean forward;
|
||||||
GLFWbool debug;
|
GLboolean debug;
|
||||||
GLFWbool noerror;
|
|
||||||
int profile;
|
int profile;
|
||||||
int robustness;
|
int robustness;
|
||||||
int release;
|
int release;
|
||||||
@ -241,26 +227,6 @@ struct _GLFWfbconfig
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*! @brief Context structure.
|
|
||||||
*/
|
|
||||||
struct _GLFWcontext
|
|
||||||
{
|
|
||||||
int api;
|
|
||||||
int major, minor, revision;
|
|
||||||
GLFWbool forward, debug, noerror;
|
|
||||||
int profile;
|
|
||||||
int robustness;
|
|
||||||
int release;
|
|
||||||
|
|
||||||
PFNGLGETSTRINGIPROC GetStringi;
|
|
||||||
PFNGLGETINTEGERVPROC GetIntegerv;
|
|
||||||
PFNGLGETSTRINGPROC GetString;
|
|
||||||
|
|
||||||
// This is defined in the context API's context.h
|
|
||||||
_GLFW_PLATFORM_CONTEXT_STATE;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*! @brief Window and context structure.
|
/*! @brief Window and context structure.
|
||||||
*/
|
*/
|
||||||
struct _GLFWwindow
|
struct _GLFWwindow
|
||||||
@ -268,25 +234,40 @@ struct _GLFWwindow
|
|||||||
struct _GLFWwindow* next;
|
struct _GLFWwindow* next;
|
||||||
|
|
||||||
// Window settings and state
|
// Window settings and state
|
||||||
GLFWbool resizable;
|
GLboolean resizable;
|
||||||
GLFWbool decorated;
|
GLboolean decorated;
|
||||||
GLFWbool autoIconify;
|
GLboolean autoIconify;
|
||||||
GLFWbool floating;
|
GLboolean floating;
|
||||||
GLFWbool closed;
|
GLboolean closed;
|
||||||
void* userPointer;
|
void* userPointer;
|
||||||
GLFWvidmode videoMode;
|
GLFWvidmode videoMode;
|
||||||
_GLFWmonitor* monitor;
|
_GLFWmonitor* monitor;
|
||||||
_GLFWcursor* cursor;
|
_GLFWcursor* cursor;
|
||||||
|
|
||||||
// Window input state
|
// Window input state
|
||||||
GLFWbool stickyKeys;
|
GLboolean stickyKeys;
|
||||||
GLFWbool stickyMouseButtons;
|
GLboolean stickyMouseButtons;
|
||||||
double cursorPosX, cursorPosY;
|
double cursorPosX, cursorPosY;
|
||||||
int cursorMode;
|
int cursorMode;
|
||||||
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
char mouseButtons[GLFW_MOUSE_BUTTON_LAST + 1];
|
||||||
char keys[GLFW_KEY_LAST + 1];
|
char keys[GLFW_KEY_LAST + 1];
|
||||||
|
|
||||||
_GLFWcontext context;
|
// OpenGL extensions and context attributes
|
||||||
|
struct {
|
||||||
|
int api;
|
||||||
|
int major, minor, revision;
|
||||||
|
GLboolean forward, debug;
|
||||||
|
int profile;
|
||||||
|
int robustness;
|
||||||
|
int release;
|
||||||
|
} context;
|
||||||
|
|
||||||
|
#if defined(_GLFW_USE_OPENGL)
|
||||||
|
PFNGLGETSTRINGIPROC GetStringi;
|
||||||
|
#endif
|
||||||
|
PFNGLGETINTEGERVPROC GetIntegerv;
|
||||||
|
PFNGLGETSTRINGPROC GetString;
|
||||||
|
PFNGLCLEARPROC Clear;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
GLFWwindowposfun pos;
|
GLFWwindowposfun pos;
|
||||||
@ -301,6 +282,7 @@ struct _GLFWwindow
|
|||||||
GLFWcursorenterfun cursorEnter;
|
GLFWcursorenterfun cursorEnter;
|
||||||
GLFWscrollfun scroll;
|
GLFWscrollfun scroll;
|
||||||
GLFWkeyfun key;
|
GLFWkeyfun key;
|
||||||
|
GLFWmenufun menuitem;
|
||||||
GLFWcharfun character;
|
GLFWcharfun character;
|
||||||
GLFWcharmodsfun charmods;
|
GLFWcharmodsfun charmods;
|
||||||
GLFWdropfun drop;
|
GLFWdropfun drop;
|
||||||
@ -308,6 +290,8 @@ struct _GLFWwindow
|
|||||||
|
|
||||||
// This is defined in the window API's platform.h
|
// This is defined in the window API's platform.h
|
||||||
_GLFW_PLATFORM_WINDOW_STATE;
|
_GLFW_PLATFORM_WINDOW_STATE;
|
||||||
|
// This is defined in the context API's context.h
|
||||||
|
_GLFW_PLATFORM_CONTEXT_STATE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -386,7 +370,7 @@ struct _GLFWlibrary
|
|||||||
|
|
||||||
/*! @brief Flag indicating whether GLFW has been successfully initialized.
|
/*! @brief Flag indicating whether GLFW has been successfully initialized.
|
||||||
*/
|
*/
|
||||||
extern GLFWbool _glfwInitialized;
|
extern GLboolean _glfwInitialized;
|
||||||
|
|
||||||
/*! @brief All global data protected by @ref _glfwInitialized.
|
/*! @brief All global data protected by @ref _glfwInitialized.
|
||||||
* This should only be touched after a call to @ref glfwInit that has not been
|
* This should only be touched after a call to @ref glfwInit that has not been
|
||||||
@ -400,7 +384,7 @@ extern _GLFWlibrary _glfw;
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
|
|
||||||
/*! @brief Initializes the platform-specific part of the library.
|
/*! @brief Initializes the platform-specific part of the library.
|
||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an error occurred.
|
* @return `GL_TRUE` if successful, or `GL_FALSE` if an error occurred.
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
int _glfwPlatformInit(void);
|
int _glfwPlatformInit(void);
|
||||||
@ -429,16 +413,11 @@ void _glfwPlatformGetCursorPos(_GLFWwindow* window, double* xpos, double* ypos);
|
|||||||
*/
|
*/
|
||||||
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);
|
void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos);
|
||||||
|
|
||||||
/*! @brief Sets the specified cursor mode of the specified window.
|
/*! @brief Applies the cursor mode of the specified window to the system.
|
||||||
* @param[in] window The window whose cursor mode to set.
|
* @param[in] window The window whose cursor mode to apply.
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode);
|
void _glfwPlatformApplyCursorMode(_GLFWwindow* window);
|
||||||
|
|
||||||
/*! @copydoc glfwGetKeyName
|
|
||||||
* @ingroup platform
|
|
||||||
*/
|
|
||||||
const char* _glfwPlatformGetKeyName(int key, int scancode);
|
|
||||||
|
|
||||||
/*! @copydoc glfwGetMonitors
|
/*! @copydoc glfwGetMonitors
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
@ -449,11 +428,11 @@ _GLFWmonitor** _glfwPlatformGetMonitors(int* count);
|
|||||||
*
|
*
|
||||||
* @param[in] first The first monitor.
|
* @param[in] first The first monitor.
|
||||||
* @param[in] second The second monitor.
|
* @param[in] second The second monitor.
|
||||||
* @return @c GLFW_TRUE if the monitor objects represent the same monitor, or
|
* @return @c GL_TRUE if the monitor objects represent the same monitor, or @c
|
||||||
* @c GLFW_FALSE otherwise.
|
* GL_FALSE otherwise.
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
GLFWbool _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second);
|
GLboolean _glfwPlatformIsSameMonitor(_GLFWmonitor* first, _GLFWmonitor* second);
|
||||||
|
|
||||||
/*! @copydoc glfwGetMonitorPos
|
/*! @copydoc glfwGetMonitorPos
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
@ -558,16 +537,6 @@ void _glfwPlatformGetWindowSize(_GLFWwindow* window, int* width, int* height);
|
|||||||
*/
|
*/
|
||||||
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height);
|
||||||
|
|
||||||
/*! @copydoc glfwSetWindowSizeLimits
|
|
||||||
* @ingroup platform
|
|
||||||
*/
|
|
||||||
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight);
|
|
||||||
|
|
||||||
/*! @copydoc glfwSetWindowAspectRatio
|
|
||||||
* @ingroup platform
|
|
||||||
*/
|
|
||||||
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom);
|
|
||||||
|
|
||||||
/*! @copydoc glfwGetFramebufferSize
|
/*! @copydoc glfwGetFramebufferSize
|
||||||
* @ingroup platform
|
* @ingroup platform
|
||||||
*/
|
*/
|
||||||
@ -689,11 +658,11 @@ void _glfwPlatformSetCursor(_GLFWwindow* window, _GLFWcursor* cursor);
|
|||||||
|
|
||||||
/*! @brief Notifies shared code of a window focus event.
|
/*! @brief Notifies shared code of a window focus event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] focused `GLFW_TRUE` if the window received focus, or `GLFW_FALSE`
|
* @param[in] focused `GL_TRUE` if the window received focus, or `GL_FALSE`
|
||||||
* if it lost focus.
|
* if it lost focus.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputWindowFocus(_GLFWwindow* window, GLFWbool focused);
|
void _glfwInputWindowFocus(_GLFWwindow* window, GLboolean focused);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a window movement event.
|
/*! @brief Notifies shared code of a window movement event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
@ -721,11 +690,11 @@ void _glfwInputFramebufferSize(_GLFWwindow* window, int width, int height);
|
|||||||
|
|
||||||
/*! @brief Notifies shared code of a window iconification event.
|
/*! @brief Notifies shared code of a window iconification event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] iconified `GLFW_TRUE` if the window was iconified, or
|
* @param[in] iconified `GL_TRUE` if the window was iconified, or `GL_FALSE`
|
||||||
* `GLFW_FALSE` if it was restored.
|
* if it was restored.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputWindowIconify(_GLFWwindow* window, GLFWbool iconified);
|
void _glfwInputWindowIconify(_GLFWwindow* window, int iconified);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a window damage event.
|
/*! @brief Notifies shared code of a window damage event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
@ -738,6 +707,13 @@ void _glfwInputWindowDamage(_GLFWwindow* window);
|
|||||||
*/
|
*/
|
||||||
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
|
void _glfwInputWindowCloseRequest(_GLFWwindow* window);
|
||||||
|
|
||||||
|
/*! @brief Notifies shared code of a menu item event.
|
||||||
|
* @param[in] window The Window that received the event.
|
||||||
|
* @param[in] id The ID of the menu item
|
||||||
|
* @ingroup event
|
||||||
|
*/
|
||||||
|
void _glfwInputMenuItem(_GLFWwindow* window, int id);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a physical key event.
|
/*! @brief Notifies shared code of a physical key event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] key The key that was pressed or released.
|
* @param[in] key The key that was pressed or released.
|
||||||
@ -752,11 +728,11 @@ void _glfwInputKey(_GLFWwindow* window, int key, int scancode, int action, int m
|
|||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] codepoint The Unicode code point of the input character.
|
* @param[in] codepoint The Unicode code point of the input character.
|
||||||
* @param[in] mods Bit field describing which modifier keys were held down.
|
* @param[in] mods Bit field describing which modifier keys were held down.
|
||||||
* @param[in] plain `GLFW_TRUE` if the character is regular text input, or
|
* @param[in] plain `GL_TRUE` if the character is regular text input, or
|
||||||
* `GLFW_FALSE` otherwise.
|
* `GL_FALSE` otherwise.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, GLFWbool plain);
|
void _glfwInputChar(_GLFWwindow* window, unsigned int codepoint, int mods, int plain);
|
||||||
|
|
||||||
/*! @brief Notifies shared code of a scroll event.
|
/*! @brief Notifies shared code of a scroll event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
@ -786,11 +762,11 @@ void _glfwInputCursorMotion(_GLFWwindow* window, double x, double y);
|
|||||||
|
|
||||||
/*! @brief Notifies shared code of a cursor enter/leave event.
|
/*! @brief Notifies shared code of a cursor enter/leave event.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
* @param[in] entered `GLFW_TRUE` if the cursor entered the client area of the
|
* @param[in] entered `GL_TRUE` if the cursor entered the client area of the
|
||||||
* window, or `GLFW_FALSE` if it left it.
|
* window, or `GL_FALSE` if it left it.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
void _glfwInputCursorEnter(_GLFWwindow* window, GLFWbool entered);
|
void _glfwInputCursorEnter(_GLFWwindow* window, int entered);
|
||||||
|
|
||||||
/*! @ingroup event
|
/*! @ingroup event
|
||||||
*/
|
*/
|
||||||
@ -802,11 +778,7 @@ void _glfwInputMonitorChange(void);
|
|||||||
* description.
|
* description.
|
||||||
* @ingroup event
|
* @ingroup event
|
||||||
*/
|
*/
|
||||||
#if defined(__GNUC__)
|
|
||||||
void _glfwInputError(int error, const char* format, ...) __attribute__((format(printf, 2, 3)));
|
|
||||||
#else
|
|
||||||
void _glfwInputError(int error, const char* format, ...);
|
void _glfwInputError(int error, const char* format, ...);
|
||||||
#endif
|
|
||||||
|
|
||||||
/*! @brief Notifies dropped object over window.
|
/*! @brief Notifies dropped object over window.
|
||||||
* @param[in] window The window that received the event.
|
* @param[in] window The window that received the event.
|
||||||
@ -839,10 +811,10 @@ void _glfwSplitBPP(int bpp, int* red, int* green, int* blue);
|
|||||||
/*! @brief Searches an extension string for the specified extension.
|
/*! @brief Searches an extension string for the specified extension.
|
||||||
* @param[in] string The extension string to search.
|
* @param[in] string The extension string to search.
|
||||||
* @param[in] extensions The extension to search for.
|
* @param[in] extensions The extension to search for.
|
||||||
* @return `GLFW_TRUE` if the extension was found, or `GLFW_FALSE` otherwise.
|
* @return `GL_TRUE` if the extension was found, or `GL_FALSE` otherwise.
|
||||||
* @ingroup utility
|
* @ingroup utility
|
||||||
*/
|
*/
|
||||||
GLFWbool _glfwStringInExtensionString(const char* string, const char* extensions);
|
int _glfwStringInExtensionString(const char* string, const char* extensions);
|
||||||
|
|
||||||
/*! @brief Chooses the framebuffer config that best matches the desired one.
|
/*! @brief Chooses the framebuffer config that best matches the desired one.
|
||||||
* @param[in] desired The desired framebuffer config.
|
* @param[in] desired The desired framebuffer config.
|
||||||
@ -858,15 +830,14 @@ const _GLFWfbconfig* _glfwChooseFBConfig(const _GLFWfbconfig* desired,
|
|||||||
|
|
||||||
/*! @brief Retrieves the attributes of the current context.
|
/*! @brief Retrieves the attributes of the current context.
|
||||||
* @param[in] ctxconfig The desired context attributes.
|
* @param[in] ctxconfig The desired context attributes.
|
||||||
* @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if the context is
|
* @return `GL_TRUE` if successful, or `GL_FALSE` if the context is unusable.
|
||||||
* unusable.
|
|
||||||
* @ingroup utility
|
* @ingroup utility
|
||||||
*/
|
*/
|
||||||
GLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);
|
GLboolean _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);
|
||||||
|
|
||||||
/*! @brief Checks whether the desired context attributes are valid.
|
/*! @brief Checks whether the desired context attributes are valid.
|
||||||
* @param[in] ctxconfig The context attributes to check.
|
* @param[in] ctxconfig The context attributes to check.
|
||||||
* @return `GLFW_TRUE` if the context attributes are valid, or `GLFW_FALSE`
|
* @return `GL_TRUE` if the context attributes are valid, or `GL_FALSE`
|
||||||
* otherwise.
|
* otherwise.
|
||||||
* @ingroup utility
|
* @ingroup utility
|
||||||
*
|
*
|
||||||
@ -874,16 +845,16 @@ GLFWbool _glfwRefreshContextAttribs(const _GLFWctxconfig* ctxconfig);
|
|||||||
* exists and whether all relevant options have supported and non-conflicting
|
* exists and whether all relevant options have supported and non-conflicting
|
||||||
* values.
|
* values.
|
||||||
*/
|
*/
|
||||||
GLFWbool _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);
|
GLboolean _glfwIsValidContextConfig(const _GLFWctxconfig* ctxconfig);
|
||||||
|
|
||||||
/*! @brief Checks whether the current context fulfils the specified hard
|
/*! @brief Checks whether the current context fulfils the specified hard
|
||||||
* constraints.
|
* constraints.
|
||||||
* @param[in] ctxconfig The desired context attributes.
|
* @param[in] ctxconfig The desired context attributes.
|
||||||
* @return `GLFW_TRUE` if the context fulfils the hard constraints, or
|
* @return `GL_TRUE` if the context fulfils the hard constraints, or `GL_FALSE`
|
||||||
* `GLFW_FALSE` otherwise.
|
* otherwise.
|
||||||
* @ingroup utility
|
* @ingroup utility
|
||||||
*/
|
*/
|
||||||
GLFWbool _glfwIsValidContext(const _GLFWctxconfig* ctxconfig);
|
GLboolean _glfwIsValidContext(const _GLFWctxconfig* ctxconfig);
|
||||||
|
|
||||||
/*! @ingroup utility
|
/*! @ingroup utility
|
||||||
*/
|
*/
|
||||||
@ -912,8 +883,4 @@ void _glfwFreeMonitor(_GLFWmonitor* monitor);
|
|||||||
*/
|
*/
|
||||||
void _glfwFreeMonitors(_GLFWmonitor** monitors, int count);
|
void _glfwFreeMonitors(_GLFWmonitor** monitors, int count);
|
||||||
|
|
||||||
/*! @ingroup utility
|
|
||||||
*/
|
|
||||||
int _glfwIsPrintable(int key);
|
|
||||||
|
|
||||||
#endif // _glfw3_internal_h_
|
#endif // _glfw3_internal_h_
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//========================================================================
|
//========================================================================
|
||||||
// GLFW 3.2 Win32 - www.glfw.org
|
// GLFW 3.1 Win32 - www.glfw.org
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
// Copyright (c) 2002-2006 Marcus Geelnard
|
// Copyright (c) 2002-2006 Marcus Geelnard
|
||||||
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
// Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org>
|
||||||
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
#define _GLFW_WNDCLASSNAME L"GLFW30"
|
#define _GLFW_WNDCLASSNAME L"GLFW30"
|
||||||
|
|
||||||
|
|
||||||
// Returns the window style for the specified window
|
// Returns the window style for the specified window
|
||||||
//
|
//
|
||||||
static DWORD getWindowStyle(const _GLFWwindow* window)
|
static DWORD getWindowStyle(const _GLFWwindow* window)
|
||||||
@ -68,47 +69,6 @@ static DWORD getWindowExStyle(const _GLFWwindow* window)
|
|||||||
return style;
|
return style;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Translate client window size to full window size according to styles
|
|
||||||
//
|
|
||||||
static void getFullWindowSize(DWORD style, DWORD exStyle,
|
|
||||||
int clientWidth, int clientHeight,
|
|
||||||
int* fullWidth, int* fullHeight)
|
|
||||||
{
|
|
||||||
RECT rect = { 0, 0, clientWidth, clientHeight };
|
|
||||||
AdjustWindowRectEx(&rect, style, FALSE, exStyle);
|
|
||||||
*fullWidth = rect.right - rect.left;
|
|
||||||
*fullHeight = rect.bottom - rect.top;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enforce the client rect aspect ratio based on which edge is being dragged
|
|
||||||
//
|
|
||||||
static void applyAspectRatio(_GLFWwindow* window, int edge, RECT* area)
|
|
||||||
{
|
|
||||||
int xoff, yoff;
|
|
||||||
const float ratio = (float) window->win32.numer /
|
|
||||||
(float) window->win32.denom;
|
|
||||||
|
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
|
||||||
0, 0, &xoff, &yoff);
|
|
||||||
|
|
||||||
if (edge == WMSZ_LEFT || edge == WMSZ_BOTTOMLEFT ||
|
|
||||||
edge == WMSZ_RIGHT || edge == WMSZ_BOTTOMRIGHT)
|
|
||||||
{
|
|
||||||
area->bottom = area->top + yoff +
|
|
||||||
(int) ((area->right - area->left - xoff) / ratio);
|
|
||||||
}
|
|
||||||
else if (edge == WMSZ_TOPLEFT || edge == WMSZ_TOPRIGHT)
|
|
||||||
{
|
|
||||||
area->top = area->bottom - yoff -
|
|
||||||
(int) ((area->right - area->left - xoff) / ratio);
|
|
||||||
}
|
|
||||||
else if (edge == WMSZ_TOP || edge == WMSZ_BOTTOM)
|
|
||||||
{
|
|
||||||
area->right = area->left + xoff +
|
|
||||||
(int) ((area->bottom - area->top - yoff) * ratio);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Updates the cursor clip rect
|
// Updates the cursor clip rect
|
||||||
//
|
//
|
||||||
static void updateClipRect(_GLFWwindow* window)
|
static void updateClipRect(_GLFWwindow* window)
|
||||||
@ -120,6 +80,56 @@ static void updateClipRect(_GLFWwindow* window)
|
|||||||
ClipCursor(&clipRect);
|
ClipCursor(&clipRect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hide the mouse cursor
|
||||||
|
//
|
||||||
|
static void hideCursor(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
POINT pos;
|
||||||
|
|
||||||
|
ClipCursor(NULL);
|
||||||
|
|
||||||
|
if (GetCursorPos(&pos))
|
||||||
|
{
|
||||||
|
if (WindowFromPoint(pos) == window->win32.handle)
|
||||||
|
SetCursor(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Disable the mouse cursor
|
||||||
|
//
|
||||||
|
static void disableCursor(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
POINT pos;
|
||||||
|
|
||||||
|
updateClipRect(window);
|
||||||
|
|
||||||
|
if (GetCursorPos(&pos))
|
||||||
|
{
|
||||||
|
if (WindowFromPoint(pos) == window->win32.handle)
|
||||||
|
SetCursor(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Restores the mouse cursor
|
||||||
|
//
|
||||||
|
static void restoreCursor(_GLFWwindow* window)
|
||||||
|
{
|
||||||
|
POINT pos;
|
||||||
|
|
||||||
|
ClipCursor(NULL);
|
||||||
|
|
||||||
|
if (GetCursorPos(&pos))
|
||||||
|
{
|
||||||
|
if (WindowFromPoint(pos) == window->win32.handle)
|
||||||
|
{
|
||||||
|
if (window->cursor)
|
||||||
|
SetCursor(window->cursor->win32.handle);
|
||||||
|
else
|
||||||
|
SetCursor(LoadCursorW(NULL, IDC_ARROW));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Translates a GLFW standard cursor to a resource ID
|
// Translates a GLFW standard cursor to a resource ID
|
||||||
//
|
//
|
||||||
static LPWSTR translateCursorShape(int shape)
|
static LPWSTR translateCursorShape(int shape)
|
||||||
@ -225,10 +235,10 @@ static int translateKey(WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
// Enter full screen mode
|
// Enter full screen mode
|
||||||
//
|
//
|
||||||
static GLFWbool enterFullscreenMode(_GLFWwindow* window)
|
static GLboolean enterFullscreenMode(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
GLFWvidmode mode;
|
GLFWvidmode mode;
|
||||||
GLFWbool status;
|
GLboolean status;
|
||||||
int xpos, ypos;
|
int xpos, ypos;
|
||||||
|
|
||||||
status = _glfwSetVideoMode(window->monitor, &window->videoMode);
|
status = _glfwSetVideoMode(window->monitor, &window->videoMode);
|
||||||
@ -249,7 +259,7 @@ static void leaveFullscreenMode(_GLFWwindow* window)
|
|||||||
_glfwRestoreVideoMode(window->monitor);
|
_glfwRestoreVideoMode(window->monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Window callback function (handles window messages)
|
// Window callback function (handles window events)
|
||||||
//
|
//
|
||||||
static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
||||||
WPARAM wParam, LPARAM lParam)
|
WPARAM wParam, LPARAM lParam)
|
||||||
@ -267,25 +277,29 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
case WM_SETFOCUS:
|
case WM_SETFOCUS:
|
||||||
{
|
{
|
||||||
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
if (window->cursorMode != GLFW_CURSOR_NORMAL)
|
||||||
_glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);
|
_glfwPlatformApplyCursorMode(window);
|
||||||
|
|
||||||
_glfwInputWindowFocus(window, GLFW_TRUE);
|
_glfwInputWindowFocus(window, GL_TRUE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_KILLFOCUS:
|
case WM_KILLFOCUS:
|
||||||
{
|
{
|
||||||
if (window->cursorMode == GLFW_CURSOR_DISABLED)
|
if (window->cursorMode != GLFW_CURSOR_NORMAL)
|
||||||
_glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);
|
restoreCursor(window);
|
||||||
|
|
||||||
if (window->monitor && window->autoIconify)
|
if (window->monitor && window->autoIconify)
|
||||||
_glfwPlatformIconifyWindow(window);
|
_glfwPlatformIconifyWindow(window);
|
||||||
|
|
||||||
_glfwInputWindowFocus(window, GLFW_FALSE);
|
_glfwInputWindowFocus(window, GL_FALSE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
_glfwInputMenuItem(window, LOWORD(wParam));
|
||||||
|
break;
|
||||||
|
}
|
||||||
case WM_SYSCOMMAND:
|
case WM_SYSCOMMAND:
|
||||||
{
|
{
|
||||||
switch (wParam & 0xfff0)
|
switch (wParam & 0xfff0)
|
||||||
@ -316,52 +330,69 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case WM_KEYDOWN:
|
||||||
|
case WM_SYSKEYDOWN:
|
||||||
|
{
|
||||||
|
const int scancode = (lParam >> 16) & 0x1ff;
|
||||||
|
const int key = translateKey(wParam, lParam);
|
||||||
|
if (key == _GLFW_KEY_INVALID)
|
||||||
|
break;
|
||||||
|
|
||||||
|
_glfwInputKey(window, key, scancode, GLFW_PRESS, getKeyMods());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_CHAR:
|
case WM_CHAR:
|
||||||
|
{
|
||||||
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_TRUE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_SYSCHAR:
|
case WM_SYSCHAR:
|
||||||
|
{
|
||||||
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_FALSE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_UNICHAR:
|
case WM_UNICHAR:
|
||||||
{
|
{
|
||||||
const GLFWbool plain = (uMsg != WM_SYSCHAR);
|
// This message is not sent by Windows, but is sent by some
|
||||||
|
// third-party input method engines
|
||||||
|
|
||||||
if (uMsg == WM_UNICHAR && wParam == UNICODE_NOCHAR)
|
if (wParam == UNICODE_NOCHAR)
|
||||||
{
|
{
|
||||||
// WM_UNICHAR is not sent by Windows, but is sent by some
|
|
||||||
// third-party input method engine
|
|
||||||
// Returning TRUE here announces support for this message
|
// Returning TRUE here announces support for this message
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), plain);
|
_glfwInputChar(window, (unsigned int) wParam, getKeyMods(), GL_TRUE);
|
||||||
return 0;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_KEYDOWN:
|
|
||||||
case WM_SYSKEYDOWN:
|
|
||||||
case WM_KEYUP:
|
case WM_KEYUP:
|
||||||
case WM_SYSKEYUP:
|
case WM_SYSKEYUP:
|
||||||
{
|
{
|
||||||
const int key = translateKey(wParam, lParam);
|
|
||||||
const int scancode = (lParam >> 16) & 0x1ff;
|
|
||||||
const int action = ((lParam >> 31) & 1) ? GLFW_RELEASE : GLFW_PRESS;
|
|
||||||
const int mods = getKeyMods();
|
const int mods = getKeyMods();
|
||||||
|
const int scancode = (lParam >> 16) & 0x1ff;
|
||||||
|
const int key = translateKey(wParam, lParam);
|
||||||
if (key == _GLFW_KEY_INVALID)
|
if (key == _GLFW_KEY_INVALID)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (action == GLFW_RELEASE && wParam == VK_SHIFT)
|
if (wParam == VK_SHIFT)
|
||||||
{
|
{
|
||||||
// Release both Shift keys on Shift up event, as only one event
|
// Release both Shift keys on Shift up event, as only one event
|
||||||
// is sent even if both keys are released
|
// is sent even if both keys are released
|
||||||
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, scancode, action, mods);
|
_glfwInputKey(window, GLFW_KEY_LEFT_SHIFT, scancode, GLFW_RELEASE, mods);
|
||||||
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, scancode, action, mods);
|
_glfwInputKey(window, GLFW_KEY_RIGHT_SHIFT, scancode, GLFW_RELEASE, mods);
|
||||||
}
|
}
|
||||||
else if (wParam == VK_SNAPSHOT)
|
else if (wParam == VK_SNAPSHOT)
|
||||||
{
|
{
|
||||||
// Key down is not reported for the Print Screen key
|
// Key down is not reported for the print screen key
|
||||||
_glfwInputKey(window, key, scancode, GLFW_PRESS, mods);
|
_glfwInputKey(window, key, scancode, GLFW_PRESS, mods);
|
||||||
_glfwInputKey(window, key, scancode, GLFW_RELEASE, mods);
|
_glfwInputKey(window, key, scancode, GLFW_RELEASE, mods);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_glfwInputKey(window, key, scancode, action, mods);
|
_glfwInputKey(window, key, scancode, GLFW_RELEASE, mods);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -370,40 +401,54 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
case WM_RBUTTONDOWN:
|
case WM_RBUTTONDOWN:
|
||||||
case WM_MBUTTONDOWN:
|
case WM_MBUTTONDOWN:
|
||||||
case WM_XBUTTONDOWN:
|
case WM_XBUTTONDOWN:
|
||||||
|
{
|
||||||
|
const int mods = getKeyMods();
|
||||||
|
|
||||||
|
SetCapture(hWnd);
|
||||||
|
|
||||||
|
if (uMsg == WM_LBUTTONDOWN)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, mods);
|
||||||
|
else if (uMsg == WM_RBUTTONDOWN)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_PRESS, mods);
|
||||||
|
else if (uMsg == WM_MBUTTONDOWN)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_PRESS, mods);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (HIWORD(wParam) == XBUTTON1)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_PRESS, mods);
|
||||||
|
else if (HIWORD(wParam) == XBUTTON2)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_PRESS, mods);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
case WM_RBUTTONUP:
|
case WM_RBUTTONUP:
|
||||||
case WM_MBUTTONUP:
|
case WM_MBUTTONUP:
|
||||||
case WM_XBUTTONUP:
|
case WM_XBUTTONUP:
|
||||||
{
|
{
|
||||||
int button, action;
|
const int mods = getKeyMods();
|
||||||
|
|
||||||
if (uMsg == WM_LBUTTONDOWN || uMsg == WM_LBUTTONUP)
|
ReleaseCapture();
|
||||||
button = GLFW_MOUSE_BUTTON_LEFT;
|
|
||||||
else if (uMsg == WM_RBUTTONDOWN || uMsg == WM_RBUTTONUP)
|
|
||||||
button = GLFW_MOUSE_BUTTON_RIGHT;
|
|
||||||
else if (uMsg == WM_MBUTTONDOWN || uMsg == WM_MBUTTONUP)
|
|
||||||
button = GLFW_MOUSE_BUTTON_MIDDLE;
|
|
||||||
else if (GET_XBUTTON_WPARAM(wParam) == XBUTTON1)
|
|
||||||
button = GLFW_MOUSE_BUTTON_4;
|
|
||||||
else
|
|
||||||
button = GLFW_MOUSE_BUTTON_5;
|
|
||||||
|
|
||||||
if (uMsg == WM_LBUTTONDOWN || uMsg == WM_RBUTTONDOWN ||
|
if (uMsg == WM_LBUTTONUP)
|
||||||
uMsg == WM_MBUTTONDOWN || uMsg == WM_XBUTTONDOWN)
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, mods);
|
||||||
{
|
else if (uMsg == WM_RBUTTONUP)
|
||||||
action = GLFW_PRESS;
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_RIGHT, GLFW_RELEASE, mods);
|
||||||
SetCapture(hWnd);
|
else if (uMsg == WM_MBUTTONUP)
|
||||||
}
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_MIDDLE, GLFW_RELEASE, mods);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
action = GLFW_RELEASE;
|
if (HIWORD(wParam) == XBUTTON1)
|
||||||
ReleaseCapture();
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_4, GLFW_RELEASE, mods);
|
||||||
}
|
else if (HIWORD(wParam) == XBUTTON2)
|
||||||
|
_glfwInputMouseClick(window, GLFW_MOUSE_BUTTON_5, GLFW_RELEASE, mods);
|
||||||
|
|
||||||
_glfwInputMouseClick(window, button, action, getKeyMods());
|
|
||||||
|
|
||||||
if (uMsg == WM_XBUTTONDOWN || uMsg == WM_XBUTTONUP)
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -437,8 +482,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
tme.hwndTrack = window->win32.handle;
|
tme.hwndTrack = window->win32.handle;
|
||||||
TrackMouseEvent(&tme);
|
TrackMouseEvent(&tme);
|
||||||
|
|
||||||
window->win32.cursorTracked = GLFW_TRUE;
|
window->win32.cursorTracked = GL_TRUE;
|
||||||
_glfwInputCursorEnter(window, GLFW_TRUE);
|
_glfwInputCursorEnter(window, GL_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -446,8 +491,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
case WM_MOUSELEAVE:
|
case WM_MOUSELEAVE:
|
||||||
{
|
{
|
||||||
window->win32.cursorTracked = GLFW_FALSE;
|
window->win32.cursorTracked = GL_FALSE;
|
||||||
_glfwInputCursorEnter(window, GLFW_FALSE);
|
_glfwInputCursorEnter(window, GL_FALSE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,20 +520,20 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
|
|
||||||
if (!window->win32.iconified && wParam == SIZE_MINIMIZED)
|
if (!window->win32.iconified && wParam == SIZE_MINIMIZED)
|
||||||
{
|
{
|
||||||
window->win32.iconified = GLFW_TRUE;
|
window->win32.iconified = GL_TRUE;
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
leaveFullscreenMode(window);
|
leaveFullscreenMode(window);
|
||||||
|
|
||||||
_glfwInputWindowIconify(window, GLFW_TRUE);
|
_glfwInputWindowIconify(window, GL_TRUE);
|
||||||
}
|
}
|
||||||
else if (window->win32.iconified &&
|
else if (window->win32.iconified &&
|
||||||
(wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED))
|
(wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED))
|
||||||
{
|
{
|
||||||
window->win32.iconified = GLFW_FALSE;
|
window->win32.iconified = GL_FALSE;
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
enterFullscreenMode(window);
|
enterFullscreenMode(window);
|
||||||
|
|
||||||
_glfwInputWindowIconify(window, GLFW_FALSE);
|
_glfwInputWindowIconify(window, GL_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
_glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam));
|
_glfwInputFramebufferSize(window, LOWORD(lParam), HIWORD(lParam));
|
||||||
@ -512,46 +557,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_SIZING:
|
|
||||||
{
|
|
||||||
if (window->win32.numer == GLFW_DONT_CARE ||
|
|
||||||
window->win32.denom == GLFW_DONT_CARE)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
applyAspectRatio(window, (int) wParam, (RECT*) lParam);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_GETMINMAXINFO:
|
|
||||||
{
|
|
||||||
int xoff, yoff;
|
|
||||||
MINMAXINFO* mmi = (MINMAXINFO*) lParam;
|
|
||||||
|
|
||||||
if (!window)
|
|
||||||
break;
|
|
||||||
|
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
|
||||||
0, 0, &xoff, &yoff);
|
|
||||||
|
|
||||||
if (window->win32.minwidth != GLFW_DONT_CARE &&
|
|
||||||
window->win32.minheight != GLFW_DONT_CARE)
|
|
||||||
{
|
|
||||||
mmi->ptMinTrackSize.x = window->win32.minwidth + xoff;
|
|
||||||
mmi->ptMinTrackSize.y = window->win32.minheight + yoff;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window->win32.maxwidth != GLFW_DONT_CARE &&
|
|
||||||
window->win32.maxheight != GLFW_DONT_CARE)
|
|
||||||
{
|
|
||||||
mmi->ptMaxTrackSize.x = window->win32.maxwidth + xoff;
|
|
||||||
mmi->ptMaxTrackSize.y = window->win32.maxheight + yoff;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
_glfwInputWindowDamage(window);
|
_glfwInputWindowDamage(window);
|
||||||
@ -583,19 +588,6 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case WM_DPICHANGED:
|
|
||||||
{
|
|
||||||
RECT* rect = (RECT*) lParam;
|
|
||||||
SetWindowPos(window->win32.handle,
|
|
||||||
HWND_TOP,
|
|
||||||
rect->left,
|
|
||||||
rect->top,
|
|
||||||
rect->right - rect->left,
|
|
||||||
rect->bottom - rect->top,
|
|
||||||
SWP_NOACTIVATE | SWP_NOZORDER);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case WM_DEVICECHANGE:
|
case WM_DEVICECHANGE:
|
||||||
{
|
{
|
||||||
if (DBT_DEVNODES_CHANGED == wParam)
|
if (DBT_DEVNODES_CHANGED == wParam)
|
||||||
@ -641,12 +633,28 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DefWindowProcW(hWnd, uMsg, wParam, lParam);
|
return DefWindowProc(hWnd, uMsg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Translate client window size to full window size (including window borders)
|
||||||
|
//
|
||||||
|
static void getFullWindowSize(_GLFWwindow* window,
|
||||||
|
int clientWidth, int clientHeight,
|
||||||
|
int* fullWidth, int* fullHeight)
|
||||||
|
{
|
||||||
|
RECT rect = { 0, 0, clientWidth, clientHeight };
|
||||||
|
AdjustWindowRectEx(&rect, getWindowStyle(window),
|
||||||
|
FALSE, getWindowExStyle(window));
|
||||||
|
*fullWidth = rect.right - rect.left;
|
||||||
|
*fullHeight = rect.bottom - rect.top;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates the GLFW window and rendering context
|
// Creates the GLFW window and rendering context
|
||||||
//
|
//
|
||||||
static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
static int createWindow(_GLFWwindow* window,
|
||||||
|
const _GLFWwndconfig* wndconfig,
|
||||||
|
const _GLFWctxconfig* ctxconfig,
|
||||||
|
const _GLFWfbconfig* fbconfig)
|
||||||
{
|
{
|
||||||
int xpos, ypos, fullWidth, fullHeight;
|
int xpos, ypos, fullWidth, fullHeight;
|
||||||
WCHAR* wideTitle;
|
WCHAR* wideTitle;
|
||||||
@ -668,7 +676,7 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
|||||||
xpos = CW_USEDEFAULT;
|
xpos = CW_USEDEFAULT;
|
||||||
ypos = CW_USEDEFAULT;
|
ypos = CW_USEDEFAULT;
|
||||||
|
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
getFullWindowSize(window,
|
||||||
wndconfig->width, wndconfig->height,
|
wndconfig->width, wndconfig->height,
|
||||||
&fullWidth, &fullHeight);
|
&fullWidth, &fullHeight);
|
||||||
}
|
}
|
||||||
@ -678,7 +686,7 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
|||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Win32: Failed to convert window title to UTF-16");
|
"Win32: Failed to convert window title to UTF-16");
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
window->win32.handle = CreateWindowExW(getWindowExStyle(window),
|
window->win32.handle = CreateWindowExW(getWindowExStyle(window),
|
||||||
@ -697,7 +705,7 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
|||||||
if (!window->win32.handle)
|
if (!window->win32.handle)
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to create window");
|
_glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to create window");
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_glfw_ChangeWindowMessageFilterEx)
|
if (_glfw_ChangeWindowMessageFilterEx)
|
||||||
@ -720,20 +728,18 @@ static int createWindow(_GLFWwindow* window, const _GLFWwndconfig* wndconfig)
|
|||||||
|
|
||||||
DragAcceptFiles(window->win32.handle, TRUE);
|
DragAcceptFiles(window->win32.handle, TRUE);
|
||||||
|
|
||||||
window->win32.minwidth = GLFW_DONT_CARE;
|
if (!_glfwCreateContext(window, ctxconfig, fbconfig))
|
||||||
window->win32.minheight = GLFW_DONT_CARE;
|
return GL_FALSE;
|
||||||
window->win32.maxwidth = GLFW_DONT_CARE;
|
|
||||||
window->win32.maxheight = GLFW_DONT_CARE;
|
|
||||||
window->win32.numer = GLFW_DONT_CARE;
|
|
||||||
window->win32.denom = GLFW_DONT_CARE;
|
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Destroys the GLFW window and rendering context
|
// Destroys the GLFW window and rendering context
|
||||||
//
|
//
|
||||||
static void destroyWindow(_GLFWwindow* window)
|
static void destroyWindow(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
|
_glfwDestroyContext(window);
|
||||||
|
|
||||||
if (window->win32.handle)
|
if (window->win32.handle)
|
||||||
{
|
{
|
||||||
DestroyWindow(window->win32.handle);
|
DestroyWindow(window->win32.handle);
|
||||||
@ -748,7 +754,7 @@ static void destroyWindow(_GLFWwindow* window)
|
|||||||
|
|
||||||
// Registers the GLFW window class
|
// Registers the GLFW window class
|
||||||
//
|
//
|
||||||
GLFWbool _glfwRegisterWindowClass(void)
|
GLboolean _glfwRegisterWindowClass(void)
|
||||||
{
|
{
|
||||||
WNDCLASSW wc;
|
WNDCLASSW wc;
|
||||||
|
|
||||||
@ -763,25 +769,21 @@ GLFWbool _glfwRegisterWindowClass(void)
|
|||||||
wc.lpszClassName = _GLFW_WNDCLASSNAME;
|
wc.lpszClassName = _GLFW_WNDCLASSNAME;
|
||||||
|
|
||||||
// Load user-provided icon if available
|
// Load user-provided icon if available
|
||||||
wc.hIcon = LoadImageW(GetModuleHandleW(NULL),
|
wc.hIcon = LoadIconW(GetModuleHandleW(NULL), L"GLFW_ICON");
|
||||||
L"GLFW_ICON", IMAGE_ICON,
|
|
||||||
0, 0, LR_DEFAULTSIZE | LR_SHARED);
|
|
||||||
if (!wc.hIcon)
|
if (!wc.hIcon)
|
||||||
{
|
{
|
||||||
// No user-provided icon found, load default icon
|
// No user-provided icon found, load default icon
|
||||||
wc.hIcon = LoadImageW(NULL,
|
wc.hIcon = LoadIconW(NULL, IDI_WINLOGO);
|
||||||
IDI_APPLICATION, IMAGE_ICON,
|
|
||||||
0, 0, LR_DEFAULTSIZE | LR_SHARED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!RegisterClassW(&wc))
|
if (!RegisterClassW(&wc))
|
||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Win32: Failed to register window class");
|
"Win32: Failed to register window class");
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unregisters the GLFW window class
|
// Unregisters the GLFW window class
|
||||||
@ -803,65 +805,53 @@ int _glfwPlatformCreateWindow(_GLFWwindow* window,
|
|||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (!createWindow(window, wndconfig))
|
if (!createWindow(window, wndconfig, ctxconfig, fbconfig))
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
if (ctxconfig->api != GLFW_NO_API)
|
status = _glfwAnalyzeContext(window, ctxconfig, fbconfig);
|
||||||
|
|
||||||
|
if (status == _GLFW_RECREATION_IMPOSSIBLE)
|
||||||
|
return GL_FALSE;
|
||||||
|
|
||||||
|
if (status == _GLFW_RECREATION_REQUIRED)
|
||||||
{
|
{
|
||||||
if (!_glfwCreateContext(window, ctxconfig, fbconfig))
|
// Some window hints require us to re-create the context using WGL
|
||||||
return GLFW_FALSE;
|
// extensions retrieved through the current context, as we cannot check
|
||||||
|
// for WGL extensions or retrieve WGL entry points before we have a
|
||||||
|
// current context (actually until we have implicitly loaded the ICD)
|
||||||
|
|
||||||
#if defined(_GLFW_WGL)
|
// Yes, this is strange, and yes, this is the proper way on Win32
|
||||||
status = _glfwAnalyzeContext(window, ctxconfig, fbconfig);
|
|
||||||
|
|
||||||
if (status == _GLFW_RECREATION_IMPOSSIBLE)
|
// As Windows only allows you to set the pixel format once for a
|
||||||
return GLFW_FALSE;
|
// window, we need to destroy the current window and create a new one
|
||||||
|
// to be able to use the new pixel format
|
||||||
|
|
||||||
if (status == _GLFW_RECREATION_REQUIRED)
|
// Technically, it may be possible to keep the old window around if
|
||||||
{
|
// we're just creating an OpenGL 3.0+ context with the same pixel
|
||||||
// Some window hints require us to re-create the context using WGL
|
// format, but it's not worth the added code complexity
|
||||||
// extensions retrieved through the current context, as we cannot
|
|
||||||
// check for WGL extensions or retrieve WGL entry points before we
|
|
||||||
// have a current context (actually until we have implicitly loaded
|
|
||||||
// the vendor ICD)
|
|
||||||
|
|
||||||
// Yes, this is strange, and yes, this is the proper way on WGL
|
// First we clear the current context (the one we just created)
|
||||||
|
// This is usually done by glfwDestroyWindow, but as we're not doing
|
||||||
|
// full GLFW window destruction, it's duplicated here
|
||||||
|
_glfwPlatformMakeContextCurrent(NULL);
|
||||||
|
|
||||||
// As Windows only allows you to set the pixel format once for
|
// Next destroy the Win32 window and WGL context (without resetting or
|
||||||
// a window, we need to destroy the current window and create a new
|
// destroying the GLFW window object)
|
||||||
// one to be able to use the new pixel format
|
destroyWindow(window);
|
||||||
|
|
||||||
// Technically, it may be possible to keep the old window around if
|
// ...and then create them again, this time with better APIs
|
||||||
// we're just creating an OpenGL 3.0+ context with the same pixel
|
if (!createWindow(window, wndconfig, ctxconfig, fbconfig))
|
||||||
// format, but it's not worth the added code complexity
|
return GL_FALSE;
|
||||||
|
|
||||||
// First we clear the current context (the one we just created)
|
|
||||||
// This is usually done by glfwDestroyWindow, but as we're not doing
|
|
||||||
// full GLFW window destruction, it's duplicated here
|
|
||||||
_glfwPlatformMakeContextCurrent(NULL);
|
|
||||||
|
|
||||||
// Next destroy the Win32 window and WGL context (without resetting
|
|
||||||
// or destroying the GLFW window object)
|
|
||||||
_glfwDestroyContext(window);
|
|
||||||
destroyWindow(window);
|
|
||||||
|
|
||||||
// ...and then create them again, this time with better APIs
|
|
||||||
if (!createWindow(window, wndconfig))
|
|
||||||
return GLFW_FALSE;
|
|
||||||
if (!_glfwCreateContext(window, ctxconfig, fbconfig))
|
|
||||||
return GLFW_FALSE;
|
|
||||||
}
|
|
||||||
#endif // _GLFW_WGL
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
{
|
{
|
||||||
_glfwPlatformShowWindow(window);
|
_glfwPlatformShowWindow(window);
|
||||||
if (!enterFullscreenMode(window))
|
if (!enterFullscreenMode(window))
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
||||||
@ -869,9 +859,6 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window)
|
|||||||
if (window->monitor)
|
if (window->monitor)
|
||||||
leaveFullscreenMode(window);
|
leaveFullscreenMode(window);
|
||||||
|
|
||||||
if (window->context.api != GLFW_NO_API)
|
|
||||||
_glfwDestroyContext(window);
|
|
||||||
|
|
||||||
destroyWindow(window);
|
destroyWindow(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -927,8 +914,7 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int fullWidth, fullHeight;
|
int fullWidth, fullHeight;
|
||||||
getFullWindowSize(getWindowStyle(window), getWindowExStyle(window),
|
getFullWindowSize(window, width, height, &fullWidth, &fullHeight);
|
||||||
width, height, &fullWidth, &fullHeight);
|
|
||||||
|
|
||||||
SetWindowPos(window->win32.handle, HWND_TOP,
|
SetWindowPos(window->win32.handle, HWND_TOP,
|
||||||
0, 0, fullWidth, fullHeight,
|
0, 0, fullWidth, fullHeight,
|
||||||
@ -936,48 +922,6 @@ void _glfwPlatformSetWindowSize(_GLFWwindow* window, int width, int height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetWindowSizeLimits(_GLFWwindow* window,
|
|
||||||
int minwidth, int minheight,
|
|
||||||
int maxwidth, int maxheight)
|
|
||||||
{
|
|
||||||
RECT area;
|
|
||||||
|
|
||||||
window->win32.minwidth = minwidth;
|
|
||||||
window->win32.minheight = minheight;
|
|
||||||
window->win32.maxwidth = maxwidth;
|
|
||||||
window->win32.maxheight = maxheight;
|
|
||||||
|
|
||||||
if ((minwidth == GLFW_DONT_CARE || minheight == GLFW_DONT_CARE) &&
|
|
||||||
(maxwidth == GLFW_DONT_CARE || maxheight == GLFW_DONT_CARE))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
GetWindowRect(window->win32.handle, &area);
|
|
||||||
MoveWindow(window->win32.handle,
|
|
||||||
area.left, area.top,
|
|
||||||
area.right - area.left,
|
|
||||||
area.bottom - area.top, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformSetWindowAspectRatio(_GLFWwindow* window, int numer, int denom)
|
|
||||||
{
|
|
||||||
RECT area;
|
|
||||||
|
|
||||||
window->win32.numer = numer;
|
|
||||||
window->win32.denom = denom;
|
|
||||||
|
|
||||||
if (numer == GLFW_DONT_CARE || denom == GLFW_DONT_CARE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
GetWindowRect(window->win32.handle, &area);
|
|
||||||
applyAspectRatio(window, WMSZ_BOTTOMRIGHT, &area);
|
|
||||||
MoveWindow(window->win32.handle,
|
|
||||||
area.left, area.top,
|
|
||||||
area.right - area.left,
|
|
||||||
area.bottom - area.top, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
void _glfwPlatformGetFramebufferSize(_GLFWwindow* window, int* width, int* height)
|
||||||
{
|
{
|
||||||
_glfwPlatformGetWindowSize(window, width, height);
|
_glfwPlatformGetWindowSize(window, width, height);
|
||||||
@ -1153,54 +1097,20 @@ void _glfwPlatformSetCursorPos(_GLFWwindow* window, double xpos, double ypos)
|
|||||||
SetCursorPos(pos.x, pos.y);
|
SetCursorPos(pos.x, pos.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformSetCursorMode(_GLFWwindow* window, int mode)
|
void _glfwPlatformApplyCursorMode(_GLFWwindow* window)
|
||||||
{
|
{
|
||||||
POINT pos;
|
switch (window->cursorMode)
|
||||||
|
|
||||||
if (mode == GLFW_CURSOR_DISABLED)
|
|
||||||
updateClipRect(window);
|
|
||||||
else
|
|
||||||
ClipCursor(NULL);
|
|
||||||
|
|
||||||
if (!GetCursorPos(&pos))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (WindowFromPoint(pos) != window->win32.handle)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (mode == GLFW_CURSOR_NORMAL)
|
|
||||||
{
|
{
|
||||||
if (window->cursor)
|
case GLFW_CURSOR_NORMAL:
|
||||||
SetCursor(window->cursor->win32.handle);
|
restoreCursor(window);
|
||||||
else
|
break;
|
||||||
SetCursor(LoadCursorW(NULL, IDC_ARROW));
|
case GLFW_CURSOR_HIDDEN:
|
||||||
|
hideCursor(window);
|
||||||
|
break;
|
||||||
|
case GLFW_CURSOR_DISABLED:
|
||||||
|
disableCursor(window);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
SetCursor(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* _glfwPlatformGetKeyName(int key, int scancode)
|
|
||||||
{
|
|
||||||
WCHAR name[16];
|
|
||||||
|
|
||||||
if (key != GLFW_KEY_UNKNOWN)
|
|
||||||
scancode = _glfw.win32.nativeKeys[key];
|
|
||||||
|
|
||||||
if (!_glfwIsPrintable(_glfw.win32.publicKeys[scancode]))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!GetKeyNameTextW(scancode << 16, name, sizeof(name) / sizeof(WCHAR)))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (!WideCharToMultiByte(CP_UTF8, 0, name, -1,
|
|
||||||
_glfw.win32.keyName,
|
|
||||||
sizeof(_glfw.win32.keyName),
|
|
||||||
NULL, NULL))
|
|
||||||
{
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _glfw.win32.keyName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
||||||
@ -1233,13 +1143,13 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
|||||||
ReleaseDC(NULL, dc);
|
ReleaseDC(NULL, dc);
|
||||||
|
|
||||||
if (!bitmap)
|
if (!bitmap)
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
mask = CreateBitmap(image->width, image->height, 1, 1, NULL);
|
mask = CreateBitmap(image->width, image->height, 1, 1, NULL);
|
||||||
if (!mask)
|
if (!mask)
|
||||||
{
|
{
|
||||||
DeleteObject(bitmap);
|
DeleteObject(bitmap);
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < image->width * image->height; i++, target++, source += 4)
|
for (i = 0; i < image->width * image->height; i++, target++, source += 4)
|
||||||
@ -1263,9 +1173,9 @@ int _glfwPlatformCreateCursor(_GLFWcursor* cursor,
|
|||||||
DeleteObject(mask);
|
DeleteObject(mask);
|
||||||
|
|
||||||
if (!cursor->win32.handle)
|
if (!cursor->win32.handle)
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
||||||
@ -1276,10 +1186,10 @@ int _glfwPlatformCreateStandardCursor(_GLFWcursor* cursor, int shape)
|
|||||||
{
|
{
|
||||||
_glfwInputError(GLFW_PLATFORM_ERROR,
|
_glfwInputError(GLFW_PLATFORM_ERROR,
|
||||||
"Win32: Failed to create standard cursor");
|
"Win32: Failed to create standard cursor");
|
||||||
return GLFW_FALSE;
|
return GL_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return GLFW_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _glfwPlatformDestroyCursor(_GLFWcursor* cursor)
|
void _glfwPlatformDestroyCursor(_GLFWcursor* cursor)
|
||||||
|
Loading…
Reference in New Issue
Block a user