summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2018-12-23 17:58:16 +0200
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2020-01-28 15:16:29 +0200
commit3d8b03dc68774e35d80bdb6eebba2cce75551933 (patch)
treebeb27953997c790e1d99672429bbdc3d28cbb5c7
parent36ef44dd4d79501dc5962bf7923e5fcf9308e4a3 (diff)
downloadmetacity-3d8b03dc68774e35d80bdb6eebba2cce75551933.tar.gz
screen: 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/metacity/merge_requests/3
-rw-r--r--src/core/atomnames.h1
-rw-r--r--src/core/screen.c47
2 files changed, 47 insertions, 1 deletions
diff --git a/src/core/atomnames.h b/src/core/atomnames.h
index e44dc2f3..8e2b4593 100644
--- a/src/core/atomnames.h
+++ b/src/core/atomnames.h
@@ -60,6 +60,7 @@ item(_METACITY_TOGGLE_VERBOSE)
item(_GTK_THEME_VARIANT)
item(_GTK_FRAME_EXTENTS)
item(_GTK_SHOW_WINDOW_MENU)
+item(_GTK_WORKAREAS)
item(_GNOME_PANEL_ACTION)
item(_GNOME_PANEL_ACTION_MAIN_MENU)
item(_GNOME_PANEL_ACTION_RUN_DIALOG)
diff --git a/src/core/screen.c b/src/core/screen.c
index 87474f74..5560bdd2 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -100,7 +100,8 @@ set_supported_hint (MetaScreen *screen)
#undef EWMH_ATOMS_ONLY
screen->display->atom__GTK_FRAME_EXTENTS,
- screen->display->atom__GTK_SHOW_WINDOW_MENU
+ screen->display->atom__GTK_SHOW_WINDOW_MENU,
+ screen->display->atom__GTK_WORKAREAS
};
XChangeProperty (screen->display->xdisplay, screen->xroot,
@@ -1838,6 +1839,48 @@ meta_create_offscreen_window (Display *xdisplay,
}
static void
+set_workspace_work_area_hint (MetaWorkspace *workspace,
+ MetaScreen *screen)
+{
+ unsigned long *data;
+ unsigned long *tmp;
+ int i;
+ gchar *workarea_name;
+ Atom workarea_atom;
+
+ data = g_new (unsigned long, screen->n_monitor_infos * 4);
+ tmp = data;
+
+ for (i = 0; i < screen->n_monitor_infos; i++)
+ {
+ MetaRectangle area;
+
+ 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;
+ }
+
+ workarea_name = g_strdup_printf ("_GTK_WORKAREAS_D%d",
+ meta_workspace_index (workspace));
+
+ 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, screen->n_monitor_infos * 4);
+ meta_error_trap_pop (screen->display);
+
+ g_free (data);
+}
+
+static void
set_work_area_hint (MetaScreen *screen)
{
int num_workspaces;
@@ -1857,6 +1900,8 @@ set_work_area_hint (MetaScreen *screen)
if (workspace->screen == screen)
{
meta_workspace_get_work_area_all_monitors (workspace, &area);
+ set_workspace_work_area_hint (workspace, screen);
+
tmp[0] = area.x;
tmp[1] = area.y;
tmp[2] = area.width;