On Sat, Mar 08, 2014 at 02:31:48PM +0100, Hans-Peter Deifel wrote: > Previously, only our own decoration windows showed up in the > _NET_CLIENT_LIST_STACKING property. This confused pagers like > xfce4-panel. And of course it was not EWMH conform :) Thanks, great patch! 331e8bf Only put child windows in EWMH client lists Cheers, Thorsten > > 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 >
Attachment:
pgp5RVuLxM0fO.pgp
Description: PGP signature