wmii

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

commit ff7bfbfc0298421cc0b5a599918ba88b0f96b691
parent 17398f9eeaae5839fe570cddf6c6a47e38b585b1
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Sat, 28 Jan 2006 16:11:01 +0200

/new in wmiibar2 behaves now like in acme, it is a directory, on read/write it will create a new label, thus wmiir write /new/data works, yeah!


Diffstat:
cmd/wmiibar2.c | 100+++++++++++++++++++++++++++++++++++++++++++------------------------------------
1 file changed, 54 insertions(+), 46 deletions(-)

diff --git a/cmd/wmiibar2.c b/cmd/wmiibar2.c @@ -40,7 +40,6 @@ enum { Ditem, Fdisplay, Ffont, - Fnew, Fevent, Fdata, /* data to display */ Fcolor @@ -170,12 +169,13 @@ qid_to_name(Qid *qid) case Ditem: if(!i) return "default"; + else if(i == nitem) + return "new"; snprintf(buf, sizeof(buf), "%u", i); return buf; break; case Fdisplay: return "display"; break; case Ffont: return "font"; break; - case Fnew: return "new"; break; case Fdata: return "data"; break; case Fevent: return "event"; break; case Fcolor: return "color"; break; @@ -190,14 +190,12 @@ name_to_type(char *name) unsigned int i; if(!name || !name[0] || !strncmp(name, "..", 3)) return Droot; - if(!strncmp(name, "default", 8)) + if(!strncmp(name, "default", 8) || !strncmp(name, "new", 4)) return Ditem; if(!strncmp(name, "display", 8)) return Fdisplay; if(!strncmp(name, "font", 5)) return Ffont; - if(!strncmp(name, "new", 4)) - return Fnew; if(!strncmp(name, "data", 5)) return Fdata; if(!strncmp(name, "event", 6)) @@ -228,20 +226,28 @@ mkqid(Qid *dir, char *wname, Qid *new) return -1; new->version = 0; - if(type == Droot) { + switch(type) { + case Droot: new->type = IXP_QTDIR; *new = root_qid; - } - else if(type == Ditem) { + break; + case Ditem: new->type = IXP_QTDIR; if(!strncmp(wname, "default", 8)) new->path = mkqpath(Ditem, 0); - else - new->path = mkqpath(Ditem, cext_strtonum(wname, 1, 0xffff, &errstr)); - } - else { + else if(!strncmp(wname, "new", 4)) + new->path = mkqpath(Ditem, nitem); + else { + unsigned short i = cext_strtonum(wname, 1, 0xffff, &errstr); + if(i >= nitem) + return -1; + new->path = mkqpath(Ditem, i); + } + break; + default: new->type = IXP_QTFILE; new->path = mkqpath(type, qpath_item(dir->path)); + break; } return 0; } @@ -269,7 +275,7 @@ xwalk(IXPServer *s, IXPConn *c) Map *map; if(!(map = fid_to_map(c->aux, s->fcall.fid))) { - s->errstr = "no directory associated with fid"; + s->errstr = "no dir associated with fid"; return -1; } if(s->fcall.fid != s->fcall.newfid @@ -364,7 +370,7 @@ xread(IXPServer *s, IXPConn *c) p = ixp_enc_stat(p, &stat); s->fcall.count += mkstat(&stat, &root_qid, "font", strlen(font), 0x0); p = ixp_enc_stat(p, &stat); - s->fcall.count += mkstat(&stat, &root_qid, "new", 0, 0x0); + s->fcall.count += mkstat(&stat, &root_qid, "new", 0, DMDIR); p = ixp_enc_stat(p, &stat); s->fcall.count += mkstat(&stat, &root_qid, "event", 0, 0x0); p = ixp_enc_stat(p, &stat); @@ -377,13 +383,16 @@ xread(IXPServer *s, IXPConn *c) } break; case Ditem: - if(i >= nitem) - goto invalid_xread; + if(i > nitem) + goto error_xread; if(!i) { s->fcall.count = mkstat(&stat, &root_qid, "color", 24, 0x0); p = ixp_enc_stat(p, &stat); + break; } - else { + { + if(i == nitem) + new_item(); Qid dir = {IXP_QTDIR, 0, mkqpath(Ditem, i)}; s->fcall.count = mkstat(&stat, &dir, "color", 24, 0x0); p = ixp_enc_stat(p, &stat); @@ -411,29 +420,27 @@ xread(IXPServer *s, IXPConn *c) if((s->fcall.count = strlen(font))) memcpy(p, font, s->fcall.count); break; - case Fnew: - snprintf(buf, sizeof(buf), "%u", nitem); - new_item(); /* only add new items on first TREAD */ - s->fcall.count = strlen(buf); - memcpy(p, buf, s->fcall.count); - break; case Fevent: break; case Fdata: + if(i == nitem) + new_item(); if(i >= nitem) - goto invalid_xread; + goto error_xread; if((s->fcall.count = strlen(item[i]->data))) memcpy(p, item[i]->data, s->fcall.count); break; case Fcolor: + if(i == nitem) + new_item(); if(i >= nitem) - goto invalid_xread; + goto error_xread; if((s->fcall.count = strlen(item[i]->color))) memcpy(p, item[i]->color, s->fcall.count); break; -invalid_xread: default: - s->errstr = "invalid file"; +error_xread: + s->errstr = "invalid read request"; return -1; break; } @@ -453,10 +460,6 @@ xstat(IXPServer *s, IXPConn *c) s->errstr = "invalid fid"; return -1; } - else if((i = qpath_item(map->qid.path) >= nitem)) { - s->errstr = "file not found"; - return -1; - } dir.version = 0; dir.type = IXP_QTDIR; dir.path = mkqpath(Ditem, i); @@ -473,7 +476,6 @@ xstat(IXPServer *s, IXPConn *c) else mkstat(&s->fcall.stat, &root_qid, qid_to_name(&map->qid), 5, 0x0); break; - case Fnew: case Fevent: mkstat(&s->fcall.stat, &root_qid, qid_to_name(&map->qid), 0, 0x0); break; @@ -487,7 +489,7 @@ xstat(IXPServer *s, IXPConn *c) mkstat(&s->fcall.stat, &dir, qid_to_name(&map->qid), 24, 0x0); break; default: - s->errstr = "invalid type"; + s->errstr = "invalid stat request"; return -1; break; } @@ -511,11 +513,11 @@ xwrite(IXPServer *s, IXPConn *c) switch (qpath_type(map->qid.path)) { case Fdisplay: if(s->fcall.count > 5) - goto invalid_xwrite; + goto error_xwrite; memcpy(buf, s->fcall.data, s->fcall.count); buf[s->fcall.count] = 0; if(!blitz_strtoalign(&align, buf)) - goto invalid_xwrite; + goto error_xwrite; /* TODO: resize/hide */ break; case Ffont: @@ -526,28 +528,34 @@ xwrite(IXPServer *s, IXPConn *c) /* TODO: XQueryFont */ break; case Fdata: - if(!i || (i >= nitem)) - goto invalid_xwrite; - if(s->fcall.count >= sizeof(item[i]->data)) - s->fcall.count = sizeof(item[i]->data) - 1; - memcpy(item[i]->data, s->fcall.data, s->fcall.count); - item[i]->data[s->fcall.count] = 0; - /* TODO: redraw */ + { + unsigned int len = s->fcall.count; + if(i == nitem) + new_item(); + if(!i || (i >= nitem)) + goto error_xwrite; + if(len >= sizeof(item[i]->data)) + len = sizeof(item[i]->data) - 1; + memcpy(item[i]->data, s->fcall.data, len); + item[i]->data[len] = 0; + /* TODO: redraw */ + } break; case Fcolor: + if(i == nitem) + new_item(); if((i >= nitem) || (s->fcall.count >= 24)) - goto invalid_xwrite; + goto error_xwrite; memcpy(item[i]->color, s->fcall.data, s->fcall.count); item[i]->color[s->fcall.count] = 0; /* TODO: update color */ break; -invalid_xwrite: default: - s->errstr = "permission denied"; +error_xwrite: + s->errstr = "invalid write request"; return -1; break; } - s->fcall.count = 0; return 0; }