[Xfce4-commits] [xfce/xfwm4] 01/02: Workaround for NET_WORKAREA with multimonitor
noreply at xfce.org
noreply at xfce.org
Thu Jan 8 21:43:34 CET 2015
This is an automated email from the git hooks/post-receive script.
olivier pushed a commit to branch master
in repository xfce/xfwm4.
commit 3f12ac8f92096ce562221622aa5ad2f45ae37006
Author: Alistair Buxton <a.j.buxton at gmail.com>
Date: Sun Jan 12 17:13:11 2014 +0000
Workaround for NET_WORKAREA with multimonitor
Bug: 10625
NET_WORKAREA doesn't support L shaped displays at all.
gdk works around this by ignoring it unless dealing with the
primary monitor.
Mimic this behaviour by ignoring struts not on the primary
display when calculating NET_WORKAREA
---
src/workspaces.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/src/workspaces.c b/src/workspaces.c
index f57eec9..3800429 100644
--- a/src/workspaces.c
+++ b/src/workspaces.c
@@ -527,6 +527,8 @@ workspaceUpdateArea (ScreenInfo *screen_info)
int prev_bottom;
guint i;
+ GdkRectangle workarea,struttmp;
+
g_return_if_fail (screen_info != NULL);
g_return_if_fail (screen_info->margins != NULL);
g_return_if_fail (screen_info->gnome_margins != NULL);
@@ -544,11 +546,65 @@ workspaceUpdateArea (ScreenInfo *screen_info)
screen_info->margins[i] = screen_info->gnome_margins[i];
}
+ gdk_screen_get_monitor_geometry (screen_info->gscr, gdk_screen_get_primary_monitor(screen_info->gscr), &workarea);
+
for (c = screen_info->clients, i = 0; i < screen_info->client_count; c = c->next, i++)
{
if (FLAG_TEST (c->flags, CLIENT_FLAG_HAS_STRUT)
&& FLAG_TEST (c->xfwm_flags, XFWM_FLAG_VISIBLE))
{
+ /*
+ * NET_WORKAREA doesn't support L shaped displays at all.
+ * gdk works around this by ignoring it unless dealing with
+ * the primary monitor.
+ * Mimic this behaviour by ignoring struts not on the primary
+ * display when calculating NET_WORKAREA
+ */
+
+ if(c->struts[STRUTS_TOP])
+ {
+ struttmp.x = c->struts[STRUTS_TOP_START_X];
+ struttmp.y = 0;
+ struttmp.width = c->struts[STRUTS_TOP_END_X] - c->struts[STRUTS_TOP_START_X];
+ struttmp.height = c->struts[STRUTS_TOP];
+
+ if (!gdk_rectangle_intersect (&workarea, &struttmp, NULL))
+ continue;
+ }
+
+ if(c->struts[STRUTS_BOTTOM])
+ {
+ struttmp.x = c->struts[STRUTS_BOTTOM_START_X];
+ struttmp.y = screen_info->height - c->struts[STRUTS_BOTTOM];
+ struttmp.width = c->struts[STRUTS_BOTTOM_END_X] - c->struts[STRUTS_BOTTOM_START_X];
+ struttmp.height = c->struts[STRUTS_BOTTOM];
+
+ if (!gdk_rectangle_intersect (&workarea, &struttmp, NULL))
+ continue;
+ }
+
+ if(c->struts[STRUTS_LEFT])
+ {
+ struttmp.x = 0;
+ struttmp.y = c->struts[STRUTS_LEFT_START_Y];
+ struttmp.width = c->struts[STRUTS_LEFT];
+ struttmp.height = c->struts[STRUTS_LEFT_END_Y] - c->struts[STRUTS_LEFT_START_Y];
+
+ if (!gdk_rectangle_intersect (&workarea, &struttmp, NULL))
+ continue;
+ }
+
+ if(c->struts[STRUTS_RIGHT])
+ {
+ struttmp.x = screen_info->width - c->struts[STRUTS_RIGHT];
+ struttmp.y = c->struts[STRUTS_RIGHT_START_Y];
+ struttmp.width = c->struts[STRUTS_RIGHT];
+ struttmp.height = c->struts[STRUTS_RIGHT_END_Y] - c->struts[STRUTS_RIGHT_START_Y];
+
+ if (!gdk_rectangle_intersect (&workarea, &struttmp, NULL))
+ continue;
+ }
+
screen_info->margins[STRUTS_TOP] = MAX (screen_info->margins[STRUTS_TOP], c->struts[STRUTS_TOP]);
screen_info->margins[STRUTS_LEFT] = MAX (screen_info->margins[STRUTS_LEFT], c->struts[STRUTS_LEFT]);
screen_info->margins[STRUTS_RIGHT] = MAX (screen_info->margins[STRUTS_RIGHT], c->struts[STRUTS_RIGHT]);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list