From faf1dc08ae432ef596ce52f835d8cbebb97bb72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Mon, 31 Dec 2018 16:29:11 +0200 Subject: [PATCH] x11-display: add support for _NET_WORKAREAS_Dn In addition to existing property set also new _NET_WORKAREAS_Dn property where n is desktop number (between 0 and _NET_NUMBER_OF_DESKTOPS - 1). https://mail.gnome.org/archives/wm-spec-list/2018-December/msg00000.html --- src/x11/atomnames.h | 1 + src/x11/meta-x11-display.c | 53 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/src/x11/atomnames.h b/src/x11/atomnames.h index b61f47ff4..5032cbc07 100644 --- a/src/x11/atomnames.h +++ b/src/x11/atomnames.h @@ -141,6 +141,7 @@ item(_NET_WM_STATE_FULLSCREEN) item(_NET_WM_PING) item(_NET_WM_PID) item(_NET_WORKAREA) +item(_NET_WORKAREAS) 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 47fb47f83..42fd54e88 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -904,6 +904,57 @@ set_workspace_names (MetaX11Display *x11_display) g_string_free (flattened, TRUE); } +static void +set_workspace_work_area_hint (MetaWorkspace *workspace, + MetaX11Display *x11_display) +{ + MetaMonitorManager *monitor_manager; + GList *logical_monitors; + GList *l; + int num_monitors; + unsigned long *data; + unsigned long *tmp; + gchar *workarea_name; + Atom workarea_atom; + + monitor_manager = meta_backend_get_monitor_manager (meta_get_backend ()); + logical_monitors = meta_monitor_manager_get_logical_monitors (monitor_manager); + num_monitors = meta_monitor_manager_get_num_logical_monitors (monitor_manager); + + data = g_new (unsigned long, num_monitors * 4); + tmp = data; + + for (l = logical_monitors; l; l = l->next) + { + MetaRectangle area; + + meta_workspace_get_work_area_for_logical_monitor (workspace, l->data, &area); + + tmp[0] = area.x; + tmp[1] = area.y; + tmp[2] = area.width; + tmp[3] = area.height; + + tmp += 4; + } + + workarea_name = g_strdup_printf ("_NET_WORKAREAS_D%d", + meta_workspace_index (workspace)); + + 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_monitors * 4); + meta_x11_error_trap_pop (x11_display); + + g_free (data); +} + static void set_work_area_hint (MetaDisplay *display, MetaX11Display *x11_display) @@ -923,6 +974,8 @@ set_work_area_hint (MetaDisplay *display, MetaWorkspace *workspace = l->data; meta_workspace_get_work_area_all_monitors (workspace, &area); + set_workspace_work_area_hint (workspace, x11_display); + tmp[0] = area.x; tmp[1] = area.y; tmp[2] = area.width;