commit 6d48434538f14861b8e5672cb7dd2648647dfb65
parent bf9a872c4df751e22c8a2e322301658f37a49049
Author: Anselm R. Garbe <garbeam@wmii.de>
Date: Wed, 8 Mar 2006 12:17:18 +0100
fixed several issues, now seems much more stable
Diffstat:
3 files changed, 25 insertions(+), 80 deletions(-)
diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c
@@ -65,8 +65,6 @@ static char Enocommand[] = "command not supported";
* /ws/1/1/tags FsFtags tag of client
* /ws/1/1/geom FsFgeom geometry of client
* /ws/1/1/ctl FsFctl command interface (client)
- * /cache/ FsDcache cache of existing ws'es
- * /cache/foo FsDws cache of existing ws'es
*/
Qid root_qid;
@@ -155,7 +153,6 @@ qid2name(Qid *qid)
case FsDdef: return "def"; break;
case FsDkeys: return "keys"; break;
case FsDtags: return "tags"; break;
- case FsDcache: return "cache"; break;
case FsDclients: return "clients"; break;
case FsDbar: return "bar"; break;
case FsDws:
@@ -269,8 +266,6 @@ name2type(char *name, unsigned char dir_type)
case FsDclient: return FsFtags; break;
}
}
- if(!strncmp(name, "cache", 6))
- return FsDcache;
if(!strncmp(name, "clients", 8))
return FsDclients;
if(!strncmp(name, "ws", 3) && (dir_type == FsDroot))
@@ -315,18 +310,12 @@ name2type(char *name, unsigned char dir_type)
return FsFkey;
if(!strncmp(name, "sel", 4))
goto dyndir;
- if(dir_type == FsDcache) {
- for(i = 0; i < ntag; i++)
- if(!strncmp(name, tag[i]->name, strlen(tag[i]->name)))
- goto dyndir;
- }
i = (unsigned short) cext_strtonum(name, 0, 0xffff, &err);
if(err)
return -1;
dyndir:
/*fprintf(stderr, "nametotype: dir_type = %d\n", dir_type);*/
switch(dir_type) {
- case FsDcache: return FsDws; break;
case FsDbar: return FsDlabel; break;
case FsDws: return FsDarea; break;
case FsDclients: return FsDGclient; break;
@@ -354,7 +343,6 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
case FsDdef:
case FsDkeys:
case FsDtags:
- case FsDcache:
case FsDclients:
case FsDbar:
if(dir_type != FsDroot)
@@ -364,18 +352,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk)
break;
case FsDws:
new->type = IXP_QTDIR;
- if(!strncmp(wname, "ws", 3) && dir_type == FsDroot)
- new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0);
- else if(dir_type == FsDcache) {
- for(i = 0; i < ntag; i++)
- if(!strncmp(wname, tag[i]->name, strlen(tag[i]->name)))
- break;
- if(i >= ntag)
- return -1;
- new->path = mkqpath(FsDws, tag[i]->id, 0, 0);
- }
- else
- return -1;
+ new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0);
break;
case FsDlabel:
if(dir_type != FsDbar)
@@ -625,7 +602,6 @@ type2stat(Stat *stat, char *wname, Qid *dir)
case FsDdef:
case FsDkeys:
case FsDtags:
- case FsDcache:
case FsDclients:
case FsDbar:
case FsDlabel:
@@ -786,24 +762,6 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
}
break;
- case FsDcache:
- /* jump to offset */
- len = 0;
- for(i = 0; i < ntag; i++) {
- len += type2stat(&stat, tag[i]->name, &m->qid);
- if(len <= fcall->offset)
- continue;
- break;
- }
- /* offset found, proceeding */
- for(; i < ntag; i++) {
- len = type2stat(&stat, tag[i]->name, &m->qid);
- if(fcall->count + len > fcall->iounit)
- break;
- fcall->count += len;
- p = ixp_enc_stat(p, &stat);
- }
- break;
case FsDtags:
/* jump to offset */
len = 0;
@@ -943,8 +901,6 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "clients", &m->qid);
p = ixp_enc_stat(p, &stat);
- fcall->count += type2stat(&stat, "cache", &m->qid);
- p = ixp_enc_stat(p, &stat);
fcall->count += type2stat(&stat, "ws", &m->qid);
p = ixp_enc_stat(p, &stat);
break;
@@ -967,15 +923,6 @@ xread(IXPConn *c, Fcall *fcall)
p = ixp_enc_stat(p, &stat);
}
break;
- case FsDcache:
- for(i = 0; i < ntag; i++) {
- len = type2stat(&stat, tag[i]->name, &m->qid);
- if(fcall->count + len > fcall->iounit)
- break;
- fcall->count += len;
- p = ixp_enc_stat(p, &stat);
- }
- break;
case FsDtags:
for(i = 0; i < nctag; i++) {
len = type2stat(&stat, ctag[i], &m->qid);
diff --git a/cmd/wm/tag.c b/cmd/wm/tag.c
@@ -136,7 +136,7 @@ tid2index(unsigned short id)
Tag *
get_tag(char *name)
{
- unsigned int i;
+ unsigned int i, n = 0;
Tag *t;
if(!has_ctag(name))
@@ -147,9 +147,15 @@ get_tag(char *name)
return t;
}
+ for(i = 0; i < nclient; i++)
+ if(strstr(client[i]->tags, name))
+ n++;
+ if(!n)
+ return nil;
+
t = alloc_tag(name);
for(i = 0; i < nclient; i++)
- if(!clientoftag(t, client[i]) && strstr(client[i]->tags, name))
+ if(strstr(client[i]->tags, name))
attach_totag(t, client[i]);
return t;
}
@@ -157,11 +163,23 @@ get_tag(char *name)
void
select_tag(char *arg)
{
+ int i, j, n;
Client *c;
Tag *t = get_tag(arg);
if(!t)
return;
focus_tag(t);
+
+ for(i = 0; i < ntag; i++) {
+ n = 0;
+ for(j = 0; j < tag[i]->narea; j++)
+ n += tag[i]->area[j]->nframe;
+ if(!n) {
+ destroy_tag(tag[i]);
+ i--;
+ }
+ }
+
if((c = sel_client_of_tag(t)))
focus_client(c);
}
@@ -195,19 +213,6 @@ update_ctags()
fprintf(stderr, "%s", "update_ctags\n");
for(i = 0; i < nctag; i++) {
-#if 0
- Bool exists = False;
- for(j = 0; j < nclient; j++)
- if(strstr(client[j]->tags, ctag[i]))
- exists = True;
- if(!exists) {
- for(j = 0; j < ntag; j++)
- if(!strncmp(tag[j]->name, ctag[i], strlen(tag[j]->name))) {
- destroy_tag(tag[j]);
- j--;
- }
- }
-#endif
free(ctag[i]);
ctag[i] = nil;
}
@@ -241,22 +246,16 @@ update_ctags()
void
detach_fromtag(Tag *t, Client *c, Bool unmap)
{
- int i, n = 0;
+ int i;
+ Client *cl;
for(i = 0; i < t->narea; i++) {
if(clientofarea(t->area[i], c)) {
detach_fromarea(t->area[i], c);
XMoveWindow(dpy, c->framewin, 2 * rect.width, 0);
}
}
- for(i = 0; i < t->narea; i++)
- n += t->area[i]->nframe;
- if(!n)
- destroy_tag(t);
- if(ntag) {
- Client *c = sel_client_of_tag(tag[sel]);
- focus_tag(tag[sel]);
- focus_client(c);
- }
+ if((cl = sel_client_of_tag(t)))
+ focus_client(cl);
}
void
diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h
@@ -46,7 +46,6 @@ enum {
FsDroot,
FsDdef,
FsDws,
- FsDcache,
FsDarea,
FsDclients,
FsDclient,