summary refs log tree commit diff
path: root/xutil.c
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 /xutil.c
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.
Diffstat (limited to 'xutil.c')
-rw-r--r--xutil.c44
1 files changed, 36 insertions, 8 deletions
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;
 	}