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).

from upstream git
This commit is contained in:
dcoppa 2012-09-25 15:06:35 +00:00
parent 0187f458ba
commit a71122393e
2 changed files with 38 additions and 1 deletions

View File

@ -1,8 +1,9 @@
# $OpenBSD: Makefile,v 1.46 2012/09/21 17:16:13 dcoppa Exp $
# $OpenBSD: Makefile,v 1.47 2012/09/25 15:06:35 dcoppa Exp $
COMMENT = improved dynamic tiling window manager
DISTNAME = i3-4.3
REVISION = 0
CATEGORIES = x11
EXTRACT_SUFX = .tar.bz2

View File

@ -0,0 +1,36 @@
$OpenBSD: patch-src_manage_c,v 1.7 2012/09/25 15:06:35 dcoppa Exp $
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 Tue Sep 25 16:58:40 2012
@@ -381,6 +381,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: