71 lines
3.6 KiB
Plaintext
71 lines
3.6 KiB
Plaintext
$OpenBSD: patch-src_manage_c,v 1.9 2012/11/13 08:44:02 dcoppa Exp $
|
|
|
|
From a3f3d5670ca8ec0414805a4613a20d7b87b78630 Mon Sep 17 00:00:00 2001
|
|
From: Michael Stapelberg <michael@stapelberg.de>
|
|
Date: Thu, 27 Sep 2012 10:09:06 +0000
|
|
Subject: Bugfix: properly react to windows being unmapped before we can reparent
|
|
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.
|
|
|
|
From 372d47842e7d71fde0a194761bf77dceed6e724c Mon Sep 17 00:00:00 2001
|
|
From: Michael Stapelberg <michael@stapelberg.de>
|
|
Date: Mon, 24 Sep 2012 21:57:58 +0000
|
|
Subject: Bugfix: Render workspaces created by assignments to use correct coordinates
|
|
Previously, i3 would send width=0, height=0 to windows which were
|
|
put on workspaces created by an assignment (that is, invisible
|
|
workspaces, which do not get rendered normally).
|
|
|
|
--- src/manage.c.orig Wed Sep 19 18:08:09 2012
|
|
+++ src/manage.c Thu Sep 27 12:50:16 2012
|
|
@@ -126,11 +126,22 @@ void manage_window(xcb_window_t window, xcb_get_window
|
|
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)
|
|
|
|
@@ -381,6 +392,22 @@ void manage_window(xcb_window_t window, xcb_get_window
|
|
/* 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:
|