Bug fix #93: Assertion failure when window reparented
- Fix an assertion failure that occurs when a window is reparented to the root window then immediately to another window. Thanks to smlx for reporting. - Add extra debugging info for ReparentNotify.
This commit is contained in:
parent
e3eca7ac61
commit
b3652f6746
|
@ -2505,9 +2505,11 @@ add_win(session_t *ps, Window id, Window prev) {
|
|||
new->id = id;
|
||||
|
||||
set_ignore_next(ps);
|
||||
if (!XGetWindowAttributes(ps->dpy, id, &new->a)) {
|
||||
// Failed to get window attributes. Which probably means, the window
|
||||
// is gone already.
|
||||
if (!XGetWindowAttributes(ps->dpy, id, &new->a)
|
||||
|| IsUnviewable == new->a.map_state) {
|
||||
// Failed to get window attributes probably means the window is gone
|
||||
// already. IsUnviewable means the window is already reparented
|
||||
// elsewhere.
|
||||
free(new);
|
||||
return false;
|
||||
}
|
||||
|
@ -3446,6 +3448,11 @@ ev_unmap_notify(session_t *ps, XUnmapEvent *ev) {
|
|||
|
||||
inline static void
|
||||
ev_reparent_notify(session_t *ps, XReparentEvent *ev) {
|
||||
#ifdef DEBUG_EVENTS
|
||||
printf_dbg(" { new_parent: %#010lx, override_redirect: %d }\n",
|
||||
ev->parent, ev->override_redirect);
|
||||
#endif
|
||||
|
||||
if (ev->parent == ps->root) {
|
||||
add_win(ps, ev->window, 0);
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue