]> git.sur5r.net Git - i3/i3/commitdiff
Dont include dock clients in ewmh lists
authorTony Crisci <tony@dubstepdish.com>
Fri, 2 May 2014 20:54:34 +0000 (16:54 -0400)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 3 May 2014 13:08:31 +0000 (15:08 +0200)
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.

include/con.h
src/con.c
src/x.c
testcases/t/223-net-client-list.t

index 0205dfc6ea037936161444931ee33177667111db..b8fd60adc06865bda11e38f276bad15c1f603bb3 100644 (file)
@@ -37,6 +37,12 @@ void con_focus(Con *con);
  */
 bool con_is_leaf(Con *con);
 
+/**
+ * Returns true when this con is a leaf node with a managed X11 window (e.g.,
+ * excluding dock containers)
+ */
+bool con_has_managed_window(Con *con);
+
 /*
  * Returns true if a container should be considered split.
  *
index 6918d64880064ead3f013188cda973efa52c7e5d..66c9db69d88e3927473c3e1432d04c8c22c3a6d0 100644 (file)
--- a/src/con.c
+++ b/src/con.c
@@ -241,6 +241,17 @@ bool con_is_leaf(Con *con) {
     return TAILQ_EMPTY(&(con->nodes_head));
 }
 
+/*
+ * Returns true when this con is a leaf node with a managed X11 window (e.g.,
+ * excluding dock containers)
+ */
+bool con_has_managed_window(Con *con) {
+    return (con != NULL
+            && con->window != NULL
+            && con->window->id != XCB_WINDOW_NONE
+            && con_get_workspace(con) != NULL);
+}
+
 /**
  * Returns true if this node has regular or floating children.
  *
diff --git a/src/x.c b/src/x.c
index 02fc338fb12826e655109633a00dd1b6530d1010..8e7a710c7b7852db16a1cde7b6843394b27b9505 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -908,7 +908,7 @@ void x_push_changes(Con *con) {
      * stack afterwards */
     int cnt = 0;
     CIRCLEQ_FOREACH_REVERSE(state, &state_head, state)
-        if (state->con && state->con->window)
+        if (con_has_managed_window(state->con))
             cnt++;
 
     /* The bottom-to-top window stack of all windows which are managed by i3.
@@ -925,7 +925,7 @@ void x_push_changes(Con *con) {
 
     /* X11 correctly represents the stack if we push it from bottom to top */
     CIRCLEQ_FOREACH_REVERSE(state, &state_head, state) {
-        if (state->con && state->con->window)
+        if (con_has_managed_window(state->con))
             memcpy(walk++, &(state->con->window->id), sizeof(xcb_window_t));
 
         //DLOG("stack: 0x%08x\n", state->id);
@@ -956,7 +956,7 @@ void x_push_changes(Con *con) {
 
         /* reorder by initial mapping */
         TAILQ_FOREACH(state, &initial_mapping_head, initial_mapping_order) {
-            if (state->con && state->con->window)
+            if (con_has_managed_window(state->con))
                 *walk++ = state->con->window->id;
         }
 
index 74bd2cdf546d16ed2c604116e61e4f0cd6085870..82855adedc2b558d6a7952968fb85b687d5976a1 100644 (file)
@@ -96,4 +96,13 @@ wait_for_unmap($win3);
 @clients = get_client_list;
 is(@clients, 0, 'Removed unmapped client from list (0)');
 
+# Dock clients should not be included in this list
+
+my $dock_win = open_window({
+        window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK'),
+    });
+
+@clients = get_client_list;
+is(@clients, 0, 'Dock clients are not included in the list');
+
 done_testing;