summary refs log tree commit diff
diff options
context:
space:
mode:
authorokan <okan>2014-09-06 16:08:58 +0000
committerokan <okan>2014-09-06 16:08:58 +0000
commit142f52a0aab29681a46e4ce10eb2618ee99ede95 (patch)
treefe2faee5da2bcd654fe02e117f9c0e6a068bc563
parent87d604f119e3598ca2b0311082c89ebb67782f76 (diff)
downloadcwm-142f52a0aab29681a46e4ce10eb2618ee99ede95.tar.gz
cwm-142f52a0aab29681a46e4ce10eb2618ee99ede95.tar.xz
cwm-142f52a0aab29681a46e4ce10eb2618ee99ede95.zip
Rework group names: stash the group name inside the group_ctx as opposed
to having to manage an array outside in screen_ctx for group names and
shortcuts.  Simplifies (and moves bits for) reading, and constructing
data for, EWMH's _NET_DESKTOP_NAMES.
-rw-r--r--calmwm.h3
-rw-r--r--group.c54
-rw-r--r--mousefunc.c2
-rw-r--r--xevents.c2
-rw-r--r--xutil.c44
5 files changed, 41 insertions, 64 deletions
diff --git a/calmwm.h b/calmwm.h
index 5099f9e..9764a21 100644
--- a/calmwm.h
+++ b/calmwm.h
@@ -204,6 +204,7 @@ TAILQ_HEAD(cycle_entry_q, client_ctx);
 struct group_ctx {
 	TAILQ_ENTRY(group_ctx)	 entry;
 	struct client_ctx_q	 clients;
+	char			*name;
 	int			 num;
 };
 TAILQ_HEAD(group_ctx_q, group_ctx);
@@ -242,9 +243,7 @@ struct screen_ctx {
 	struct group_ctx	 groups[CALMWM_NGROUPS];
 	struct group_ctx_q	 groupq;
 	int			 group_hideall;
-	int			 group_nonames;
 	struct group_ctx	*group_active;
-	char 			**group_names;
 };
 TAILQ_HEAD(screen_ctx_q, screen_ctx);
 
diff --git a/group.c b/group.c
index 7d08f34..d1ae4f4 100644
--- a/group.c
+++ b/group.c
@@ -120,18 +120,15 @@ group_init(struct screen_ctx *sc)
 
 	TAILQ_INIT(&sc->groupq);
 	sc->group_hideall = 0;
-	/*
-	 * See if any group names have already been set and update the
-	 * property with ours if they'll have changed.
-	 */
-	group_update_names(sc);
 
 	for (i = 0; i < CALMWM_NGROUPS; i++) {
 		TAILQ_INIT(&sc->groups[i].clients);
+		sc->groups[i].name = xstrdup(num_to_name[i]);
 		sc->groups[i].num = i;
 		TAILQ_INSERT_TAIL(&sc->groupq, &sc->groups[i], entry);
 	}
 
+	xu_ewmh_net_desktop_names(sc);
 	xu_ewmh_net_wm_desktop_viewport(sc);
 	xu_ewmh_net_wm_number_of_desktops(sc);
 	xu_ewmh_net_showing_desktop(sc);
@@ -350,50 +347,3 @@ group_autogroup(struct client_ctx *cc)
 	else
 		group_assign(NULL, cc);
 }
-
-void
-group_update_names(struct screen_ctx *sc)
-{
-	char		**strings, *p;
-	unsigned char	*prop_ret;
-	int		 i = 0, j = 0, nstrings = 0, n = 0, setnames = 0;
-
-	if ((j = xu_getprop(sc->rootwin, ewmh[_NET_DESKTOP_NAMES],
-	    cwmh[UTF8_STRING], 0xffffff, (unsigned char **)&prop_ret)) > 0) {
-		prop_ret[j - 1] = '\0'; /* paranoia */
-		while (i < j) {
-			if (prop_ret[i++] == '\0')
-				nstrings++;
-		}
-	}
-
-	strings = xcalloc((nstrings < CALMWM_NGROUPS ? CALMWM_NGROUPS :
-	    nstrings), sizeof(*strings));
-
-	p = (char *)prop_ret;
-	while (n < nstrings) {
-		strings[n++] = xstrdup(p);
-		p += strlen(p) + 1;
-	}
-	/*
-	 * make sure we always set our defaults if nothing is there to
-	 * replace them.
-	 */
-	if (n < CALMWM_NGROUPS) {
-		setnames = 1;
-		i = 0;
-		while (n < CALMWM_NGROUPS)
-			strings[n++] = xstrdup(num_to_name[i++]);
-	}
-
-	if (prop_ret != NULL)
-		XFree(prop_ret);
-	if (sc->group_nonames != 0)
-		free(sc->group_names);
-
-	sc->group_names = strings;
-	sc->group_nonames = n;
-
-	if (setnames)
-		xu_ewmh_net_desktop_names(sc);
-}
diff --git a/mousefunc.c b/mousefunc.c
index c7b283a..2499ae1 100644
--- a/mousefunc.c
+++ b/mousefunc.c
@@ -192,7 +192,7 @@ mousefunc_menu_group(struct client_ctx *cc, union arg *arg)
 			continue;
 		menuq_add(&menuq, gc,
 		    group_hidden_state(gc) ? "%d: [%s]" : "%d: %s",
-		    gc->num, sc->group_names[gc->num]);
+		    gc->num, gc->name);
 	}
 	if (TAILQ_EMPTY(&menuq))
 		return;
diff --git a/xevents.c b/xevents.c
index cbba674..c4facf3 100644
--- a/xevents.c
+++ b/xevents.c
@@ -196,7 +196,7 @@ xev_handle_propertynotify(XEvent *ee)
 		TAILQ_FOREACH(sc, &Screenq, entry) {
 			if (sc->rootwin == e->window) {
 				if (e->atom == ewmh[_NET_DESKTOP_NAMES])
-					group_update_names(sc);
+					xu_ewmh_net_desktop_names(sc);
 			}
 		}
 	}
diff --git a/xutil.c b/xutil.c
index cafd793..8c02456 100644
--- a/xutil.c
+++ b/xutil.c
@@ -283,18 +283,46 @@ xu_ewmh_net_current_desktop(struct screen_ctx *sc, long idx)
 void
 xu_ewmh_net_desktop_names(struct screen_ctx *sc)
 {
-	char		*p, *q;
-	size_t		 len = 0, tlen, slen;
-	int		 i;
+	struct group_ctx	*gc;
+	char			*p, *q;
+	unsigned char		*prop_ret;
+	int			 i = 0, j = 0, nstrings = 0, n = 0;
+	size_t			 len = 0, tlen, slen;
+
+	/* Let group names be overwritten if _NET_DESKTOP_NAMES is set. */
+
+	if ((j = xu_getprop(sc->rootwin, ewmh[_NET_DESKTOP_NAMES],
+	    cwmh[UTF8_STRING], 0xffffff, (unsigned char **)&prop_ret)) > 0) {
+		prop_ret[j - 1] = '\0'; /* paranoia */
+		while (i < j) {
+			if (prop_ret[i++] == '\0')
+				nstrings++;
+		}
+	}
+
+	p = (char *)prop_ret;
+	while (n < nstrings) {
+		TAILQ_FOREACH(gc, &sc->groupq, entry) {
+			if (gc->num == n) {
+				free(gc->name);
+				gc->name = xstrdup(p);
+				p += strlen(p) + 1;
+				break;
+			}
+		}
+		n++;
+	}
+	if (prop_ret != NULL)
+		XFree(prop_ret);
 
-	for (i = 0; i < sc->group_nonames; i++)
-		len += strlen(sc->group_names[i]) + 1;
+	TAILQ_FOREACH(gc, &sc->groupq, entry)
+		len += strlen(gc->name) + 1;
 	q = p = xcalloc(len, sizeof(*p));
 
 	tlen = len;
-	for (i = 0; i < sc->group_nonames; i++) {
-		slen = strlen(sc->group_names[i]) + 1;
-		(void)strlcpy(q, sc->group_names[i], tlen);
+	TAILQ_FOREACH(gc, &sc->groupq, entry) {
+		slen = strlen(gc->name) + 1;
+		(void)strlcpy(q, gc->name, tlen);
 		tlen -= slen;
 		q += slen;
 	}