commit 9b0fcad4b91ec3452a8864eb4ad75a086513fb7e
parent 6da9bfce1e0eae009c145def74f706ba26a3d072
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Fri, 10 Mar 2006 11:59:26 +0100
remove TCR, added /client/class again
Diffstat:
4 files changed, 39 insertions(+), 19 deletions(-)
diff --git a/cmd/wm/client.c b/cmd/wm/client.c
@@ -16,6 +16,7 @@ alloc_client(Window w, XWindowAttributes *wa)
XTextProperty name;
Client *c = (Client *) cext_emallocz(sizeof(Client));
XSetWindowAttributes fwa;
+ XClassHint ch;
long msize;
static unsigned int id = 1;
@@ -37,15 +38,19 @@ alloc_client(Window w, XWindowAttributes *wa)
cext_strlcpy(c->name, (char *)name.value, sizeof(c->name));
free(name.value);
}
+ XGetClassHint(dpy, c->win, &ch);
+ snprintf(c->classinst, sizeof(c->classinst), "%s:%s", ch.res_class, ch.res_name);
+ XFree(ch.res_class);
+ XFree(ch.res_name);
fwa.override_redirect = 1;
fwa.background_pixmap = ParentRelative;
fwa.event_mask = SubstructureRedirectMask | ExposureMask | ButtonPressMask | PointerMotionMask;
c->framewin = XCreateWindow(dpy, root, c->rect.x, c->rect.y,
c->rect.width + 2 * def.border, c->rect.height + def.border + bar_height(), 0,
- DefaultDepth(dpy, screen), CopyFromParent,
- DefaultVisual(dpy, screen),
+ DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
CWOverrideRedirect | CWBackPixmap | CWEventMask, &fwa);
+
c->cursor = cursor[CurNormal];
XDefineCursor(dpy, c->framewin, c->cursor);
c->gc = XCreateGC(dpy, c->framewin, 0, 0);
@@ -316,21 +321,6 @@ void
manage_client(Client *c)
{
Tag *t;
- XClassHint ch;
- char buf[256];
- unsigned int i;
-
- for(i = 0; i < nclient; i++)
- if(client[i] == c)
- break;
-
- /* TCR -> tag client request */
- XGetClassHint(dpy, c->win, &ch);
- snprintf(buf, sizeof(buf), "TCR %u 0x%x 0x%x %s:%s\n", i,
- (unsigned int)c->win, (unsigned int)c->trans, ch.res_class, ch.res_name);
- XFree(ch.res_class);
- XFree(ch.res_name);
- write_event(buf);
if(c->trans) {
c->tags[0] = '~';
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -48,7 +48,7 @@ static char Enocommand[] = "command not supported";
* /bar/lab/data FsFdata <arbitrary data which gets displayed>
* /bar/lab/colors FsFcolors <#RRGGBB> <#RRGGBB> <#RRGGBB>
* /clients/ FsDclients
- * /clients/1/ FsDGclient see /X/X/X/ namespace below
+ * /clients/1/ FsDGclient see /ws/X/X/ namespace below
* /event FsFevent
* /ctl FsFctl command interface (root)
* /ws/ FsDws ws
@@ -59,6 +59,7 @@ static char Enocommand[] = "command not supported";
* /ws/1/ctl FsFctl command interface (area)
* /ws/1/mode FsFmode col mode
* /ws/1/sel/ FsDclient
+ * /ws/1/1/class FsFclass class:instance of client
* /ws/1/1/name FsFname name of client
* /ws/1/1/tags FsFtags tag of client
* /ws/1/1/geom FsFgeom geometry of client
@@ -218,12 +219,16 @@ qid2name(Qid *qid)
return nil;
return "geom";
break;
+ case FsFclass:
case FsFname:
if((qid->dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1))
return nil;
else if(i1 == -1)
return nil;
- return "name";
+ if(type == FsFname)
+ return "name";
+ else
+ return "class";
break;
case FsFtags:
if((qid->dir_type == FsDclient) && (i1 == -1 || i2 == -1 || i3 == -1))
@@ -276,6 +281,8 @@ name2type(char *name, unsigned char dir_type)
return FsFevent;
if(!strncmp(name, "snap", 5))
return FsFsnap;
+ if(!strncmp(name, "class", 5))
+ return FsFclass;
if(!strncmp(name, "name", 5))
return FsFname;
if(!strncmp(name, "border", 7))
@@ -430,6 +437,7 @@ mkqid(Qid *dir, char *wname, Qid *new)
break;
case FsFgeom:
case FsFname:
+ case FsFclass:
case FsFtags:
if((dir_type == FsDclient) && ((dir_i1 == -1 || dir_i2 == -1 || dir_i3 == -1)))
return -1;
@@ -516,6 +524,14 @@ type2stat(Stat *stat, char *wname, Qid *dir)
snprintf(buf, sizeof(buf), "%d", def.snap);
return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE);
break;
+ case FsFclass:
+ if(dir_type == FsDclient) {
+ f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
+ return mkstat(stat, dir, wname, strlen(f->client->classinst), DMREAD);
+ }
+ else
+ return mkstat(stat, dir, wname, strlen(client[dir_i1]->classinst), DMREAD);
+ break;
case FsFname:
if(dir_type == FsDclient) {
f = tag[dir_i1]->area[dir_i2]->frame[dir_i3];
@@ -1033,6 +1049,16 @@ xread(IXPConn *c, Fcall *fcall)
fcall->count = strlen(buf);
memcpy(p, buf, fcall->count);
break;
+ case FsFclass:
+ if(m->qid.dir_type == FsDclient) {
+ if((fcall->count = strlen(tag[i1]->area[i2]->frame[i3]->client->classinst)))
+ memcpy(p, tag[i1]->area[i2]->frame[i3]->client->classinst, fcall->count);
+ }
+ else {
+ if((fcall->count = strlen(client[i1]->classinst)))
+ memcpy(p, client[i1]->name, fcall->count);
+ }
+ break;
case FsFname:
if(m->qid.dir_type == FsDclient) {
if((fcall->count = strlen(tag[i1]->area[i2]->frame[i3]->client->name)))
diff --git a/cmd/wm/rule.c b/cmd/wm/rule.c
@@ -94,6 +94,8 @@ match_tags(char *ruledef, Client *c)
+
+
free(rules);
return nil;
}
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -69,6 +69,7 @@ enum {
FsFctl,
FsFname,
FsFtags,
+ FsFclass,
FsFtag,
FsFmode
};
@@ -116,6 +117,7 @@ struct Client {
unsigned short id;
char name[256];
char tags[256];
+ char classinst[256];
int proto;
unsigned int border;
Bool destroyed;