From 5e07478843893af969601fa0c4ed49d2bb95b04e 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 _GTK_WORKAREAS_Dn In addition to existing _NET_WORKAREA property set also new _GTK_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 https://gitlab.freedesktop.org/xdg/xdg-specs/merge_requests/22 https://gitlab.gnome.org/GNOME/mutter/merge_requests/370 --- 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 4c1b49ede..4b25b099a 100644 --- a/src/x11/atomnames.h +++ b/src/x11/atomnames.h @@ -63,6 +63,7 @@ item(_GTK_MENUBAR_OBJECT_PATH) item(_GTK_FRAME_EXTENTS) item(_GTK_SHOW_WINDOW_MENU) item(_GTK_EDGE_CONSTRAINTS) +item(_GTK_WORKAREAS) item(_GNOME_WM_KEYBINDINGS) item(_GNOME_PANEL_ACTION) item(_GNOME_PANEL_ACTION_MAIN_MENU) diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 3e59c96c6..87d8a2bfa 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -604,6 +604,7 @@ set_supported_hint (MetaX11Display *x11_display) x11_display->atom__GTK_FRAME_EXTENTS, x11_display->atom__GTK_SHOW_WINDOW_MENU, x11_display->atom__GTK_EDGE_CONSTRAINTS, + x11_display->atom__GTK_WORKAREAS, }; XChangeProperty (x11_display->xdisplay, @@ -913,6 +914,56 @@ 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; + g_autofree char *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 ("_GTK_WORKAREAS_D%d", + meta_workspace_index (workspace)); + + workarea_atom = XInternAtom (x11_display->xdisplay, workarea_name, False); + + 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) @@ -932,6 +983,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;