diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2018-06-15 01:17:24 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2018-07-24 16:15:32 +0300 |
commit | b413672a51d1fc59cb14709a38a0af20b09c8935 (patch) | |
tree | 2e314ff63c374f2521aac7b76879d374c449aaba | |
parent | a3da4b8d5bd217c0262fd9361036877d155a300f (diff) | |
download | mutter-wip/muktupavels/work-areas.tar.gz |
x11-display: set per-monitor work areaswip/muktupavels/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/x11/atomnames.h | 1 | ||||
-rw-r--r-- | src/x11/meta-x11-display.c | 47 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/x11/atomnames.h b/src/x11/atomnames.h index ed3c72a09..0a5b3dedd 100644 --- a/src/x11/atomnames.h +++ b/src/x11/atomnames.h @@ -142,6 +142,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/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index b2510b530..4fb251e57 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -915,6 +915,9 @@ set_work_area_hint (MetaDisplay *display, GList *l; unsigned long *data, *tmp; MetaRectangle area; + MetaBackend *backend; + MetaMonitorManager *monitor_manager; + GList *logical_monitors, *lm; num_workspaces = meta_workspace_manager_get_n_workspaces (workspace_manager); data = g_new (unsigned long, num_workspaces * 4); @@ -941,6 +944,50 @@ set_work_area_hint (MetaDisplay *display, (guchar*) data, num_workspaces*4); meta_x11_error_trap_pop (x11_display); + backend = meta_get_backend (); + monitor_manager = meta_backend_get_monitor_manager (backend); + logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); + + for (lm = logical_monitors; lm; lm = lm->next) + { + MetaLogicalMonitor *logical_monitor = lm->data; + int xinerama_index; + gchar *workarea_name; + Atom workarea_atom; + + tmp = data; + + for (l = workspace_manager->workspaces; l; l = l->next) + { + MetaWorkspace *workspace = l->data; + + meta_workspace_get_work_area_for_logical_monitor (workspace, + logical_monitor, + &area); + + tmp[0] = area.x; + tmp[1] = area.y; + tmp[2] = area.width; + tmp[3] = area.height; + + tmp += 4; + } + + xinerama_index = meta_x11_display_logical_monitor_to_xinerama_index (x11_display, + logical_monitor); + workarea_name = g_strdup_printf ("_NET_WORKAREA_M%d", xinerama_index); + workarea_atom = XInternAtom (x11_display->xdisplay, workarea_name, False); + g_free (workarea_name); + + meta_x11_error_trap_push (x11_display); + XChangeProperty (x11_display->xdisplay, + x11_display->xroot, + workarea_atom, + XA_CARDINAL, 32, PropModeReplace, + (guchar*) data, num_workspaces*4); + meta_x11_error_trap_pop (x11_display); + } + g_free (data); } |