summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2014-09-17 14:31:37 +0000
committerokan <okan>2014-09-17 14:31:37 +0000
commit74f4a1bad98bdb25212b32d15fa411d2ed16b6df (patch)
tree420b1d92baeb31357dfa062a904282bc439e7084
parent4b6dc963983906e9a2866565da003840037dff23 (diff)
downloadcwm-74f4a1bad98bdb25212b32d15fa411d2ed16b6df.tar.gz
cwm-74f4a1bad98bdb25212b32d15fa411d2ed16b6df.tar.xz
cwm-74f4a1bad98bdb25212b32d15fa411d2ed16b6df.zip
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.
-rw-r--r--calmwm.h2
-rw-r--r--group.c15
-rw-r--r--mousefunc.c2
3 files changed, 16 insertions, 3 deletions
diff --git a/calmwm.h b/calmwm.h
index eda8904..23879c5 100644
--- a/calmwm.h
+++ b/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/group.c b/group.c
index bc8c300..8976f86 100644
--- a/group.c
+++ b/group.c
@@ -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/mousefunc.c b/mousefunc.c
index 2d3909e..6b35029 100644
--- a/mousefunc.c
+++ b/mousefunc.c
@@ -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",