소스 검색

Win32: Fix disabled cursor mode vs caption buttons

This postpones disabling the cursor until the user is done interacting
with a caption button.

Related to #650.
Fixes #1071.
Camilla Löwy 8 년 전
부모
커밋
a368d89c94
3개의 변경된 파일44개의 추가작업 그리고 0개의 파일을 삭제
  1. 2 0
      README.md
  2. 1 0
      src/win32_platform.h
  3. 41 0
      src/win32_window.c

+ 2 - 0
README.md

@@ -191,6 +191,8 @@ information on what to include when reporting a bug.
 - [Win32] Bugfix: The Cygwin DLL was installed to the wrong directory (#1035)
 - [Win32] Bugfix: The Cygwin DLL was installed to the wrong directory (#1035)
 - [Win32] Bugfix: Normalization of axis data via XInput was incorrect (#1045)
 - [Win32] Bugfix: Normalization of axis data via XInput was incorrect (#1045)
 - [Win32] Bugfix: `glfw3native.h` would undefine a foreign `APIENTRY` (#1062)
 - [Win32] Bugfix: `glfw3native.h` would undefine a foreign `APIENTRY` (#1062)
+- [Win32] Bugfix: Disabled cursor mode prevented use of caption buttons
+                  (#650,#1071)
 - [X11] Moved to XI2 `XI_RawMotion` for disable cursor mode motion input (#125)
 - [X11] Moved to XI2 `XI_RawMotion` for disable cursor mode motion input (#125)
 - [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading
 - [X11] Replaced `_GLFW_HAS_XF86VM` compile-time option with dynamic loading
 - [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X
 - [X11] Bugfix: `glfwGetVideoMode` would segfault on Cygwin/X

+ 1 - 0
src/win32_platform.h

@@ -233,6 +233,7 @@ typedef struct _GLFWwindowWin32
     HICON               smallIcon;
     HICON               smallIcon;
 
 
     GLFWbool            cursorTracked;
     GLFWbool            cursorTracked;
+    GLFWbool            frameAction;
     GLFWbool            iconified;
     GLFWbool            iconified;
     GLFWbool            maximized;
     GLFWbool            maximized;
 
 

+ 41 - 0
src/win32_window.c

@@ -495,10 +495,47 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
 
 
     switch (uMsg)
     switch (uMsg)
     {
     {
+        case WM_MOUSEACTIVATE:
+        {
+            // HACK: Postpone cursor disabling when the window was activated by
+            //       clicking a caption button
+            if (HIWORD(lParam) == WM_LBUTTONDOWN)
+            {
+                if (LOWORD(lParam) == HTCLOSE ||
+                    LOWORD(lParam) == HTMINBUTTON ||
+                    LOWORD(lParam) == HTMAXBUTTON)
+                {
+                    window->win32.frameAction = GLFW_TRUE;
+                }
+            }
+
+            break;
+        }
+
+        case WM_CAPTURECHANGED:
+        {
+            // HACK: Disable the cursor once the caption button action has been
+            //       completed or cancelled
+            if (lParam == 0 && window->win32.frameAction)
+            {
+                if (window->cursorMode == GLFW_CURSOR_DISABLED)
+                    _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);
+
+                window->win32.frameAction = GLFW_FALSE;
+            }
+
+            break;
+        }
+
         case WM_SETFOCUS:
         case WM_SETFOCUS:
         {
         {
             _glfwInputWindowFocus(window, GLFW_TRUE);
             _glfwInputWindowFocus(window, GLFW_TRUE);
 
 
+            // HACK: Do not disable cursor while the user is interacting with
+            //       a caption button
+            if (window->win32.frameAction)
+                break;
+
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);
 
 
@@ -758,6 +795,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
         case WM_ENTERSIZEMOVE:
         case WM_ENTERSIZEMOVE:
         case WM_ENTERMENULOOP:
         case WM_ENTERMENULOOP:
         {
         {
+            // HACK: Postpone cursor disabling while the user is moving or
+            //       resizing the window or using the menu
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_NORMAL);
 
 
@@ -767,6 +806,8 @@ static LRESULT CALLBACK windowProc(HWND hWnd, UINT uMsg,
         case WM_EXITSIZEMOVE:
         case WM_EXITSIZEMOVE:
         case WM_EXITMENULOOP:
         case WM_EXITMENULOOP:
         {
         {
+            // HACK: Disable the cursor once the user is done moving or
+            //       resizing the window or using the menu
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
             if (window->cursorMode == GLFW_CURSOR_DISABLED)
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);
                 _glfwPlatformSetCursorMode(window, GLFW_CURSOR_DISABLED);