From d4ceb9f4e325b1b115ca36608d4dda716a6e1a4f Mon Sep 17 00:00:00 2001 From: okan Date: Wed, 17 Sep 2014 14:31:37 +0000 Subject: [PATCH] Introduce a check to see if a group holds only 'sticky' clients and use this check to decide if a group is virtually empty. Rationale: if a group contains *only* 'sticky' clients, it should be skipped while cycling through groups. Apply similar logic to the group menu. Based on an idea from phessler@, who also tested another version. --- app/cwm/calmwm.h | 4 ++-- app/cwm/group.c | 17 +++++++++++++++-- app/cwm/mousefunc.c | 4 ++-- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/cwm/calmwm.h b/app/cwm/calmwm.h index 8e83e2fbc..f25e7b57a 100644 --- a/app/cwm/calmwm.h +++ b/app/cwm/calmwm.h @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: calmwm.h,v 1.275 2014/09/10 20:30:38 okan Exp $ + * $OpenBSD: calmwm.h,v 1.276 2014/09/17 14:31:37 okan Exp $ */ #ifndef _CALMWM_H_ @@ -407,11 +407,11 @@ void group_cycle(struct screen_ctx *, int); int group_hidden_state(struct group_ctx *); void group_hide(struct group_ctx *); void group_hidetoggle(struct screen_ctx *, int); +int group_holds_only_sticky(struct group_ctx *); void group_init(struct screen_ctx *); void group_movetogroup(struct client_ctx *, int); void group_only(struct screen_ctx *, int); void group_show(struct group_ctx *); -void group_sticky(struct client_ctx *); void group_sticky_toggle_enter(struct client_ctx *); void group_sticky_toggle_exit(struct client_ctx *); void group_update_names(struct screen_ctx *); diff --git a/app/cwm/group.c b/app/cwm/group.c index ee86b52b7..0d09da7a8 100644 --- a/app/cwm/group.c +++ b/app/cwm/group.c @@ -16,7 +16,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: group.c,v 1.102 2014/09/08 21:15:14 okan Exp $ + * $OpenBSD: group.c,v 1.103 2014/09/17 14:31:37 okan Exp $ */ #include @@ -202,6 +202,19 @@ group_sticky_toggle_exit(struct client_ctx *cc) client_draw_border(cc); } +int +group_holds_only_sticky(struct group_ctx *gc) +{ + struct client_ctx *cc; + + /* Check if all clients in the group are 'sticky'. */ + TAILQ_FOREACH(cc, &gc->clientq, group_entry) { + if (!(cc->flags & CLIENT_STICKY)) + return(0); + } + return(1); +} + /* * If all clients in a group are hidden, then the group state is hidden. */ @@ -283,7 +296,7 @@ group_cycle(struct screen_ctx *sc, int flags) if (gc == sc->group_active) break; - if (!TAILQ_EMPTY(&gc->clientq) && showgroup == NULL) + if (!group_holds_only_sticky(gc) && showgroup == NULL) showgroup = gc; else if (!group_hidden_state(gc)) group_hide(gc); diff --git a/app/cwm/mousefunc.c b/app/cwm/mousefunc.c index c8f7a7302..5114d9aa4 100644 --- a/app/cwm/mousefunc.c +++ b/app/cwm/mousefunc.c @@ -16,7 +16,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: mousefunc.c,v 1.80 2014/09/08 21:15:14 okan Exp $ + * $OpenBSD: mousefunc.c,v 1.81 2014/09/17 14:31:37 okan Exp $ */ #include @@ -188,7 +188,7 @@ mousefunc_menu_group(struct client_ctx *cc, union arg *arg) TAILQ_INIT(&menuq); TAILQ_FOREACH(gc, &sc->groupq, entry) { - if (TAILQ_EMPTY(&gc->clientq)) + if (group_holds_only_sticky(gc)) continue; menuq_add(&menuq, gc, group_hidden_state(gc) ? "%d: [%s]" : "%d: %s",