From 142f52a0aab29681a46e4ce10eb2618ee99ede95 Mon Sep 17 00:00:00 2001 From: okan Date: Sat, 6 Sep 2014 16:08:58 +0000 Subject: 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. --- xutil.c | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) (limited to 'xutil.c') 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; } -- cgit 1.4.1