Dont include dock clients in ewmh lists
Patch status: needinfo
Patch by Tony Crisci
Long description:
http://standards.freedesktop.org/wm-spec/latest/ar01s03.html#idm140251368149456 The _NET_CLIENT_LIST property of the root window: > These arrays contain all X Windows managed by the Window Manager. Dock clients are not managed windows, so they should not be included in _NET_CLIENT_LIST or _NET_CLIENT_LIST_STACKING.
To apply this patch, use:
curl http://cr.i3wm.org/patch/523/raw.patch | git am
b/include/con.h
| 24 |
@@ -37,6 +37,12 @@ void con_focus(Con *con); |
| 25 |
*/ |
| 26 |
bool con_is_leaf(Con *con); |
| 27 |
|
| 28 |
+/** |
| 29 |
+ * Returns true when this is an attached container that hosts a managed client |
| 30 |
+ * window (accepts null). |
| 31 |
+ */ |
| 32 |
+bool con_is_top_level(Con *con); |
| 33 |
+ |
| 34 |
/* |
| 35 |
* Returns true if a container should be considered split. |
| 36 |
* |
b/src/con.c
| 41 |
@@ -241,6 +241,17 @@ bool con_is_leaf(Con *con) {
|
| 42 |
return TAILQ_EMPTY(&(con->nodes_head)); |
| 43 |
} |
| 44 |
|
| 45 |
+/* |
| 46 |
+ * Returns true when this is an attached container that hosts a managed client |
| 47 |
+ * window (accepts null). |
| 48 |
+ */ |
| 49 |
+bool con_is_top_level(Con *con) {
|
| 50 |
+ return (con != NULL |
| 51 |
+ && con->window != NULL |
| 52 |
+ && con->window->id != XCB_WINDOW_NONE |
| 53 |
+ && con_get_workspace(con) != NULL); |
| 54 |
+} |
| 55 |
+ |
| 56 |
/** |
| 57 |
* Returns true if this node has regular or floating children. |
| 58 |
* |
b/src/x.c
| 63 |
@@ -908,7 +908,7 @@ void x_push_changes(Con *con) {
|
| 64 |
* stack afterwards */ |
| 65 |
int cnt = 0; |
| 66 |
CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) |
| 67 |
- if (state->con && state->con->window) |
| 68 |
+ if (con_is_top_level(state->con)) |
| 69 |
cnt++; |
| 70 |
|
| 71 |
/* The bottom-to-top window stack of all windows which are managed by i3. |
| 72 |
@@ -925,7 +925,7 @@ void x_push_changes(Con *con) {
|
| 73 |
|
| 74 |
/* X11 correctly represents the stack if we push it from bottom to top */ |
| 75 |
CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
|
| 76 |
- if (state->con && state->con->window) |
| 77 |
+ if (con_is_top_level(state->con)) |
| 78 |
memcpy(walk++, &(state->con->window->id), sizeof(xcb_window_t)); |
| 79 |
|
| 80 |
//DLOG("stack: 0x%08x\n", state->id);
|
| 81 |
@@ -956,7 +956,7 @@ void x_push_changes(Con *con) {
|
| 82 |
|
| 83 |
/* reorder by initial mapping */ |
| 84 |
TAILQ_FOREACH(state, &initial_mapping_head, initial_mapping_order) {
|
| 85 |
- if (state->con && state->con->window) |
| 86 |
+ if (con_is_top_level(state->con)) |
| 87 |
*walk++ = state->con->window->id; |
| 88 |
} |
| 89 |
|
b/testcases/t/223-net-client-list.t
| 94 |
@@ -96,4 +96,13 @@ wait_for_unmap($win3); |
| 95 |
@clients = get_client_list; |
| 96 |
is(@clients, 0, 'Removed unmapped client from list (0)'); |
| 97 |
|
| 98 |
+# Dock clients should not be included in this list |
| 99 |
+ |
| 100 |
+my $dock_win = open_window({
|
| 101 |
+ window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'), |
| 102 |
+ }); |
| 103 |
+ |
| 104 |
+@clients = get_client_list; |
| 105 |
+is(@clients, 0, 'Dock clients are not included in the list'); |
| 106 |
+ |
| 107 |
done_testing; |