diff --git a/calmwm.h b/calmwm.h index f206c39..6d32354 100644 --- a/calmwm.h +++ b/calmwm.h @@ -140,6 +140,7 @@ extern const char *shortcut_to_name[]; struct group_ctx { TAILQ_ENTRY(group_ctx) entry; struct client_ctx_q clients; + const char *name; int shortcut; int hidden; int nhidden; @@ -523,7 +524,8 @@ extern struct conf Conf; #define WM_TAKE_FOCUS cwm_atoms[2] #define WM_PROTOCOLS cwm_atoms[3] #define _MOTIF_WM_HINTS cwm_atoms[4] -#define CWM_NO_ATOMS 5 +#define _CWM_GRP cwm_atoms[5] +#define CWM_NO_ATOMS 6 extern Atom cwm_atoms[CWM_NO_ATOMS]; diff --git a/group.c b/group.c index e1dd03e..29647ac 100644 --- a/group.c +++ b/group.c @@ -52,6 +52,9 @@ _group_add(struct group_ctx *gc, struct client_ctx *cc) if (cc->group != NULL) TAILQ_REMOVE(&cc->group->clients, cc, group_entry); + XChangeProperty(X_Dpy, cc->win, _CWM_GRP, XA_STRING, + 8, PropModeReplace, gc->name, strlen(gc->name)); + TAILQ_INSERT_TAIL(&gc->clients, cc, group_entry); cc->group = gc; } @@ -62,6 +65,10 @@ _group_remove(struct client_ctx *cc) if (cc == NULL || cc->group == NULL) errx(1, "_group_remove: a ctx is NULL"); + XChangeProperty(X_Dpy, cc->win, _CWM_GRP, XA_STRING, 8, + PropModeReplace, shortcut_to_name[0], + strlen(shortcut_to_name[0])); + TAILQ_REMOVE(&cc->group->clients, cc, group_entry); cc->group = NULL; } @@ -132,6 +139,7 @@ group_init(void) TAILQ_INIT(&Groups[i].clients); Groups[i].hidden = 0; Groups[i].shortcut = i + 1; + Groups[i].name = shortcut_to_name[Groups[i].shortcut]; TAILQ_INSERT_TAIL(&Groupq, &Groups[i], entry); } @@ -325,16 +333,23 @@ group_autogroup(struct client_ctx *cc) { struct autogroupwin *aw; struct group_ctx *gc; + unsigned char *grpstr = NULL; char group[CALMWM_MAXNAMELEN]; if (cc->app_class == NULL || cc->app_name == NULL) return; - - TAILQ_FOREACH(aw, &Conf.autogroupq, entry) { - if (strcmp(aw->class, cc->app_class) == 0 && - (aw->name == NULL || strcmp(aw->name, cc->app_name) == 0)) { - strlcpy(group, aw->group, sizeof(group)); - break; + if (xu_getprop(cc, _CWM_GRP, XA_STRING, + (CALMWM_MAXNAMELEN - 1)/sizeof(long), &grpstr) > 0) { + strlcpy(group, grpstr, sizeof(group)); + XFree(grpstr); + } else { + TAILQ_FOREACH(aw, &Conf.autogroupq, entry) { + if (strcmp(aw->class, cc->app_class) == 0 && + (aw->name == NULL || + strcmp(aw->name, cc->app_name) == 0)) { + strlcpy(group, aw->group, sizeof(group)); + break; + } } } diff --git a/xutil.c b/xutil.c index 0043f1c..7246531 100644 --- a/xutil.c +++ b/xutil.c @@ -175,7 +175,8 @@ char *atoms[CWM_NO_ATOMS] = { "WM_DELETE_WINDOW", "WM_TAKE_FOCUS", "WM_PROTOCOLS", - "_MOTIF_WM_HINTS" + "_MOTIF_WM_HINTS", + "_CWM_GRP", }; void