X11: Save and restore original X11 error handler

Save and restore original X11 error handler instead of setting it to
NULL (default handler) because user might have set a custom handler that
has been unset.
This commit is contained in:
Martin Pulec 2022-05-10 10:31:18 +02:00
parent 62e175ef9f
commit a8af370fcb
4 changed files with 16 additions and 16 deletions

View File

@ -495,7 +495,7 @@ GLFWbool _glfwCreateContextGLX(_GLFWwindow* window,
} }
} }
_glfwGrabErrorHandlerX11(); int (*orighandler)() = _glfwGrabErrorHandlerX11();
if (_glfw.glx.ARB_create_context) if (_glfw.glx.ARB_create_context)
{ {
@ -605,7 +605,7 @@ GLFWbool _glfwCreateContextGLX(_GLFWwindow* window,
createLegacyContextGLX(window, native, share); createLegacyContextGLX(window, native, share);
} }
_glfwReleaseErrorHandlerX11(); _glfwReleaseErrorHandlerX11(orighandler);
if (!window->context.glx.handle) if (!window->context.glx.handle)
{ {

View File

@ -523,7 +523,7 @@ static void detectEWMH(void)
return; return;
} }
_glfwGrabErrorHandlerX11(); int (*orighandler)() = _glfwGrabErrorHandlerX11();
// If it exists, it should be the XID of a top-level window // If it exists, it should be the XID of a top-level window
// Then we look for the same property on that window // Then we look for the same property on that window
@ -538,7 +538,7 @@ static void detectEWMH(void)
return; return;
} }
_glfwReleaseErrorHandlerX11(); _glfwReleaseErrorHandlerX11(orighandler);
// If the property exists, it should contain the XID of the window // If the property exists, it should contain the XID of the window
@ -1093,19 +1093,19 @@ static int errorHandler(Display *display, XErrorEvent* event)
// Sets the X error handler callback // Sets the X error handler callback
// //
void _glfwGrabErrorHandlerX11(void) int (*_glfwGrabErrorHandlerX11(void))()
{ {
_glfw.x11.errorCode = Success; _glfw.x11.errorCode = Success;
XSetErrorHandler(errorHandler); return XSetErrorHandler(errorHandler);
} }
// Clears the X error handler callback // Clears the X error handler callback
// //
void _glfwReleaseErrorHandlerX11(void) void _glfwReleaseErrorHandlerX11(int (*orighandler)())
{ {
// Synchronize to make sure all commands are processed // Synchronize to make sure all commands are processed
XSync(_glfw.x11.display, False); XSync(_glfw.x11.display, False);
XSetErrorHandler(NULL); XSetErrorHandler(orighandler);
} }
// Reports the specified error, appending information about the last X error // Reports the specified error, appending information about the last X error

View File

@ -983,8 +983,8 @@ unsigned long _glfwGetWindowPropertyX11(Window window,
unsigned char** value); unsigned char** value);
GLFWbool _glfwIsVisualTransparentX11(Visual* visual); GLFWbool _glfwIsVisualTransparentX11(Visual* visual);
void _glfwGrabErrorHandlerX11(void); int (*_glfwGrabErrorHandlerX11(void))();
void _glfwReleaseErrorHandlerX11(void); void _glfwReleaseErrorHandlerX11(int (*orighandler)());
void _glfwInputErrorX11(int error, const char* message); void _glfwInputErrorX11(int error, const char* message);
void _glfwPushSelectionToManagerX11(void); void _glfwPushSelectionToManagerX11(void);

View File

@ -573,7 +573,7 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
ExposureMask | FocusChangeMask | VisibilityChangeMask | ExposureMask | FocusChangeMask | VisibilityChangeMask |
EnterWindowMask | LeaveWindowMask | PropertyChangeMask; EnterWindowMask | LeaveWindowMask | PropertyChangeMask;
_glfwGrabErrorHandlerX11(); int (*orighandler)() = _glfwGrabErrorHandlerX11();
window->x11.parent = _glfw.x11.root; window->x11.parent = _glfw.x11.root;
window->x11.handle = XCreateWindow(_glfw.x11.display, window->x11.handle = XCreateWindow(_glfw.x11.display,
@ -587,7 +587,7 @@ static GLFWbool createNativeWindow(_GLFWwindow* window,
CWBorderPixel | CWColormap | CWEventMask, CWBorderPixel | CWColormap | CWEventMask,
&wa); &wa);
_glfwReleaseErrorHandlerX11(); _glfwReleaseErrorHandlerX11(orighandler);
if (!window->x11.handle) if (!window->x11.handle)
{ {
@ -1452,7 +1452,7 @@ static void processEvent(XEvent *event)
// the position into root (screen) coordinates // the position into root (screen) coordinates
if (!event->xany.send_event && window->x11.parent != _glfw.x11.root) if (!event->xany.send_event && window->x11.parent != _glfw.x11.root)
{ {
_glfwGrabErrorHandlerX11(); int (*orighandler)() = _glfwGrabErrorHandlerX11();
Window dummy; Window dummy;
XTranslateCoordinates(_glfw.x11.display, XTranslateCoordinates(_glfw.x11.display,
@ -1462,7 +1462,7 @@ static void processEvent(XEvent *event)
&xpos, &ypos, &xpos, &ypos,
&dummy); &dummy);
_glfwReleaseErrorHandlerX11(); _glfwReleaseErrorHandlerX11(orighandler);
if (_glfw.x11.errorCode == BadWindow) if (_glfw.x11.errorCode == BadWindow)
return; return;
} }
@ -2526,13 +2526,13 @@ int _glfwWindowHoveredX11(_GLFWwindow* window)
int rootX, rootY, childX, childY; int rootX, rootY, childX, childY;
unsigned int mask; unsigned int mask;
_glfwGrabErrorHandlerX11(); int (*orighandler)() = _glfwGrabErrorHandlerX11();
const Bool result = XQueryPointer(_glfw.x11.display, w, const Bool result = XQueryPointer(_glfw.x11.display, w,
&root, &w, &rootX, &rootY, &root, &w, &rootX, &rootY,
&childX, &childY, &mask); &childX, &childY, &mask);
_glfwReleaseErrorHandlerX11(); _glfwReleaseErrorHandlerX11(orighandler);
if (_glfw.x11.errorCode == BadWindow) if (_glfw.x11.errorCode == BadWindow)
w = _glfw.x11.root; w = _glfw.x11.root;