about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--calmwm.h4
-rw-r--r--group.c27
-rw-r--r--xutil.c3
3 files changed, 26 insertions, 8 deletions
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