Reframe swallowed windows if depth doesn't match
X will not allow a window with ParentRelative background to be created or reparented under a window with mismatching color depth. Deal with this by destroying the container frame and creating a new one with the right depth upon swallowing. Defer destruction of the frame window until after the updated tree has been rendered to avoid some distracting flickering. Fixes #3297
This commit is contained in:
14
src/manage.c
14
src/manage.c
@ -355,8 +355,16 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
|
||||
}
|
||||
}
|
||||
}
|
||||
xcb_window_t old_frame = XCB_NONE;
|
||||
if (nc->window != cwindow && nc->window != NULL) {
|
||||
window_free(nc->window);
|
||||
/* Match frame and window depth. This is needed because X will refuse to reparent a
|
||||
* window whose background is ParentRelative under a window with a different depth. */
|
||||
if (nc->depth != cwindow->depth) {
|
||||
old_frame = nc->frame.id;
|
||||
nc->depth = cwindow->depth;
|
||||
x_con_reframe(nc);
|
||||
}
|
||||
}
|
||||
nc->window = cwindow;
|
||||
x_reinit(nc);
|
||||
@ -647,6 +655,12 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
|
||||
|
||||
tree_render();
|
||||
|
||||
/* Destroy the old frame if we had to reframe the container. This needs to be done
|
||||
* after rendering in order to prevent the background from flickering in its place. */
|
||||
if (old_frame != XCB_NONE) {
|
||||
xcb_destroy_window(conn, old_frame);
|
||||
}
|
||||
|
||||
/* Windows might get managed with the urgency hint already set (Pidgin is
|
||||
* known to do that), so check for that and handle the hint accordingly.
|
||||
* This code needs to be in this part of manage_window() because the window
|
||||
|
Reference in New Issue
Block a user