+#undef I3__FILE__
+#define I3__FILE__ "manage.c"
/*
* vim:ts=4:sw=4:expandtab
*
uint32_t values[1];
/* Set a temporary event mask for the new window, consisting only of
- * PropertyChange. We need to be notified of PropertyChanges because the
- * client can change its properties *after* we requested them but *before*
- * we actually reparented it and have set our final event mask. */
- values[0] = XCB_EVENT_MASK_PROPERTY_CHANGE;
- xcb_change_window_attributes(conn, window, XCB_CW_EVENT_MASK, values);
+ * PropertyChange and StructureNotify. We need to be notified of
+ * PropertyChanges because the client can change its properties *after* we
+ * requested them but *before* we actually reparented it and have set our
+ * final event mask.
+ * 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)
(cwindow->leader != XCB_NONE &&
cwindow->leader != cwindow->id &&
con_by_window_id(cwindow->leader) != NULL)) {
- LOG("This window is transiert for another window, setting floating\n");
+ LOG("This window is transient for another window, setting floating\n");
want_floating = true;
if (config.popup_during_fullscreen == PDF_LEAVE_FULLSCREEN &&
/* Check if any assignments match */
run_assignments(cwindow);
+ /* If this window was put onto an invisible workspace (via assignments), we
+ * render this workspace. It wouldn’t be rendered in our normal code path
+ * because only the visible workspaces get rendered.
+ *
+ * By rendering the workspace, we assign proper coordinates (read: not
+ * width=0, height=0) to the window, which is important for windows who
+ * actually use them to position their GUI elements, e.g. rhythmbox. */
+ if (ws && !workspace_is_visible(ws)) {
+ /* This is a bit hackish: we need to copy the content container’s rect
+ * to the workspace, because calling render_con() on the content
+ * container would also take the shortcut and not render the invisible
+ * workspace at all. However, just calling render_con() on the
+ * workspace isn’t enough either — it needs the rect. */
+ ws->rect = ws->parent->rect;
+ render_con(ws, true);
+ }
tree_render();
geom_out: