mirror of
https://github.com/leahneukirchen/cwm.git
synced 2023-08-10 21:13:12 +03:00
One of the most annoying things to do was restart cwm and lose all of
your group state. Fix this up by using an X Atom (_CWM_GRP) to store the name of the group that we're using (the name, not the number is because at one point we may make the group numbers dynamic). I've been talking about this since c2k8. so CM-w means you keep all of your windows grouped properly. ok okan@, todd@
This commit is contained in:
parent
9203c7e8ca
commit
c750462d13
4
calmwm.h
4
calmwm.h
@ -140,6 +140,7 @@ extern const char *shortcut_to_name[];
|
|||||||
struct group_ctx {
|
struct group_ctx {
|
||||||
TAILQ_ENTRY(group_ctx) entry;
|
TAILQ_ENTRY(group_ctx) entry;
|
||||||
struct client_ctx_q clients;
|
struct client_ctx_q clients;
|
||||||
|
const char *name;
|
||||||
int shortcut;
|
int shortcut;
|
||||||
int hidden;
|
int hidden;
|
||||||
int nhidden;
|
int nhidden;
|
||||||
@ -523,7 +524,8 @@ extern struct conf Conf;
|
|||||||
#define WM_TAKE_FOCUS cwm_atoms[2]
|
#define WM_TAKE_FOCUS cwm_atoms[2]
|
||||||
#define WM_PROTOCOLS cwm_atoms[3]
|
#define WM_PROTOCOLS cwm_atoms[3]
|
||||||
#define _MOTIF_WM_HINTS cwm_atoms[4]
|
#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];
|
extern Atom cwm_atoms[CWM_NO_ATOMS];
|
||||||
|
|
||||||
|
27
group.c
27
group.c
@ -52,6 +52,9 @@ _group_add(struct group_ctx *gc, struct client_ctx *cc)
|
|||||||
if (cc->group != NULL)
|
if (cc->group != NULL)
|
||||||
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
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);
|
TAILQ_INSERT_TAIL(&gc->clients, cc, group_entry);
|
||||||
cc->group = gc;
|
cc->group = gc;
|
||||||
}
|
}
|
||||||
@ -62,6 +65,10 @@ _group_remove(struct client_ctx *cc)
|
|||||||
if (cc == NULL || cc->group == NULL)
|
if (cc == NULL || cc->group == NULL)
|
||||||
errx(1, "_group_remove: a ctx is 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);
|
TAILQ_REMOVE(&cc->group->clients, cc, group_entry);
|
||||||
cc->group = NULL;
|
cc->group = NULL;
|
||||||
}
|
}
|
||||||
@ -132,6 +139,7 @@ group_init(void)
|
|||||||
TAILQ_INIT(&Groups[i].clients);
|
TAILQ_INIT(&Groups[i].clients);
|
||||||
Groups[i].hidden = 0;
|
Groups[i].hidden = 0;
|
||||||
Groups[i].shortcut = i + 1;
|
Groups[i].shortcut = i + 1;
|
||||||
|
Groups[i].name = shortcut_to_name[Groups[i].shortcut];
|
||||||
TAILQ_INSERT_TAIL(&Groupq, &Groups[i], entry);
|
TAILQ_INSERT_TAIL(&Groupq, &Groups[i], entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -325,16 +333,23 @@ group_autogroup(struct client_ctx *cc)
|
|||||||
{
|
{
|
||||||
struct autogroupwin *aw;
|
struct autogroupwin *aw;
|
||||||
struct group_ctx *gc;
|
struct group_ctx *gc;
|
||||||
|
unsigned char *grpstr = NULL;
|
||||||
char group[CALMWM_MAXNAMELEN];
|
char group[CALMWM_MAXNAMELEN];
|
||||||
|
|
||||||
if (cc->app_class == NULL || cc->app_name == NULL)
|
if (cc->app_class == NULL || cc->app_name == NULL)
|
||||||
return;
|
return;
|
||||||
|
if (xu_getprop(cc, _CWM_GRP, XA_STRING,
|
||||||
TAILQ_FOREACH(aw, &Conf.autogroupq, entry) {
|
(CALMWM_MAXNAMELEN - 1)/sizeof(long), &grpstr) > 0) {
|
||||||
if (strcmp(aw->class, cc->app_class) == 0 &&
|
strlcpy(group, grpstr, sizeof(group));
|
||||||
(aw->name == NULL || strcmp(aw->name, cc->app_name) == 0)) {
|
XFree(grpstr);
|
||||||
strlcpy(group, aw->group, sizeof(group));
|
} else {
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user