aboutsummaryrefslogtreecommitdiffstats
path: root/group.c
diff options
context:
space:
mode:
authorokan2014-02-07 18:09:54 +0000
committerokan2014-02-07 18:09:54 +0000
commit411961cc6c0b1f83e1733b9679f10e1f7dda8dde (patch)
treecbd786e3f6abdc90cb1735450981e0f00a64959b /group.c
parent4ddc371064d979e86023762a9e9e4bab0b52bc98 (diff)
downloadcwm-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.c42
1 files changed, 13 insertions, 29 deletions
diff --git a/group.c b/group.c
index 1d117b4..0617cdf 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.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