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:
parent
2d4c4b7949
commit
a6d022c257
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user