diff options
author | okan | 2014-02-07 18:09:54 +0000 |
---|---|---|
committer | okan | 2014-02-07 18:09:54 +0000 |
commit | 411961cc6c0b1f83e1733b9679f10e1f7dda8dde (patch) | |
tree | cbd786e3f6abdc90cb1735450981e0f00a64959b /group.c | |
parent | 4ddc371064d979e86023762a9e9e4bab0b52bc98 (diff) | |
download | cwm-411961cc6c0b1f83e1733b9679f10e1f7dda8dde.tar.gz |
If _NET_WM_DESKTOP is set to -1 during client creation, place the client into
group 0 (nogroup); solves problem initially discovered by oga@nicotinebsd with
tint2. A clientmessage *after* client creation already handles this case.
Go further and assign every client to a group; in non-sticky mode, group 0
(nogroup) and sticky mode, the active group. In both cases, autogroup will
override the group assignment. Removing a group from a client always places
the client back into group 0 (nogroup). Autogroup can also assign a client to
group 0 (nogroup) to keep a client always visible (unless of course one opts to
hide all clients).
Diffstat (limited to 'group.c')
-rw-r--r-- | group.c | 42 |
1 files changed, 13 insertions, 29 deletions
@@ -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.84 2014/01/24 15:08:06 okan Exp $ + * $OpenBSD: group.c,v 1.85 2014/02/07 18:09:54 okan Exp $ */ #include <sys/param.h> @@ -32,8 +32,7 @@ #include "calmwm.h" -static void group_add(struct group_ctx *, struct client_ctx *); -static void group_remove(struct client_ctx *); +static void group_assign(struct group_ctx *, struct client_ctx *); static void group_hide(struct screen_ctx *, struct group_ctx *); static void group_show(struct screen_ctx *, struct group_ctx *); static void group_fix_hidden_state(struct group_ctx *); @@ -46,11 +45,10 @@ const char *shortcut_to_name[] = { }; static void -group_add(struct group_ctx *gc, struct client_ctx *cc) +group_assign(struct group_ctx *gc, struct client_ctx *cc) { - if (cc == NULL || gc == NULL) - errx(1, "group_add: a ctx is NULL"); - + if (gc == NULL) + gc = TAILQ_FIRST(&cc->sc->groupq); if (cc->group == gc) return; @@ -64,18 +62,6 @@ group_add(struct group_ctx *gc, struct client_ctx *cc) } static void -group_remove(struct client_ctx *cc) -{ - if (cc == NULL || cc->group == NULL) - errx(1, "group_remove: a ctx is NULL"); - - TAILQ_REMOVE(&cc->group->clients, cc, group_entry); - cc->group = NULL; - - xu_ewmh_net_wm_desktop(cc); -} - -static void group_hide(struct screen_ctx *sc, struct group_ctx *gc) { struct client_ctx *cc; @@ -186,7 +172,7 @@ group_movetogroup(struct client_ctx *cc, int idx) client_hide(cc); gc->nhidden++; } - group_add(gc, cc); + group_assign(gc, cc); } /* @@ -199,10 +185,10 @@ group_sticky_toggle_enter(struct client_ctx *cc) struct group_ctx *gc = sc->group_active; if (gc == cc->group) { - group_remove(cc); + group_assign(NULL, cc); cc->flags |= CLIENT_UNGROUP; } else { - group_add(gc, cc); + group_assign(gc, cc); cc->flags |= CLIENT_GROUP; } @@ -369,7 +355,7 @@ group_autogroup(struct client_ctx *cc) if (xu_getprop(cc->win, ewmh[_NET_WM_DESKTOP], XA_CARDINAL, 1, (unsigned char **)&grpno) > 0) { - if (*grpno == 0xffffffff) + if (*grpno == -1) no = 0; else if (*grpno > CALMWM_NGROUPS || *grpno < 0) no = CALMWM_NGROUPS - 1; @@ -389,19 +375,17 @@ group_autogroup(struct client_ctx *cc) } } - /* no group please */ - if (no == 0) - return; - TAILQ_FOREACH(gc, &sc->groupq, entry) { if (gc->shortcut == no) { - group_add(gc, cc); + group_assign(gc, cc); return; } } if (Conf.flags & CONF_STICKY_GROUPS) - group_add(sc->group_active, cc); + group_assign(sc->group_active, cc); + else + group_assign(NULL, cc); } void |