Explorar o código

Cleanup

Move global data to library struct.  Simplify semantics.  Update
changelog.

Related to #1028.
Camilla Löwy %!s(int64=8) %!d(string=hai) anos
pai
achega
ce5e649d3b
Modificáronse 3 ficheiros con 23 adicións e 12 borrados
  1. 2 0
      README.md
  2. 1 0
      src/cocoa_platform.h
  3. 20 12
      src/cocoa_window.m

+ 2 - 0
README.md

@@ -224,6 +224,8 @@ information on what to include when reporting a bug.
 - [Cocoa] Bugfix: Full screen framebuffer was incorrectly sized for some video
                   modes (#682)
 - [Cocoa] Bugfix: A string object for IME was updated non-idiomatically (#1050)
+- [Cocoa] Bugfix: A hidden or disabled cursor would become visible when a user
+                  notification was shown (#971,#1028)
 - [WGL] Added support for `WGL_EXT_colorspace` for OpenGL ES contexts
 - [WGL] Added support for `WGL_ARB_create_context_no_error`
 - [GLX] Added support for `GLX_ARB_create_context_no_error`

+ 1 - 0
src/cocoa_platform.h

@@ -102,6 +102,7 @@ typedef struct _GLFWlibraryNS
     CGEventSourceRef    eventSource;
     id                  delegate;
     id                  autoreleasePool;
+    GLFWbool            cursorHidden;
     TISInputSourceRef   inputSource;
     IOHIDManagerRef     hidManager;
     id                  unicodeData;

+ 20 - 12
src/cocoa_window.m

@@ -88,18 +88,26 @@ static GLFWbool cursorInClientArea(_GLFWwindow* window)
     return [window->ns.view mouse:pos inRect:[window->ns.view frame]];
 }
 
-// Updates cursor visibility
+// Hides the cursor if not already hidden
 //
-static void setCursorVisibility(_GLFWwindow* window, BOOL makeVisible)
+static void hideCursor(_GLFWwindow* window)
 {
-    static BOOL isCursorVisible = YES;
-
-    if (makeVisible && !isCursorVisible)
-        [NSCursor unhide];
-    else if (!makeVisible && isCursorVisible)
+    if (!_glfw.ns.cursorHidden)
+    {
         [NSCursor hide];
+        _glfw.ns.cursorHidden = GLFW_TRUE;
+    }
+}
 
-    isCursorVisible = makeVisible;
+// Shows the cursor if not already shown
+//
+static void showCursor(_GLFWwindow* window)
+{
+    if (_glfw.ns.cursorHidden)
+    {
+        [NSCursor unhide];
+        _glfw.ns.cursorHidden = GLFW_FALSE;
+    }
 }
 
 // Updates the cursor image according to its cursor mode
@@ -108,7 +116,7 @@ static void updateCursorImage(_GLFWwindow* window)
 {
     if (window->cursorMode == GLFW_CURSOR_NORMAL)
     {
-        setCursorVisibility(window, YES);
+        showCursor(window);
 
         if (window->cursor)
             [(NSCursor*) window->cursor->ns.object set];
@@ -116,7 +124,7 @@ static void updateCursorImage(_GLFWwindow* window)
             [[NSCursor arrowCursor] set];
     }
     else
-        setCursorVisibility(window, NO);
+        hideCursor(window);
 }
 
 // Transforms the specified y-coordinate between the CG display and NS screen
@@ -525,7 +533,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
 - (void)mouseExited:(NSEvent *)event
 {
     if (window->cursorMode == GLFW_CURSOR_HIDDEN)
-        setCursorVisibility(window, YES);
+        showCursor(window);
 
     _glfwInputCursorEnter(window, GLFW_FALSE);
 }
@@ -533,7 +541,7 @@ static const NSRange kEmptyRange = { NSNotFound, 0 };
 - (void)mouseEntered:(NSEvent *)event
 {
     if (window->cursorMode == GLFW_CURSOR_HIDDEN)
-        setCursorVisibility(window, NO);
+        hideCursor(window);
 
     _glfwInputCursorEnter(window, GLFW_TRUE);
 }