diff --git a/src/client.c b/src/client.c index bea7ea8..8575c2c 100644 --- a/src/client.c +++ b/src/client.c @@ -548,7 +548,8 @@ _client_tab(struct client *c, struct client *cm) /* Do not tab already tabbed client */ if(c->flags & (CLIENT_TABBED | CLIENT_TABMASTER) - || c->tag != cm->tag || c == cm) + || c->tag != cm->tag || c == cm + || (c->flags & CLIENT_IGNORE_TAG) != (cm->flags & CLIENT_IGNORE_TAG)) return; layout_split_arrange_closed(c); @@ -1459,6 +1460,25 @@ uicb_client_toggle_free(Uicb cmd) } } +void uicb_client_toggle_ignore_tag(Uicb cmd) +{ + struct client *c; + (void)cmd; + + if(!(W->client)) + return; + + W->client->flags ^= CLIENT_IGNORE_TAG; + + /* Set tabbed client of toggled client as ignore_tag */ + if(W->client->flags & CLIENT_TABMASTER) + { + SLIST_FOREACH(c, &W->client->tag->clients, tnext) + if(c->tabmaster == W->client && c != W->client) + c->flags ^= CLIENT_IGNORE_TAG; + } +} + void uicb_client_tab_next_opened(Uicb cmd) { diff --git a/src/client.h b/src/client.h index 4645849..394e0d6 100644 --- a/src/client.h +++ b/src/client.h @@ -58,6 +58,7 @@ void client_update_props(struct client *c, Flags f); void client_fac_hint(struct client *c); void uicb_client_untab(Uicb cmd); void uicb_client_toggle_free(Uicb cmd); +void uicb_client_toggle_ignore_tag(Uicb cmd); void uicb_client_tab_next_opened(Uicb cmd); /* Generated */ diff --git a/src/config.h b/src/config.h index 7e250de..9b83688 100644 --- a/src/config.h +++ b/src/config.h @@ -55,33 +55,34 @@ static const struct { char *name; void (*func)(Uicb cmd); } uicb_list[] = { "layout_integrate_bottom", uicb_layout_integrate_Bottom }, /* Client */ - { "client_close", uicb_client_close }, - { "client_resize_right", uicb_client_resize_Right }, - { "client_resize_left", uicb_client_resize_Left }, - { "client_resize_top", uicb_client_resize_Top }, - { "client_resize_bottom", uicb_client_resize_Bottom }, - { "client_focus_right", uicb_client_focus_Right }, - { "client_focus_left", uicb_client_focus_Left }, - { "client_focus_top", uicb_client_focus_Top }, - { "client_focus_bottom", uicb_client_focus_Bottom }, - { "client_tab_right", uicb_client_tab_Right }, - { "client_tab_left", uicb_client_tab_Left }, - { "client_tab_top", uicb_client_tab_Top }, - { "client_tab_bottom", uicb_client_tab_Bottom }, - { "client_swap_right", uicb_client_swap_Right }, - { "client_swap_left", uicb_client_swap_Left }, - { "client_swap_top", uicb_client_swap_Top }, - { "client_swap_bottom", uicb_client_swap_Bottom }, - { "client_focus_next", uicb_client_focus_next }, - { "client_focus_prev", uicb_client_focus_prev }, - { "client_swap_next", uicb_client_swapsel_next }, - { "client_swap_prev", uicb_client_swapsel_prev }, - { "client_untab", uicb_client_untab }, - { "client_focus_next_tab", uicb_client_focus_next_tab }, - { "client_focus_prev_tab", uicb_client_focus_prev_tab }, - { "client_focus_click", uicb_client_focus_click }, - { "client_toggle_free", uicb_client_toggle_free }, - { "client_tab_next_opened", uicb_client_tab_next_opened }, + { "client_close", uicb_client_close }, + { "client_resize_right", uicb_client_resize_Right }, + { "client_resize_left", uicb_client_resize_Left }, + { "client_resize_top", uicb_client_resize_Top }, + { "client_resize_bottom", uicb_client_resize_Bottom }, + { "client_focus_right", uicb_client_focus_Right }, + { "client_focus_left", uicb_client_focus_Left }, + { "client_focus_top", uicb_client_focus_Top }, + { "client_focus_bottom", uicb_client_focus_Bottom }, + { "client_tab_right", uicb_client_tab_Right }, + { "client_tab_left", uicb_client_tab_Left }, + { "client_tab_top", uicb_client_tab_Top }, + { "client_tab_bottom", uicb_client_tab_Bottom }, + { "client_swap_right", uicb_client_swap_Right }, + { "client_swap_left", uicb_client_swap_Left }, + { "client_swap_top", uicb_client_swap_Top }, + { "client_swap_bottom", uicb_client_swap_Bottom }, + { "client_focus_next", uicb_client_focus_next }, + { "client_focus_prev", uicb_client_focus_prev }, + { "client_swap_next", uicb_client_swapsel_next }, + { "client_swap_prev", uicb_client_swapsel_prev }, + { "client_untab", uicb_client_untab }, + { "client_focus_next_tab", uicb_client_focus_next_tab }, + { "client_focus_prev_tab", uicb_client_focus_prev_tab }, + { "client_focus_click", uicb_client_focus_click }, + { "client_toggle_free", uicb_client_toggle_free }, + { "client_toggle_ignore_tag", uicb_client_toggle_ignore_tag }, + { "client_tab_next_opened", uicb_client_tab_next_opened }, /* Status */ { "status" , uicb_status }, diff --git a/src/tag.c b/src/tag.c index 053c79c..4a2e968 100644 --- a/src/tag.c +++ b/src/tag.c @@ -59,8 +59,8 @@ tag_screen(struct screen *s, struct tag *t) /* Move clients if they ignore tags */ SLIST_FOREACH(c, &W->h.client, next) - if (c->flags & CLIENT_IGNORE_TAG) - tag_client(c->screen->seltag, c); + if (c->flags & CLIENT_IGNORE_TAG && c->screen == s) + tag_client(s->seltag, c); clients_arrange_map();