[mutter/wip/muktupavels/work-areas-v2] x11-display: add support for _NET_WORKAREAS_Dn



commit 8875e1c55ace7b4a87d99889a9569c4c25cd6b19
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Mon Dec 31 16:29:11 2018 +0200

    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
    https://gitlab.gnome.org/GNOME/mutter/merge_requests/370

 src/x11/atomnames.h        |  1 +
 src/x11/meta-x11-display.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
---
diff --git a/src/x11/atomnames.h b/src/x11/atomnames.h
index 4099d5d31..ed24777c9 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_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 3e59c96c6..1b2ffcdc4 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -913,6 +913,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 ("_NET_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 +982,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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]