summaryrefslogtreecommitdiff
path: root/xwayland/window-manager.c
diff options
context:
space:
mode:
authorGiulio Camuffo <giuliocamuffo@gmail.com>2014-12-13 18:06:34 +0200
committerBryce Harrington <bryce@osg.samsung.com>2015-01-27 14:10:07 -0800
commite90ea44a02e3652c0a310f8548a6f54a63649d60 (patch)
tree60faaecece85c14a044d246f83743a4b5e187467 /xwayland/window-manager.c
parent6deb09ef8a72164947cdfa5f2414e292c7672c9c (diff)
downloadweston-e90ea44a02e3652c0a310f8548a6f54a63649d60.tar.gz
xwm: set the _NET_WM_DESKTOP property of the windows
Some X clients use the _NET_WM_DESKTOP property to tell if the window is mapped or not. If set, it should say the virtual desktop the window is currently in, if unset it means the window is unmapped. The xwm currently has no way to know how many virtual desktops the shell plugin has, or if it even implements the metaphor. For now just set the property to 0, meaning the first desktop, if the window is mapped, and delete the property when unmapped. Reviewed-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Bryce Harrington <bryce@osg.samsung.com>
Diffstat (limited to 'xwayland/window-manager.c')
-rw-r--r--xwayland/window-manager.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
index 6f1996f0..4d3611f2 100644
--- a/xwayland/window-manager.c
+++ b/xwayland/window-manager.c
@@ -863,6 +863,29 @@ weston_wm_window_create_frame(struct weston_wm_window *window)
hash_table_insert(wm->window_hash, window->frame_id, window);
}
+/*
+ * Sets the _NET_WM_DESKTOP property for the window to 'desktop'.
+ * Passing a <0 desktop value deletes the property.
+ */
+static void
+weston_wm_window_set_virtual_desktop(struct weston_wm_window *window,
+ int desktop)
+{
+ if (desktop >= 0) {
+ xcb_change_property(window->wm->conn,
+ XCB_PROP_MODE_REPLACE,
+ window->id,
+ window->wm->atom.net_wm_desktop,
+ XCB_ATOM_CARDINAL,
+ 32, /* format */
+ 1, &desktop);
+ } else {
+ xcb_delete_property(window->wm->conn,
+ window->id,
+ window->wm->atom.net_wm_desktop);
+ }
+}
+
static void
weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
{
@@ -888,6 +911,7 @@ weston_wm_handle_map_request(struct weston_wm *wm, xcb_generic_event_t *event)
weston_wm_window_set_wm_state(window, ICCCM_NORMAL_STATE);
weston_wm_window_set_net_wm_state(window);
+ weston_wm_window_set_virtual_desktop(window, 0);
xcb_map_window(wm->conn, map_request->window);
xcb_map_window(wm->conn, window->frame_id);
@@ -935,6 +959,10 @@ weston_wm_handle_unmap_notify(struct weston_wm *wm, xcb_generic_event_t *event)
window->surface = NULL;
window->shsurf = NULL;
window->view = NULL;
+
+ weston_wm_window_set_wm_state(window, ICCCM_WITHDRAWN_STATE);
+ weston_wm_window_set_virtual_desktop(window, -1);
+
xcb_unmap_window(wm->conn, window->frame_id);
}
@@ -1123,6 +1151,7 @@ weston_wm_window_destroy(struct weston_wm_window *window)
xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0);
xcb_destroy_window(wm->conn, window->frame_id);
weston_wm_window_set_wm_state(window, ICCCM_WITHDRAWN_STATE);
+ weston_wm_window_set_virtual_desktop(window, -1);
hash_table_remove(wm->window_hash, window->frame_id);
window->frame_id = XCB_WINDOW_NONE;
}
@@ -1858,6 +1887,7 @@ weston_wm_get_resources(struct weston_wm *wm)
{ "_NET_WM_STATE_FULLSCREEN", F(atom.net_wm_state_fullscreen) },
{ "_NET_WM_USER_TIME", F(atom.net_wm_user_time) },
{ "_NET_WM_ICON_NAME", F(atom.net_wm_icon_name) },
+ { "_NET_WM_DESKTOP", F(atom.net_wm_desktop) },
{ "_NET_WM_WINDOW_TYPE", F(atom.net_wm_window_type) },
{ "_NET_WM_WINDOW_TYPE_DESKTOP", F(atom.net_wm_window_type_desktop) },