wmii

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

commit 4bfca250ce0fa2d00faa79430158eb30a94c8dbf
parent 86077a19c1e78c688250573904d445189b69ca56
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Tue,  7 Mar 2006 17:43:46 +0100

added /cache namespace containing available cached ws'es


Diffstat:
cmd/wm/fs.c | 65++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
cmd/wm/wm.h | 1+
2 files changed, 63 insertions(+), 3 deletions(-)

diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -65,6 +65,8 @@ 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; @@ -153,9 +155,18 @@ 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: return "ws"; break; + case FsDws: + if(qid->dir_type == FsDroot) + return "ws"; + else { + if(i1 == -1) + return nil; + return tag[i1]->name; + } + break; case FsDlabel: if(i1 == -1) return nil; @@ -258,9 +269,11 @@ 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)) + if(!strncmp(name, "ws", 3) && (dir_type == FsDroot)) return FsDws; if(!strncmp(name, "bar", 4)) return FsDbar; @@ -300,12 +313,18 @@ 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; @@ -333,6 +352,7 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) case FsDdef: case FsDkeys: case FsDtags: + case FsDcache: case FsDclients: case FsDbar: new->type = IXP_QTDIR; @@ -340,7 +360,16 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) break; case FsDws: new->type = IXP_QTDIR; - new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0); + if(!strncmp(wname, "ws", 3) && dir_type == FsDroot) + new->path = mkqpath(FsDws, ntag ? tag[sel]->id : 0, 0, 0); + else { + 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); + } break; case FsDlabel: new->type = IXP_QTDIR; @@ -583,6 +612,7 @@ type2stat(Stat *stat, char *wname, Qid *dir) case FsDdef: case FsDkeys: case FsDtags: + case FsDcache: case FsDclients: case FsDbar: case FsDlabel: @@ -743,6 +773,24 @@ 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; @@ -882,6 +930,8 @@ 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; @@ -904,6 +954,15 @@ 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/wm.h b/cmd/wm/wm.h @@ -46,6 +46,7 @@ enum { FsDroot, FsDdef, FsDws, + FsDcache, FsDarea, FsDclients, FsDclient,