X11: Improve window handle race condition

The non-root parent window owned by the WM could be destroyed before we
process the ConfigureNotify event using the cached parent handle.

Bug was found by unmapping a decorated window.

This like all uses of the Xlib error handler is not thread safe and
there is nothing we can do about that short of moving to XCB.

Fixes #1633.

(cherry picked from commit e65de2941c)
This commit is contained in:
Camilla Löwy 2020-03-19 23:28:21 +01:00
parent 2d4c4b7949
commit a6d022c257
2 changed files with 7 additions and 0 deletions

View File

@ -121,6 +121,7 @@ information on what to include when reporting a bug.
- [X11] Bugfix: IME input of CJK was broken for "C" locale (#1587,#1636) - [X11] Bugfix: IME input of CJK was broken for "C" locale (#1587,#1636)
- [X11] Bugfix: Xlib errors caused by other parts of the application could be - [X11] Bugfix: Xlib errors caused by other parts of the application could be
reported as GLFW errors reported as GLFW errors
- [X11] Bugfix: A handle race condition could cause a `BadWindow` error (#1633)
## Contact ## Contact

View File

@ -1557,6 +1557,8 @@ 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();
Window dummy; Window dummy;
XTranslateCoordinates(_glfw.x11.display, XTranslateCoordinates(_glfw.x11.display,
window->x11.parent, window->x11.parent,
@ -1564,6 +1566,10 @@ static void processEvent(XEvent *event)
xpos, ypos, xpos, ypos,
&xpos, &ypos, &xpos, &ypos,
&dummy); &dummy);
_glfwReleaseErrorHandlerX11();
if (_glfw.x11.errorCode == BadWindow)
return;
} }
if (xpos != window->x11.xpos || ypos != window->x11.ypos) if (xpos != window->x11.xpos || ypos != window->x11.ypos)