[PATCH] Only put child windows in EWMH client lists

Hans-Peter Deifel hpdeifel at gmx.de
Sat Mar 8 14:31:48 CET 2014


Previously, only our own decoration windows showed up in the
_NET_CLIENT_LIST_STACKING property. This confused pagers like
xfce4-panel.

The responsible function 'stack_to_window_buf' is also used in a context
where we want to have only children of the root window in the result
buffer. Now stack_to_window_buf and it's helpers accept a parameter
specifying if they should return real_clients (aka application windows)
or other windows.
---
 src/monitor.c |  8 ++++----
 src/monitor.h |  4 ++--
 src/stack.c   | 22 +++++++++++++---------
 src/stack.h   |  4 ++--
 4 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/src/monitor.c b/src/monitor.c
index 85e6af7..3a64599 100644
--- a/src/monitor.c
+++ b/src/monitor.c
@@ -1292,13 +1292,13 @@ int detect_monitors_command(int argc, char **argv, GString* output) {
     return ret;
 }
 
-int monitor_stack_window_count(bool only_clients) {
-    return stack_window_count(g_monitor_stack, only_clients);
+int monitor_stack_window_count(bool real_clients) {
+    return stack_window_count(g_monitor_stack, real_clients);
 }
 
-void monitor_stack_to_window_buf(Window* buf, int len, bool only_clients,
+void monitor_stack_to_window_buf(Window* buf, int len, bool real_clients,
                                  int* remain_len) {
-    stack_to_window_buf(g_monitor_stack, buf, len, only_clients, remain_len);
+    stack_to_window_buf(g_monitor_stack, buf, len, real_clients, remain_len);
 }
 
 HSStack* get_monitor_stack() {
diff --git a/src/monitor.h b/src/monitor.h
index 5d715d3..6a4579e 100644
--- a/src/monitor.h
+++ b/src/monitor.h
@@ -101,8 +101,8 @@ void all_monitors_replace_previous_tag(struct HSTag* old, struct HSTag* new);
 void drop_enternotify_events();
 
 void monitor_restack(HSMonitor* monitor);
-int monitor_stack_window_count(bool only_clients);
-void monitor_stack_to_window_buf(Window* buf, int len, bool only_clients,
+int monitor_stack_window_count(bool real_clients);
+void monitor_stack_to_window_buf(Window* buf, int len, bool real_clients,
                                  int* remain_len);
 struct HSStack* get_monitor_stack();
 
diff --git a/src/stack.c b/src/stack.c
index 7d31e2d..223805b 100644
--- a/src/stack.c
+++ b/src/stack.c
@@ -216,9 +216,9 @@ int print_stack_command(int argc, char** argv, GString* output) {
     return 0;
 }
 
-int stack_window_count(HSStack* stack, bool only_clients) {
+int stack_window_count(HSStack* stack, bool real_clients) {
     int counter = 0;
-    stack_to_window_buf(stack, NULL, 0, only_clients, &counter);
+    stack_to_window_buf(stack, NULL, 0, real_clients, &counter);
     return -counter;
 }
 
@@ -227,7 +227,7 @@ struct s2wb {
     int     len;
     Window* buf;
     int     missing; /* number of slices that could not find space in buf */
-    bool    only_clients; /* whether to include windows that aren't clients */
+    bool    real_clients; /* whether to include windows that aren't clients */
     HSLayer layer;  /* the layer the slice should be added to */
 };
 
@@ -241,7 +241,11 @@ static void slice_to_window_buf(HSSlice* s, struct s2wb* data) {
     switch (s->type) {
         case SLICE_CLIENT:
             if (data->len) {
-                data->buf[0] = s->data.client->dec.decwin;
+                if (data->real_clients) {
+                    data->buf[0] = s->data.client->window;
+                } else {
+                    data->buf[0] = s->data.client->dec.decwin;
+                }
                 data->buf++;
                 data->len--;
             } else {
@@ -249,7 +253,7 @@ static void slice_to_window_buf(HSSlice* s, struct s2wb* data) {
             }
             break;
         case SLICE_WINDOW:
-            if (!data->only_clients) {
+            if (!data->real_clients) {
                 if (data->len) {
                     data->buf[0] = s->data.window;
                     data->buf++;
@@ -261,7 +265,7 @@ static void slice_to_window_buf(HSSlice* s, struct s2wb* data) {
             break;
         case SLICE_MONITOR:
             tag = s->data.monitor->tag;
-            if (!data->only_clients) {
+            if (!data->real_clients) {
                 if (data->len) {
                     data->buf[0] = s->data.monitor->stacking_window;
                     data->buf++;
@@ -272,7 +276,7 @@ static void slice_to_window_buf(HSSlice* s, struct s2wb* data) {
             }
             int remain_len = 0; /* remaining length */
             stack_to_window_buf(tag->stack, data->buf, data->len,
-                                data->only_clients, &remain_len);
+                                data->real_clients, &remain_len);
             int len_used = data->len - remain_len;
             if (remain_len >= 0) {
                 data->buf += len_used;
@@ -286,12 +290,12 @@ static void slice_to_window_buf(HSSlice* s, struct s2wb* data) {
 }
 
 void stack_to_window_buf(HSStack* stack, Window* buf, int len,
-                         bool only_clients, int* remain_len) {
+                         bool real_clients, int* remain_len) {
     struct s2wb data = {
         .len = len,
         .buf = buf,
         .missing = 0,
-        .only_clients = only_clients,
+        .real_clients = real_clients,
     };
     for (int i = 0; i < LAYER_COUNT; i++) {
         data.layer = i;
diff --git a/src/stack.h b/src/stack.h
index fca3168..41748c2 100644
--- a/src/stack.h
+++ b/src/stack.h
@@ -69,8 +69,8 @@ void stack_clear_layer(HSStack* stack, HSLayer layer);
 int print_stack_command(int argc, char** argv, GString* output);
 
 // returns the number of windows in this stack
-int stack_window_count(HSStack* stack, bool only_clients);
-void stack_to_window_buf(HSStack* stack, Window* buf, int len, bool only_clients,
+int stack_window_count(HSStack* stack, bool real_clients);
+void stack_to_window_buf(HSStack* stack, Window* buf, int len, bool real_clients,
                          int* remain_len);
 void stack_restack(HSStack* stack);
 Window stack_lowest_window(HSStack* stack);
-- 
1.9.0




More information about the hlwm mailing list