aboutsummaryrefslogtreecommitdiffstats
path: root/group.c
diff options
context:
space:
mode:
authorokan2015-08-21 15:52:49 +0000
committerokan2015-08-21 15:52:49 +0000
commit6e8725d167b5484a4e39edb88374a57eada98327 (patch)
treefb81171f754f0930bf52a820f514a3d267bfb143 /group.c
parente3a3da1896c03cbca5868629f6fc5bdcc09c3b31 (diff)
downloadcwm-6e8725d167b5484a4e39edb88374a57eada98327.tar.gz
Bring group and client cycle closer together.
Diffstat (limited to 'group.c')
-rw-r--r--group.c56
1 files changed, 35 insertions, 21 deletions
diff --git a/group.c b/group.c
index d2c0bf8..dbaf982 100644
--- a/group.c
+++ b/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.112 2015/06/28 19:50:46 okan Exp $
+ * $OpenBSD: group.c,v 1.113 2015/08/21 15:52:49 okan Exp $
*/
#include <sys/types.h>
@@ -32,6 +32,8 @@
#include "calmwm.h"
+static struct group_ctx *group_next(struct group_ctx *);
+static struct group_ctx *group_prev(struct group_ctx *);
static void group_assign(struct group_ctx *, struct client_ctx *);
static void group_restack(struct group_ctx *);
static void group_setactive(struct group_ctx *);
@@ -255,36 +257,28 @@ group_only(struct screen_ctx *sc, int idx)
}
}
-/*
- * Cycle through active groups. If none exist, then just stay put.
- */
void
group_cycle(struct screen_ctx *sc, int flags)
{
- struct group_ctx *gc, *showgroup = NULL;
+ struct group_ctx *newgc, *oldgc, *showgroup = NULL;
- if (((gc = sc->group_active)) == NULL)
- errx(1, "group_cycle: no active group");
+ oldgc = sc->group_active;
+ newgc = oldgc;
for (;;) {
- gc = (flags & CWM_RCYCLE) ? TAILQ_PREV(gc, group_ctx_q,
- entry) : TAILQ_NEXT(gc, entry);
- if (gc == NULL)
- gc = (flags & CWM_RCYCLE) ? TAILQ_LAST(&sc->groupq,
- group_ctx_q) : TAILQ_FIRST(&sc->groupq);
- if (gc == sc->group_active)
+ newgc = (flags & CWM_RCYCLE) ? group_prev(newgc) :
+ group_next(newgc);
+
+ if (newgc == oldgc)
break;
- if (!group_holds_only_sticky(gc) && showgroup == NULL)
- showgroup = gc;
- else if (!group_holds_only_hidden(gc))
- group_hide(gc);
+ if (!group_holds_only_sticky(newgc) && showgroup == NULL)
+ showgroup = newgc;
+ else if (!group_holds_only_hidden(newgc))
+ group_hide(newgc);
}
- if (showgroup == NULL)
- return;
-
- group_hide(sc->group_active);
+ group_hide(oldgc);
if (group_holds_only_hidden(showgroup))
group_show(showgroup);
@@ -292,6 +286,26 @@ group_cycle(struct screen_ctx *sc, int flags)
group_setactive(showgroup);
}
+static struct group_ctx *
+group_next(struct group_ctx *gc)
+{
+ struct screen_ctx *sc = gc->sc;
+ struct group_ctx *newgc;
+
+ return(((newgc = TAILQ_NEXT(gc, entry)) != NULL) ?
+ newgc : TAILQ_FIRST(&sc->groupq));
+}
+
+static struct group_ctx *
+group_prev(struct group_ctx *gc)
+{
+ struct screen_ctx *sc = gc->sc;
+ struct group_ctx *newgc;
+
+ return(((newgc = TAILQ_PREV(gc, group_ctx_q, entry)) != NULL) ?
+ newgc : TAILQ_LAST(&sc->groupq, group_ctx_q));
+}
+
void
group_alltoggle(struct screen_ctx *sc)
{