diff --git a/src/x11_init.c b/src/x11_init.c index d7ee00dc..eba89a77 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -434,6 +434,7 @@ static GLboolean initDisplay(void) _glfw.x11.screen = DefaultScreen(_glfw.x11.display); _glfw.x11.root = RootWindow(_glfw.x11.display, _glfw.x11.screen); + _glfw.x11.context = XUniqueContext(); // Find or create window manager atoms _glfw.x11.WM_STATE = XInternAtom(_glfw.x11.display, "WM_STATE", False); diff --git a/src/x11_platform.h b/src/x11_platform.h index 03ab5f38..36d887b4 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -108,6 +108,7 @@ typedef struct _GLFWlibraryX11 // Invisible cursor for hidden cursor mode Cursor cursor; + XContext context; // Window manager atoms Atom WM_STATE; diff --git a/src/x11_window.c b/src/x11_window.c index 0357bae4..1b834fd2 100644 --- a/src/x11_window.c +++ b/src/x11_window.c @@ -154,6 +154,11 @@ static GLboolean createWindow(_GLFWwindow* window, (unsigned char*) &hints, sizeof(MotifWmHints) / sizeof(long)); } + + XSaveContext(_glfw.x11.display, + window->x11.handle, + _glfw.x11.context, + (XPointer) window); } if (window->monitor && !_glfw.x11.hasEWMH) @@ -461,13 +466,15 @@ _GLFWwindow* _glfwFindWindowByHandle(Window handle) { _GLFWwindow* window; - for (window = _glfw.windowListHead; window; window = window->next) + if (XFindContext(_glfw.x11.display, + handle, + _glfw.x11.context, + (XPointer*) &window) != 0) { - if (window->x11.handle == handle) - return window; + return NULL; } - return NULL; + return window; } // Process the specified X event @@ -897,6 +904,7 @@ void _glfwPlatformDestroyWindow(_GLFWwindow* window) if (window->x11.handle) { + XDeleteContext(_glfw.x11.display, window->x11.handle, _glfw.x11.context); XUnmapWindow(_glfw.x11.display, window->x11.handle); XDestroyWindow(_glfw.x11.display, window->x11.handle); window->x11.handle = (Window) 0;