|
|
|
@ -249,20 +249,24 @@ static void updateCursorImage(_GLFWwindow* window) |
|
|
|
|
SetCursor(NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Updates the cursor clip rect
|
|
|
|
|
// Sets the cursor clip rect to the window content area
|
|
|
|
|
//
|
|
|
|
|
static void updateClipRect(_GLFWwindow* window) |
|
|
|
|
static void captureCursor(_GLFWwindow* window) |
|
|
|
|
{ |
|
|
|
|
if (window) |
|
|
|
|
{ |
|
|
|
|
RECT clipRect; |
|
|
|
|
GetClientRect(window->win32.handle, &clipRect); |
|
|
|
|
ClientToScreen(window->win32.handle, (POINT*) &clipRect.left); |
|
|
|
|
ClientToScreen(window->win32.handle, (POINT*) &clipRect.right); |
|
|
|
|
ClipCursor(&clipRect); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
ClipCursor(NULL); |
|
|
|
|
RECT clipRect; |
|
|
|
|
GetClientRect(window->win32.handle, &clipRect); |
|
|
|
|
ClientToScreen(window->win32.handle, (POINT*) &clipRect.left); |
|
|
|
|
ClientToScreen(window->win32.handle, (POINT*) &clipRect.right); |
|
|
|
|
ClipCursor(&clipRect); |
|
|
|
|
_glfw.win32.capturedCursorWindow = window; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Disabled clip cursor
|
|
|
|
|
//
|
|
|
|
|
static void releaseCursor(void) |
|
|
|
|
{ |
|
|
|
|
ClipCursor(NULL); |
|
|
|
|
_glfw.win32.capturedCursorWindow = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Enables WM_INPUT messages for the mouse for the specified window
|
|
|
|
@ -301,7 +305,7 @@ static void disableCursor(_GLFWwindow* window) |
|
|
|
|
&_glfw.win32.restoreCursorPosY); |
|
|
|
|
updateCursorImage(window); |
|
|
|
|
_glfwCenterCursorInContentArea(window); |
|
|
|
|
updateClipRect(window); |
|
|
|
|
captureCursor(window); |
|
|
|
|
|
|
|
|
|
if (window->rawMouseMotion) |
|
|
|
|
enableRawMouseMotion(window); |
|
|
|
@ -315,7 +319,7 @@ static void enableCursor(_GLFWwindow* window) |
|
|
|
|
disableRawMouseMotion(window); |
|
|
|
|
|
|
|
|
|
_glfw.win32.disabledCursorWindow = NULL; |
|
|
|
|
updateClipRect(NULL); |
|
|
|
|
releaseCursor(); |
|
|
|
|
_glfwSetCursorPosWin32(window, |
|
|
|
|
_glfw.win32.restoreCursorPosX, |
|
|
|
|
_glfw.win32.restoreCursorPosY); |
|
|
|
@ -1004,8 +1008,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l |
|
|
|
|
(window->win32.maximized && |
|
|
|
|
wParam != SIZE_RESTORED); |
|
|
|
|
|
|
|
|
|
if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
updateClipRect(window); |
|
|
|
|
if (_glfw.win32.capturedCursorWindow == window) |
|
|
|
|
captureCursor(window); |
|
|
|
|
|
|
|
|
|
if (window->win32.iconified != iconified) |
|
|
|
|
_glfwInputWindowIconify(window, iconified); |
|
|
|
@ -1040,8 +1044,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l |
|
|
|
|
|
|
|
|
|
case WM_MOVE: |
|
|
|
|
{ |
|
|
|
|
if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
updateClipRect(window); |
|
|
|
|
if (_glfw.win32.capturedCursorWindow == window) |
|
|
|
|
captureCursor(window); |
|
|
|
|
|
|
|
|
|
// NOTE: This cannot use LOWORD/HIWORD recommended by MSDN, as
|
|
|
|
|
// those macros do not handle negative window positions correctly
|
|
|
|
@ -1495,7 +1499,10 @@ void _glfwDestroyWindowWin32(_GLFWwindow* window) |
|
|
|
|
window->context.destroy(window); |
|
|
|
|
|
|
|
|
|
if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
_glfw.win32.disabledCursorWindow = NULL; |
|
|
|
|
enableCursor(window); |
|
|
|
|
|
|
|
|
|
if (_glfw.win32.capturedCursorWindow == window) |
|
|
|
|
releaseCursor(); |
|
|
|
|
|
|
|
|
|
if (window->win32.handle) |
|
|
|
|
{ |
|
|
|
@ -2142,14 +2149,40 @@ void _glfwSetCursorPosWin32(_GLFWwindow* window, double xpos, double ypos) |
|
|
|
|
|
|
|
|
|
void _glfwSetCursorModeWin32(_GLFWwindow* window, int mode) |
|
|
|
|
{ |
|
|
|
|
if (mode == GLFW_CURSOR_DISABLED) |
|
|
|
|
if (_glfwWindowFocusedWin32(window)) |
|
|
|
|
{ |
|
|
|
|
if (_glfwWindowFocusedWin32(window)) |
|
|
|
|
disableCursor(window); |
|
|
|
|
if (mode == GLFW_CURSOR_DISABLED) |
|
|
|
|
{ |
|
|
|
|
_glfwGetCursorPosWin32(window, |
|
|
|
|
&_glfw.win32.restoreCursorPosX, |
|
|
|
|
&_glfw.win32.restoreCursorPosY); |
|
|
|
|
_glfwCenterCursorInContentArea(window); |
|
|
|
|
if (window->rawMouseMotion) |
|
|
|
|
enableRawMouseMotion(window); |
|
|
|
|
} |
|
|
|
|
else if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
{ |
|
|
|
|
if (window->rawMouseMotion) |
|
|
|
|
disableRawMouseMotion(window); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (mode == GLFW_CURSOR_DISABLED) |
|
|
|
|
captureCursor(window); |
|
|
|
|
else |
|
|
|
|
releaseCursor(); |
|
|
|
|
|
|
|
|
|
if (mode == GLFW_CURSOR_DISABLED) |
|
|
|
|
_glfw.win32.disabledCursorWindow = window; |
|
|
|
|
else if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
{ |
|
|
|
|
_glfw.win32.disabledCursorWindow = NULL; |
|
|
|
|
_glfwSetCursorPosWin32(window, |
|
|
|
|
_glfw.win32.restoreCursorPosX, |
|
|
|
|
_glfw.win32.restoreCursorPosY); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (_glfw.win32.disabledCursorWindow == window) |
|
|
|
|
enableCursor(window); |
|
|
|
|
else if (cursorInContentArea(window)) |
|
|
|
|
|
|
|
|
|
if (cursorInContentArea(window)) |
|
|
|
|
updateCursorImage(window); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|