Bugfix: properly react to windows being unmapped before we can reparent (Thanks xeen, darkraven)

We need to verify that setting the event mask works, and we need to
include StructureNotify to get unmap events at any point in time.
Thanks darkraven for the pointer.

fixes #718
This commit is contained in:
Michael Stapelberg 2012-09-27 12:09:06 +02:00
parent 8eb39477bf
commit a3f3d5670c
1 changed files with 16 additions and 5 deletions

View File

@ -126,11 +126,22 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
uint32_t values[1]; uint32_t values[1];
/* Set a temporary event mask for the new window, consisting only of /* Set a temporary event mask for the new window, consisting only of
* PropertyChange. We need to be notified of PropertyChanges because the * PropertyChange and StructureNotify. We need to be notified of
* client can change its properties *after* we requested them but *before* * PropertyChanges because the client can change its properties *after* we
* we actually reparented it and have set our final event mask. */ * requested them but *before* we actually reparented it and have set our
values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE; * final event mask.
xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values); * We need StructureNotify because the client may unmap the window before
* we get to re-parent it.
* If this request fails, we assume the client has already unmapped the
* window between the MapRequest and our event mask change. */
values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE |
XCB_EVENT_MASK_STRUCTURE_NOTIFY;
xcb_void_cookie_t event_mask_cookie =
xcb_change_window_attributes_checked(conn, window, XCB_CW_EVENT_MASK, values);
if (xcb_request_check(conn, event_mask_cookie) != NULL) {
LOG("Could not change event mask, the window probably already disappeared.\n");
goto out;
}
#define GET_PROPERTY(atom, len) xcb_get_property(conn, false, window, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, len) #define GET_PROPERTY(atom, len) xcb_get_property(conn, false, window, atom, XCB_GET_PROPERTY_TYPE_ANY, 0, len)