wmii

git clone git://oldgit.suckless.org/wmii/
Log | Files | Refs | README | LICENSE

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:
cmd/wm/client.c | 24+++++++-----------------
cmd/wm/fs.c | 30++++++++++++++++++++++++++++--
cmd/wm/rule.c | 2++
cmd/wm/wm.h | 2++
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;