diff --git a/README.md b/README.md index 26a6092a..6005f81b 100644 --- a/README.md +++ b/README.md @@ -136,6 +136,7 @@ information on what to include when reporting a bug. - [Cocoa] Bugfix: The EGL and OSMesa libraries were not unloaded on termination - [X11] Bugfix: The OSMesa libray was not unloaded on termination - [X11] Bugfix: A malformed response during selection transfer could cause a segfault + - [X11] Bugfix: Some calls would reset Xlib to the default error handler (#2108) - [Wayland] Added support for file path drop events (#2040) - [Wayland] Bugfix: `glfwSetClipboardString` would fail if set to result of `glfwGetClipboardString` diff --git a/src/x11_init.c b/src/x11_init.c index 8dd433f1..6049904a 100644 --- a/src/x11_init.c +++ b/src/x11_init.c @@ -39,6 +39,7 @@ #include #include #include +#include // Translate the X11 KeySyms for a key to a GLFW key code @@ -1022,8 +1023,9 @@ static int errorHandler(Display *display, XErrorEvent* event) // void _glfwGrabErrorHandlerX11(void) { + assert(_glfw.x11.errorHandler == NULL); _glfw.x11.errorCode = Success; - XSetErrorHandler(errorHandler); + _glfw.x11.errorHandler = XSetErrorHandler(errorHandler); } // Clears the X error handler callback @@ -1032,7 +1034,8 @@ void _glfwReleaseErrorHandlerX11(void) { // Synchronize to make sure all commands are processed XSync(_glfw.x11.display, False); - XSetErrorHandler(NULL); + XSetErrorHandler(_glfw.x11.errorHandler); + _glfw.x11.errorHandler = NULL; } // Reports the specified error, appending information about the last X error diff --git a/src/x11_platform.h b/src/x11_platform.h index 30c73a88..03ff9d24 100644 --- a/src/x11_platform.h +++ b/src/x11_platform.h @@ -222,6 +222,8 @@ typedef struct _GLFWlibraryX11 XContext context; // XIM input method XIM im; + // The previous X error handler, to be restored later + XErrorHandler errorHandler; // Most recent error code received by X error handler int errorCode; // Primary selection string (while the primary selection is owned)