openbsd-ports/x11/i3/patches/patch-src_manage_c
dcoppa 995e33eb30 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 upstream git
2012-09-27 10:57:45 +00:00

73 lines
3.6 KiB
Plaintext

$OpenBSD: patch-src_manage_c,v 1.8 2012/09/27 10:57:46 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: