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
This commit is contained in:
Alberts Muktupāvels 2018-12-31 16:29:11 +02:00
parent d5a7bbd094
commit faf1dc08ae
2 changed files with 54 additions and 0 deletions

View File

@ -141,6 +141,7 @@ item(_NET_WM_STATE_FULLSCREEN)
item(_NET_WM_PING) item(_NET_WM_PING)
item(_NET_WM_PID) item(_NET_WM_PID)
item(_NET_WORKAREA) item(_NET_WORKAREA)
item(_NET_WORKAREAS)
item(_NET_SHOWING_DESKTOP) item(_NET_SHOWING_DESKTOP)
item(_NET_DESKTOP_LAYOUT) item(_NET_DESKTOP_LAYOUT)
item(_NET_DESKTOP_NAMES) item(_NET_DESKTOP_NAMES)

View File

@ -904,6 +904,57 @@ set_workspace_names (MetaX11Display *x11_display)
g_string_free (flattened, TRUE); 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 static void
set_work_area_hint (MetaDisplay *display, set_work_area_hint (MetaDisplay *display,
MetaX11Display *x11_display) MetaX11Display *x11_display)
@ -923,6 +974,8 @@ set_work_area_hint (MetaDisplay *display,
MetaWorkspace *workspace = l->data; MetaWorkspace *workspace = l->data;
meta_workspace_get_work_area_all_monitors (workspace, &area); meta_workspace_get_work_area_all_monitors (workspace, &area);
set_workspace_work_area_hint (workspace, x11_display);
tmp[0] = area.x; tmp[0] = area.x;
tmp[1] = area.y; tmp[1] = area.y;
tmp[2] = area.width; tmp[2] = area.width;