diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2018-06-15 00:59:19 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2018-06-16 20:45:17 +0300 |
commit | f69d24282e6aba0dab7813800b8a67662bb71c2e (patch) | |
tree | 2c3e6adec3a1b4ad5dac04ac6a1209067578d5b9 | |
parent | 83b05fd037550b396d3542d73f317a0526b93960 (diff) | |
download | metacity-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.h | 1 | ||||
-rw-r--r-- | src/core/screen.c | 42 |
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 |