goto ignore_end;
}
- tree_close(con, DONT_KILL_WINDOW, false, false);
+ /* Since we close the container, we need to unset _NET_WM_DESKTOP and
+ * _NET_WM_STATE according to the spec. */
+ xcb_delete_property(conn, event->window, A__NET_WM_DESKTOP);
+ xcb_delete_property(conn, event->window, A__NET_WM_STATE);
+
+ tree_close_internal(con, DONT_KILL_WINDOW, false, false);
tree_render();
ignore_end:
con->sticky = !con->sticky;
DLOG("New sticky status for con = %p is %i.\n", con, con->sticky);
+ ewmh_update_sticky(con->window->id, con->sticky);
output_push_sticky_windows(focused);
+ ewmh_update_wm_desktop();
}
tree_render();
* a request to focus the given workspace. See
* http://standards.freedesktop.org/wm-spec/latest/ar01s03.html#idm140251368135008
* */
- Con *output;
- uint32_t idx = 0;
DLOG("Request to change current desktop to index %d\n", event->data.data32[0]);
+ Con *ws = ewmh_get_workspace_by_index(event->data.data32[0]);
+ if (ws == NULL) {
+ ELOG("Could not determine workspace for this index, ignoring request.\n");
+ return;
+ }
- TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
- Con *ws;
- TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
- if (STARTS_WITH(ws->name, "__"))
- continue;
-
- if (idx == event->data.data32[0]) {
- /* data32[1] is a timestamp used to prevent focus race conditions */
- if (event->data.data32[1])
- last_timestamp = event->data.data32[1];
+ DLOG("Handling request to focus workspace %s\n", ws->name);
+ workspace_show(ws);
+ tree_render();
+ } else if (event->type == A__NET_WM_DESKTOP) {
+ uint32_t index = event->data.data32[0];
+ DLOG("Request to move window %d to EWMH desktop index %d\n", event->window, index);
- DLOG("Handling request to focus workspace %s\n", ws->name);
+ Con *con = con_by_window_id(event->window);
+ if (con == NULL) {
+ DLOG("Couldn't find con for window %d, ignoring the request.\n", event->window);
+ return;
+ }
- workspace_show(ws);
- tree_render();
+ if (index == NET_WM_DESKTOP_ALL) {
+ /* The window is requesting to be visible on all workspaces, so
+ * let's float it and make it sticky. */
+ DLOG("The window was requested to be visible on all workspaces, making it sticky and floating.\n");
- return;
- }
+ floating_enable(con, false);
- ++idx;
+ con->sticky = true;
+ ewmh_update_sticky(con->window->id, true);
+ output_push_sticky_windows(focused);
+ } else {
+ Con *ws = ewmh_get_workspace_by_index(index);
+ if (ws == NULL) {
+ ELOG("Could not determine workspace for this index, ignoring request.\n");
+ return;
}
+
+ con_move_to_workspace(con, ws, true, false, false);
}
+
+ tree_render();
+ ewmh_update_wm_desktop();
} else if (event->type == A__NET_CLOSE_WINDOW) {
/*
* Pagers wanting to close a window MUST send a _NET_CLOSE_WINDOW
if (event->data.data32[0])
last_timestamp = event->data.data32[0];
- tree_close(con, KILL_WINDOW, false, false);
+ tree_close_internal(con, KILL_WINDOW, false, false);
tree_render();
} else {
DLOG("Couldn't find con for _NET_CLOSE_WINDOW request. (window = %d)\n", event->window);
break;
}
} else {
- DLOG("unhandled clientmessage\n");
- return;
+ DLOG("Skipping client message for unhandled type %d\n", event->type);
}
}