Bladeren bron

X11: Fix race in window hovered query

The window decoration window can go away between calls to XQueryPointer,
for example if the GLFW_DECORATED window attribute was just cleared.
Camilla Löwy 5 jaren geleden
bovenliggende
commit
ceb20c7f97
1 gewijzigde bestanden met toevoegingen van 12 en 4 verwijderingen
  1. 12 4
      src/x11_window.c

+ 12 - 4
src/x11_window.c

@@ -2576,11 +2576,19 @@ int _glfwPlatformWindowHovered(_GLFWwindow* window)
         int rootX, rootY, childX, childY;
         int rootX, rootY, childX, childY;
         unsigned int mask;
         unsigned int mask;
 
 
-        if (!XQueryPointer(_glfw.x11.display, w,
-                           &root, &w, &rootX, &rootY, &childX, &childY, &mask))
-        {
+        _glfwGrabErrorHandlerX11();
+
+        const Bool result = XQueryPointer(_glfw.x11.display, w,
+                                          &root, &w, &rootX, &rootY,
+                                          &childX, &childY, &mask);
+
+        _glfwReleaseErrorHandlerX11();
+
+        if (_glfw.x11.errorCode == BadWindow)
+            w = _glfw.x11.root;
+
+        if (!result)
             return GLFW_FALSE;
             return GLFW_FALSE;
-        }
 
 
         if (w == window->x11.handle)
         if (w == window->x11.handle)
             return GLFW_TRUE;
             return GLFW_TRUE;