summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2018-06-15 00:59:19 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2018-06-16 20:45:17 +0300
commitf69d24282e6aba0dab7813800b8a67662bb71c2e (patch)
tree2c3e6adec3a1b4ad5dac04ac6a1209067578d5b9
parent83b05fd037550b396d3542d73f317a0526b93960 (diff)
downloadmetacity-f69d24282e6aba0dab7813800b8a67662bb71c2e.tar.gz
screen: set per-monitor work areas
In addition to existing property set also new _NET_WORKAREA_Mn property where n is Xinerama monitor index. The property in its form is same as _NET_WORKAREA except that work area is for monitor not whole screen.
-rw-r--r--src/core/atomnames.h1
-rw-r--r--src/core/screen.c42
2 files changed, 42 insertions, 1 deletions
diff --git a/src/core/atomnames.h b/src/core/atomnames.h
index 6e142196..735c78b2 100644
--- a/src/core/atomnames.h
+++ b/src/core/atomnames.h
@@ -133,6 +133,7 @@ item(_NET_WM_STATE_FULLSCREEN)
item(_NET_WM_PING)
item(_NET_WM_PID)
item(_NET_WORKAREA)
+item(_NET_WORKAREA_Mn)
item(_NET_SHOWING_DESKTOP)
item(_NET_DESKTOP_LAYOUT)
item(_NET_DESKTOP_NAMES)
diff --git a/src/core/screen.c b/src/core/screen.c
index 7f9e0b81..21168180 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1847,6 +1847,7 @@ set_work_area_hint (MetaScreen *screen)
GList *tmp_list;
unsigned long *data, *tmp;
MetaRectangle area;
+ int i;
num_workspaces = meta_screen_get_n_workspaces (screen);
data = g_new (unsigned long, num_workspaces * 4);
@@ -1876,8 +1877,47 @@ set_work_area_hint (MetaScreen *screen)
screen->display->atom__NET_WORKAREA,
XA_CARDINAL, 32, PropModeReplace,
(guchar*) data, num_workspaces*4);
- g_free (data);
meta_error_trap_pop (screen->display);
+
+ for (i = 0; i < screen->n_monitor_infos; i++)
+ {
+ gchar *workarea_name;
+ Atom workarea_atom;
+
+ tmp_list = screen->workspaces;
+ tmp = data;
+
+ while (tmp_list != NULL)
+ {
+ MetaWorkspace *workspace = tmp_list->data;
+
+ if (workspace->screen == screen)
+ {
+ meta_workspace_get_work_area_for_monitor (workspace, i, &area);
+
+ tmp[0] = area.x;
+ tmp[1] = area.y;
+ tmp[2] = area.width;
+ tmp[3] = area.height;
+
+ tmp += 4;
+ }
+
+ tmp_list = tmp_list->next;
+ }
+
+ workarea_name = g_strdup_printf ("_NET_WORKAREA_M%d", i);
+ workarea_atom = XInternAtom (screen->display->xdisplay, workarea_name, False);
+ g_free (workarea_name);
+
+ meta_error_trap_push (screen->display);
+ XChangeProperty (screen->display->xdisplay, screen->xroot, workarea_atom,
+ XA_CARDINAL, 32, PropModeReplace,
+ (guchar *) data, num_workspaces * 4);
+ meta_error_trap_pop (screen->display);
+ }
+
+ g_free (data);
}
static gboolean