wmii

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

commit 541149a0084be283bdc5ad48516610662bd54dd8
parent a38480e40ce67a2af78a96d2d5df04347630c92d
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Fri, 10 Feb 2006 15:59:30 +0100

fixed and polished several stuff in fs.c and various other parts in wm.


Diffstat:
cmd/wm/area.c | 4++--
cmd/wm/bar.c | 76++++++++++++++++++++++++++++++++++++++--------------------------------------
cmd/wm/client.c | 6+++---
cmd/wm/event.c | 4++--
cmd/wm/fs.c | 483+++++++++++++++++++++++++++++++++++++++----------------------------------------
cmd/wm/page.c | 4++--
cmd/wm/wm.c | 4++--
cmd/wm/wm.h | 28++++++++++++++--------------
libixp/ixp.h | 2+-
9 files changed, 300 insertions(+), 311 deletions(-)

diff --git a/cmd/wm/area.c b/cmd/wm/area.c @@ -28,7 +28,7 @@ destroy_area(Area *a) } int -index_of_area(Page *p, Area *a) +area_to_index(Page *p, Area *a) { int i; for(i = 0; i < p->narea; i++) @@ -38,7 +38,7 @@ index_of_area(Page *p, Area *a) } int -index_of_area_id(Page *p, unsigned short id) +aid_to_index(Page *p, unsigned short id) { int i; if(id == NEW_OBJ) diff --git a/cmd/wm/bar.c b/cmd/wm/bar.c @@ -7,24 +7,24 @@ #include "wm.h" -Item * -new_item() +Label * +new_label() { static unsigned int id = 1; - Item *it = cext_emallocz(sizeof(Item)); - it->id = id++; - cext_strlcpy(it->colstr, def.selcolor, sizeof(it->colstr)); - it->color = def.sel; - item = (Item **)cext_array_attach((void **)item, it, sizeof(Item *), &itemsz); - nitem++; - return it; + Label *l = cext_emallocz(sizeof(Label)); + l->id = id++; + cext_strlcpy(l->colstr, def.selcolor, sizeof(l->colstr)); + l->color = def.sel; + label = (Label **)cext_array_attach((void **)label, l, sizeof(Label *), &labelsz); + nlabel++; + return l; } void -detach_item(Item *it) +detach_label(Label *l) { - cext_array_detach((void **)item, it, &itemsz); - nitem--; + cext_array_detach((void **)label, l, &labelsz); + nlabel--; } void @@ -41,47 +41,47 @@ draw_bar() d.rect.y = 0; d.font = xfont; - if(!nitem) { /* /default only */ + if(!nlabel) { /* /default only */ d.color = def.sel; blitz_drawlabel(dpy, &d); } else { - for(i = 0; i < nitem; i++) { - Item *it = item[i]; - it->rect.x = it->rect.y = 0; - it->rect.height = brect.height; + for(i = 0; i < nlabel; i++) { + Label *l = label[i]; + l->rect.x = l->rect.y = 0; + l->rect.height = brect.height; if(i == iexpand) continue; - it->rect.width = brect.height; - if(strlen(it->data)) { - if(!strncmp(it->data, "%m:", 3)) - it->rect.width = brect.height / 2; + l->rect.width = brect.height; + if(strlen(l->data)) { + if(!strncmp(l->data, "%m:", 3)) + l->rect.width = brect.height / 2; else - it->rect.width += XTextWidth(xfont, it->data, strlen(it->data)); + l->rect.width += XTextWidth(xfont, l->data, strlen(l->data)); } - w += it->rect.width; + w += l->rect.width; } if(w >= brect.width) { /* failsafe mode, give all labels same width */ - w = brect.width / nitem; - for(i = 0; i < nitem; i++) { - item[i]->rect.x = i * w; - item[i]->rect.width = w; + w = brect.width / nlabel; + for(i = 0; i < nlabel; i++) { + label[i]->rect.x = i * w; + label[i]->rect.width = w; } i--; - item[i]->rect.width = brect.width - item[i]->rect.x; + label[i]->rect.width = brect.width - label[i]->rect.x; } else { - item[iexpand]->rect.width = brect.width - w; - for(i = 1; i < nitem; i++) - item[i]->rect.x = item[i - 1]->rect.x + item[i - 1]->rect.width; + label[iexpand]->rect.width = brect.width - w; + for(i = 1; i < nlabel; i++) + label[i]->rect.x = label[i - 1]->rect.x + label[i - 1]->rect.width; } - for(i = 0; i < nitem; i++) { - d.color = item[i]->color; - d.rect = item[i]->rect; - d.data = item[i]->data; + for(i = 0; i < nlabel; i++) { + d.color = label[i]->color; + d.rect = label[i]->rect; + d.data = label[i]->data; if(d.data && !strncmp(d.data, "%m:", 3)) blitz_drawmeter(dpy, &d); else @@ -93,11 +93,11 @@ draw_bar() } int -index_of_bar_id(unsigned short id) +lid_to_index(unsigned short id) { int i; - for(i = 0; i < nitem; i++) - if(item[i]->id == id) + for(i = 0; i < nlabel; i++) + if(label[i]->id == id) return i; return -1; } diff --git a/cmd/wm/client.c b/cmd/wm/client.c @@ -394,7 +394,7 @@ detach_client(Client *c, Bool unmap) if(client[i]->revert == c) client[i]->revert = nil; - if(index_of_area(c->page, c->area) > 0) + if(area_to_index(c->page, c->area) > 0) detach_column(c); else { Area *a = c->page->area[0]; @@ -505,7 +505,7 @@ resize_client(Client *c, XRectangle *r, XPoint *pt) unsigned int bh = bar_height(c); unsigned int bw = c->frame.border; - if(index_of_area(c->page, c->area) > 0) + if(area_to_index(c->page, c->area) > 0) resize_column(c, r, pt); else c->frame.rect = *r; @@ -548,7 +548,7 @@ max_client(void *obj, char *arg) */ int -index_of_client_id(Area *a, unsigned short id) +cid_to_index(Area *a, unsigned short id) { int i; if(id == NEW_OBJ) diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -66,8 +66,8 @@ handle_buttonpress(XEvent *e) static char buf[32]; if(ev->window == winbar) { size_t i; - for(i = 0; i < nitem; i++) - if(blitz_ispointinrect(ev->x, ev->y, &item[i]->rect)) { + for(i = 0; i < nlabel; i++) + if(blitz_ispointinrect(ev->x, ev->y, &label[i]->rect)) { snprintf(buf, sizeof(buf), "L%d B%d\n", i, ev->button); do_pend_fcall(buf); } diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -41,8 +41,8 @@ static char Enocommand[] = "command not supported"; * /keys/foo Fkey * /bar/ Dbar * /bar/expand Fexpand id of expandable label - * /bar/new/ Ditem - * /bar/1/ Ditem + * /bar/new/ Dlabel + * /bar/1/ Dlabel * /bar/1/data Fdata <arbitrary data which gets displayed> * /bar/1/color Fcolor <#RRGGBB> <#RRGGBB> <#RRGGBB> * /event Fevent @@ -78,11 +78,18 @@ const char *err; /* IXP stuff */ +/** + * Qid->path is calculated related to the index of the associated structure. + * i1 is associated to page, key or label + * i2 is associated to area + * i3 is associated to client + * ie /sel/sel/ctl is i1id = sel page id, i2id = sel area id , i3id = 0 (no id) + */ unsigned long long -mkqpath(unsigned char type, unsigned short pgid, unsigned short aid, unsigned short cid) +mkqpath(unsigned char type, unsigned short i1id, unsigned short i2id, unsigned short i3id) { - return ((unsigned long long) type << 48) | ((unsigned long long) pgid << 32) - | ((unsigned long long) aid << 16) | (unsigned long long) cid; + return ((unsigned long long) type << 48) | ((unsigned long long) i1id << 32) + | ((unsigned long long) i2id << 16) | (unsigned long long) i3id; } static unsigned char @@ -92,71 +99,91 @@ qpath_type(unsigned long long path) } static unsigned short -qpath_pgid(unsigned long long path) +qpath_i1id(unsigned long long path) { return (path >> 32) & 0xffff; } static unsigned short -qpath_aid(unsigned long long path) +qpath_i2id(unsigned long long path) { return (path >> 16) & 0xffff; } static unsigned short -qpath_cid(unsigned long long path) +qpath_i3id(unsigned long long path) { return path & 0xffff; } +static void +decode_qpath(Qid *qid, unsigned char *type, int *i1, int *i2, int *i3) +{ + unsigned short i1id = qpath_i1id(qid->path); + unsigned short i2id = qpath_i2id(qid->path); + unsigned short i3id = qpath_i3id(qid->path); + *type = qpath_type(qid->path); + + if(i1id) { + switch(*type) { + case Fctl: + case Dpage: *i1 = pid_to_index(i1id); break; + case Fkey: *i1 = kid_to_index(i1id); break; + case Fdata: + case Fcolor: + case Dlabel: *i1 = lid_to_index(i1id); break; + } + if(i2id && (*i1 != -1)) { + *i2 = aid_to_index(page[*i1], i2id); + if(i3id && (*i2 != -1)) + *i3 = cid_to_index(page[*i1]->area[*i2], i3id); + } + } +} + static char * qid_to_name(Qid *qid) { - unsigned char typ = qpath_type(qid->path); - unsigned short pgid = qpath_pgid(qid->path); - unsigned short aid = qpath_aid(qid->path); - unsigned short cid = qpath_cid(qid->path); - int pg = 0, area = 0, cl = 0; + unsigned char type; + int i1 = 0, i2 = 0, i3 = 0; static char buf[32]; - if(pgid && ((pg = index_of_page_id(pgid)) == -1)) - return nil; - if(aid && ((area = index_of_area_id(page[pg], aid)) == -1)) - return nil; - if(cid && ((cl = index_of_client_id(page[pg]->area[area], cid)) == -1)) - return nil; + decode_qpath(qid, &type, &i1, &i2, &i3); + if((i1 == -1) || (i2 == -1) || (i3 == -1)) + return 0; - switch(typ) { + switch(type) { case Droot: return "/"; break; case Ddef: return "def"; break; case Dkeys: return "keys"; break; + case Fbar: case Dbar: return "bar"; break; case Dpage: - if(pg == sel) + if(i1 == sel) return "sel"; - snprintf(buf, sizeof(buf), "%u", pg + 1); + snprintf(buf, sizeof(buf), "%u", i1 + 1); return buf; break; - case Ditem: - snprintf(buf, sizeof(buf), "%u", pg + 1); + case Dlabel: + snprintf(buf, sizeof(buf), "%u", i1 + 1); return buf; break; case Darea: - if(!area) { - if(page[pg]->sel) + if(!i2) { + if(page[i1]->sel) return "float"; else return "sel"; } - if(page[pg]->sel == area) + if(page[i1]->sel == i2) return "sel"; - snprintf(buf, sizeof(buf), "%u", area + 1); + snprintf(buf, sizeof(buf), "%u", i2 + 1); return buf; break; case Dclient: - if(page[pg]->area[area]->sel == cl) + if(page[i1]->area[i2]->sel == i3) return "sel"; - snprintf(buf, sizeof(buf), "%u", cl + 1); + snprintf(buf, sizeof(buf), "%u", i3 + 1); return buf; break; case Fcolor: return "color"; break; @@ -165,32 +192,30 @@ qid_to_name(Qid *qid) case Fctl: return "ctl"; break; case Fborder: return "border"; break; case Fsnap: return "border"; break; - case Fbar: return "bar"; break; case Finc: return "inc"; break; case Fgeom: return "geometry"; break; case Fname: return "name"; break; case Fevent: return "event"; break; - case Fkey: return key[pg]->name; break; + case Fkey: return key[i1]->name; break; default: return nil; break; } } static int -name_to_type(char *name, unsigned char dtyp) +name_to_type(char *name, unsigned char dir_type) { unsigned int i; if(!name || !name[0] || !strncmp(name, "/", 2) || !strncmp(name, "..", 3)) return Droot; if(!strncmp(name, "new", 4)) { - if(dtyp == Droot) - return Dpage; - if(dtyp == Dbar) - return Ditem; - if(dtyp == Dpage) - return Darea; + switch(dir_type) { + case Droot: return Dpage; break; + case Dbar: return Dlabel; break; + case Dpage: return Darea; break; + } } if(!strncmp(name, "bar", 4)) { - if(dtyp == Droot) + if(dir_type == Droot) return Dbar; else return Fbar; @@ -219,7 +244,7 @@ name_to_type(char *name, unsigned char dtyp) return Fcolor; if(!strncmp(name, "data", 5)) return Fdata; - if(key_of_name(name)) + if(name_to_key(name)) return Fkey; if(!strncmp(name, "sel", 4)) goto dyndir; @@ -227,10 +252,10 @@ name_to_type(char *name, unsigned char dtyp) if(err) return -1; dyndir: - /*fprintf(stderr, "nametotype: dtyp = %d\n", dtyp);*/ - switch(dtyp) { + /*fprintf(stderr, "nametotype: dir_type = %d\n", dir_type);*/ + switch(dir_type) { case Droot: return Dpage; break; - case Dbar: return Ditem; break; + case Dbar: return Dlabel; break; case Dpage: return Darea; break; case Darea: return Dclient; break; } @@ -240,24 +265,16 @@ dyndir: static int mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) { - unsigned char dtyp = qpath_type(dir->path); - unsigned short dpgid = qpath_pgid(dir->path); - unsigned short daid = qpath_aid(dir->path); - unsigned short dcid = qpath_cid(dir->path); - int dpg = 0, darea = 0, dcl = 0; - unsigned short i; - int type = name_to_type(wname, dtyp); + unsigned char dir_type; + int dir_i1 = 0, dir_i2 = 0, dir_i3 = 0; + int type, i; - if(dpgid && ((dpg = index_of_page_id(dpgid)) == -1)) - return -1; - if(daid && ((darea = index_of_area_id(page[dpg], daid)) == -1)) + decode_qpath(dir, &dir_type, &dir_i1, &dir_i2, &dir_i3); + if((dir_i1 == -1) || (dir_i2 == -1) || (dir_i3 == -1)) return -1; - if(dcid && ((dcl = index_of_client_id(page[dpg]->area[darea], dcid)) == -1)) - return -1; - if((dir->type != IXP_QTDIR) || (type == -1)) - return -1; - - new->dtype = dtyp; + type = name_to_type(wname, dir_type); + + new->dir_type = dir_type; new->version = 0; switch(type) { case Droot: @@ -275,23 +292,22 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) new->type = IXP_QTDIR; new->path = mkqpath(Dbar, 0, 0, 0); break; - case Ditem: + case Dlabel: new->type = IXP_QTDIR; if(!strncmp(wname, "new", 4)) { /*fprintf(stderr, "mkqid iswalk=%d, wname=%s\n", iswalk, wname);*/ if(iswalk) - new->path = mkqpath(Ditem, new_item()->id, 0, 0); + new->path = mkqpath(Dlabel, new_label()->id, 0, 0); else - new->path = mkqpath(Ditem, 0,0 ,0); + new->path = mkqpath(Dlabel, 0,0 ,0); } else { i = cext_strtonum(wname, 1, 0xffff, &err); - if(err || (i - 1 >= nitem)) + if(err || (i - 1 >= nlabel)) return -1; - new->path = mkqpath(Ditem, item[i - 1]->id, 0, 0); + new->path = mkqpath(Dlabel, label[i - 1]->id, 0, 0); } break; - case Dpage: new->type = IXP_QTDIR; if(!strncmp(wname, "new", 4)) { @@ -316,56 +332,51 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) } break; case Darea: - /*fprintf(stderr, "mkqid(): %s\n", "Darea");*/ - if(!npage || dpg >= npage) - return -1; - new->type = IXP_QTDIR; - if(!strncmp(wname, "new", 4)) { - if(iswalk) { - Area *a = alloc_area(); - Page *p = page[dpg]; - p->area = (Area **)cext_array_attach((void **)p->area, a, sizeof(Area *), &p->areasz); - p->narea++; - new->path = mkqpath(Darea, dpgid, a->id, 0); + { + Page *p = page[dir_i1]; + new->type = IXP_QTDIR; + if(!strncmp(wname, "new", 4)) { + if(iswalk) { + Area *a = alloc_area(); + p->area = (Area **)cext_array_attach((void **)p->area, a, sizeof(Area *), &p->areasz); + p->narea++; + new->path = mkqpath(Darea, p->id, a->id, 0); + } + else + new->path = mkqpath(Darea, p->id, 0, 0); /* simple stat */ + } + else if(!strncmp(wname, "sel", 4)) + new->path = mkqpath(Darea, p->id, p->area[p->sel]->id, 0); + else { + i = cext_strtonum(wname, 1, 0xffff, &err); + if(err || (i - 1 >= p->narea)) + return -1; + new->path = mkqpath(Darea, p->id, p->area[i - 1]->id, 0); } - else - new->path = mkqpath(Darea, dpgid, 0, 0); - } - else if(!strncmp(wname, "sel", 4)) { - Page *p = page[dpg]; - if(!p->narea) - return -1; - new->path = mkqpath(Darea, dpgid, p->area[p->sel]->id, 0); - } - else { - i = cext_strtonum(wname, 1, 0xffff, &err); - if(err || (i - 1 >= page[dpg]->narea)) - return -1; - new->path = mkqpath(Darea, dpgid, page[dpg]->area[i - 1]->id, 0); } break; case Dclient: - if(!npage) - return -1; - new->type = IXP_QTDIR; - if(!strncmp(wname, "sel", 4)) { - Area *a = page[dpg]->area[darea]; - if(!a->nclient) - return -1; - new->path = mkqpath(Dclient, dpgid, daid, a->client[a->sel]->id); - } - else { - Area *a = page[dpg]->area[darea]; - i = cext_strtonum(wname, 1, 0xffff, &err); - if(err || (i - 1 >= page[dpg]->area[darea]->nclient)) - return -1; - new->path = mkqpath(Dclient, dpgid, daid, a->client[i - 1]->id); + { + Page *p = page[dir_i1]; + Area *a = p->area[dir_i2]; + new->type = IXP_QTDIR; + if(!strncmp(wname, "sel", 4)) { + if(!a->nclient) + return -1; + new->path = mkqpath(Dclient, p->id, a->id, a->client[a->sel]->id); + } + else { + i = cext_strtonum(wname, 1, 0xffff, &err); + if(err || (i - 1 >= a->nclient)) + return -1; + new->path = mkqpath(Dclient, p->id, a->id, a->client[i - 1]->id); + } } break; case Fkey: { Key *k; - if(!(k = key_of_name(wname))) + if(!(k = name_to_key(wname))) return -1; new->type = IXP_QTFILE; new->path = mkqpath(Fkey, k->id, 0, 0); @@ -373,11 +384,11 @@ mkqid(Qid *dir, char *wname, Qid *new, Bool iswalk) break; case Fdata: case Fcolor: - if(dpgid >= nitem) + if(dir_i1 >= nlabel) return -1; default: new->type = IXP_QTFILE; - new->path = mkqpath(type, dpgid, daid, dcid); + new->path = mkqpath(type, qpath_i1id(dir->path), qpath_i2id(dir->path), qpath_i3id(dir->path)); break; } return 0; @@ -487,32 +498,18 @@ mkstat(Stat *stat, Qid *dir, char *name, unsigned long long length, unsigned int } static unsigned int -type_to_stat(Stat *stat, char *name, Qid *dir) +type_to_stat(Stat *stat, char *wname, Qid *dir) { - unsigned char dtyp = qpath_type(dir->path); - unsigned short dpgid = qpath_pgid(dir->path); - unsigned short daid = qpath_aid(dir->path); - unsigned short dcid = qpath_cid(dir->path); - int dpg = 0, darea = 0, dcl = 0; - int type = name_to_type(name, dir->dtype); + unsigned char dir_type; + int dir_i1 = 0, dir_i2 = 0, dir_i3 = 0; + int type; char buf[32]; Client *c; - /*fprintf(stderr, "typetostat(0): name=%s dpgid=%d daid=%d dcid=%d\n", name, dpgid, daid, dcid); - fprintf(stderr, "typetostat (0) Dtype=%d\n", type); - */ - - if(dpgid && ((dpg = index_of_page_id(dpgid)) == -1)) - return 0; - if(daid && ((darea = index_of_area_id(page[dpg], daid)) == -1)) - return 0; - if(dcid && ((dcl = index_of_client_id(page[dpg]->area[darea], dcid)) == -1)) - return 0; - - /* - fprintf(stderr, "typetostat(1): dpg=%d darea=%d dcl=%d\n", dpg, darea, dcl); - fprintf(stderr, "typetostat (3) Dtype=%d\n", type); - */ + decode_qpath(dir, &dir_type, &dir_i1, &dir_i2, &dir_i3); + if((dir_i1 == -1) || (dir_i2 == -1) || (dir_i3 == -1)) + return -1; + type = name_to_type(wname, dir_type); switch (type) { case Dclient: @@ -521,57 +518,58 @@ type_to_stat(Stat *stat, char *name, Qid *dir) case Ddef: case Dkeys: case Dbar: + case Dlabel: case Droot: - return mkstat(stat, dir, name, 0, DMDIR | DMREAD | DMEXEC); + return mkstat(stat, dir, wname, 0, DMDIR | DMREAD | DMEXEC); break; case Fctl: case Fevent: - return mkstat(stat, dir, name, 0, DMREAD); + return mkstat(stat, dir, wname, 0, DMREAD); break; case Fborder: - if(dtyp == Ddef) + if(dir_type == Ddef) snprintf(buf, sizeof(buf), "%d", def.border); else - snprintf(buf, sizeof(buf), "%d", page[dpg]->area[darea]->client[dcl]->frame.border); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + snprintf(buf, sizeof(buf), "%d", page[dir_i1]->area[dir_i2]->client[dir_i3]->frame.border); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Fbar: - if(dtyp == Ddef) + if(dir_type == Ddef) snprintf(buf, sizeof(buf), "%d", def.bar); else - snprintf(buf, sizeof(buf), "%d", page[dpg]->area[darea]->client[dcl]->frame.bar); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + snprintf(buf, sizeof(buf), "%d", page[dir_i1]->area[dir_i2]->client[dir_i3]->frame.bar); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Finc: snprintf(buf, sizeof(buf), "%d", def.inc); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Fgeom: - c = page[dpg]->area[darea]->client[dcl]; + c = page[dir_i1]->area[dir_i2]->client[dir_i3]; snprintf(buf, sizeof(buf), "%d %d %d %d", c->frame.rect.x, c->frame.rect.y, c->frame.rect.width, c->frame.rect.height); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Fsnap: snprintf(buf, sizeof(buf), "%d", def.snap); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Fname: - c = page[dpg]->area[darea]->client[dcl]; - return mkstat(stat, dir, name, strlen(c->name), DMREAD); + c = page[dir_i1]->area[dir_i2]->client[dir_i3]; + return mkstat(stat, dir, wname, strlen(c->name), DMREAD); break; case Fkey: - return mkstat(stat, dir, name, 0, 0); + return mkstat(stat, dir, wname, 0, DMWRITE); break; case Fexpand: snprintf(buf, sizeof(buf), "%u", iexpand + 1); - return mkstat(stat, dir, name, strlen(buf), DMREAD | DMWRITE); + return mkstat(stat, dir, wname, strlen(buf), DMREAD | DMWRITE); break; case Fdata: - return mkstat(stat, dir, name, (dpg == nitem) ? 0 : strlen(item[dpg]->data), DMREAD | DMWRITE); + return mkstat(stat, dir, wname, (dir_i1 == nlabel) ? 0 : strlen(label[dir_i1]->data), DMREAD | DMWRITE); break; case Fcolor: - return mkstat(stat, dir, name, 23, DMREAD | DMWRITE); + return mkstat(stat, dir, wname, 23, DMREAD | DMWRITE); break; } return 0; @@ -581,29 +579,43 @@ static char * xremove(IXPConn *c, Fcall *fcall) { IXPMap *m = ixp_server_fid2map(c, fcall->fid); - unsigned short id = qpath_pgid(m->qid.path); - int i; + unsigned char type; + int i1 = 0, i2 = 0, i3 = 0; if(!m) return Enofid; - if(id && ((i = index_of_page_id(id)) == -1)) + decode_qpath(&m->qid, &type, &i1, &i2, &i3); + if((i1 == -1) || (i2 == -1) || (i3 == -1)) return Enofile; - if((qpath_type(m->qid.path) == Ditem) && (i < nitem)) { - Item *it = item[i]; - /* clunk */ - cext_array_detach((void **)c->map, m, &c->mapsz); - free(m); - /* now detach the item */ - detach_item(it); - free(it); - if(iexpand >= nitem) - iexpand = 0; - draw_bar(); - fcall->id = RREMOVE; - ixp_server_respond_fcall(c, fcall); - return nil; + switch(type) { + case Dlabel: + { + Label *l = label[i1]; + /* clunk */ + cext_array_detach((void **)c->map, m, &c->mapsz); + free(m); + /* now detach the label */ + detach_label(l); + free(l); + if(iexpand >= nlabel) + iexpand = 0; + draw_bar(); + } + break; + case Fkey: + { + Key *k = key[i1]; + ungrab_key(k); + destroy_key(k); + } + break; + default: + return Enoperm; + break; } - return Enoperm; + fcall->id = RREMOVE; + ixp_server_respond_fcall(c, fcall); + return nil; } static char * @@ -612,29 +624,21 @@ xread(IXPConn *c, Fcall *fcall) Stat stat; IXPMap *m = ixp_server_fid2map(c, fcall->fid); unsigned char *p = fcall->data; - unsigned short pgid, aid, cid; unsigned int i, len; char buf[32]; + unsigned char type; + int i1 = 0, i2 = 0, i3 = 0; Client *client; - int pg = 0, area = 0, cl = 0; if(!m) return Enofid; - - pgid = qpath_pgid(m->qid.path); - aid = qpath_aid(m->qid.path); - cid = qpath_cid(m->qid.path); - - if(pgid && ((pg = index_of_page_id(pgid)) == -1)) - return Enofile; - if(aid && ((area = index_of_area_id(page[pg], aid)) == -1)) - return Enofile; - if(cid && ((cl = index_of_client_id(page[pg]->area[area], cid)) == -1)) + decode_qpath(&m->qid, &type, &i1, &i2, &i3); + if((i1 == -1) || (i2 == -1) || (i3 == -1)) return Enofile; fcall->count = 0; if(fcall->offset) { - switch (qpath_type(m->qid.path)) { + switch (type) { case Droot: /* jump to offset */ len = type_to_stat(&stat, "ctl", &m->qid); @@ -668,7 +672,7 @@ xread(IXPConn *c, Fcall *fcall) break; case Dkeys: /* jump to offset */ - len = type_to_stat(&stat, "grab", &m->qid); + len = 0; for(i = 0; i < nkey; i++) { len += type_to_stat(&stat, key[i]->name, &m->qid); fprintf(stderr, "len=%d <= fcall->offset=%lld\n", len, fcall->offset); @@ -690,7 +694,7 @@ xread(IXPConn *c, Fcall *fcall) /* jump to offset */ len = type_to_stat(&stat, "expand", &m->qid); len += type_to_stat(&stat, "new", &m->qid); - for(i = 0; i < nitem; i++) { + for(i = 0; i < nlabel; i++) { snprintf(buf, sizeof(buf), "%u", i + 1); len += type_to_stat(&stat, buf, &m->qid); if(len <= fcall->offset) @@ -698,7 +702,7 @@ xread(IXPConn *c, Fcall *fcall) break; } /* offset found, proceeding */ - for(; i < nitem; i++) { + for(; i < nlabel; i++) { snprintf(buf, sizeof(buf), "%u", i + 1); len = type_to_stat(&stat, buf, &m->qid); if(fcall->count + len > fcall->iounit) @@ -711,8 +715,8 @@ xread(IXPConn *c, Fcall *fcall) /* jump to offset */ len = type_to_stat(&stat, "ctl", &m->qid); len += type_to_stat(&stat, "new", &m->qid); - for(i = 0; i < page[pg]->narea; i++) { - if(i == page[pg]->sel) + for(i = 0; i < page[i1]->narea; i++) { + if(i == page[i1]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -722,8 +726,8 @@ xread(IXPConn *c, Fcall *fcall) break; } /* offset found, proceeding */ - for(; i < page[pg]->narea; i++) { - if(i == page[pg]->sel) + for(; i < page[i1]->narea; i++) { + if(i == page[i1]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -737,8 +741,8 @@ xread(IXPConn *c, Fcall *fcall) case Darea: /* jump to offset */ len = type_to_stat(&stat, "ctl", &m->qid); - for(i = 0; i < page[pg]->area[area]->nclient; i++) { - if(i == page[pg]->area[area]->sel) + for(i = 0; i < page[i1]->area[i2]->nclient; i++) { + if(i == page[i1]->area[i2]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -748,8 +752,8 @@ xread(IXPConn *c, Fcall *fcall) break; } /* offset found, proceeding */ - for(; i < page[pg]->area[area]->nclient; i++) { - if(i == page[pg]->area[area]->sel) + for(; i < page[i1]->area[i2]->nclient; i++) { + if(i == page[i1]->area[i2]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -769,7 +773,7 @@ xread(IXPConn *c, Fcall *fcall) } } else { - switch (qpath_type(m->qid.path)) { + switch (type) { case Droot: /*fprintf(stderr, "%s", "Droot dir creation\n");*/ fcall->count = type_to_stat(&stat, "ctl", &m->qid); @@ -797,8 +801,6 @@ xread(IXPConn *c, Fcall *fcall) } break; case Dkeys: - fcall->count = type_to_stat(&stat, "grab", &m->qid); - p = ixp_enc_stat(p, &stat); for(i = 0; i < nkey; i++) { fprintf(stderr, "normal xread %s\n", key[i]->name); len = type_to_stat(&stat, key[i]->name, &m->qid); @@ -813,7 +815,7 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); fcall->count += type_to_stat(&stat, "new", &m->qid); p = ixp_enc_stat(p, &stat); - for(i = 0; i < nitem; i++) { + for(i = 0; i < nlabel; i++) { snprintf(buf, sizeof(buf), "%u", i + 1); len = type_to_stat(&stat, buf, &m->qid); if(fcall->count + len > fcall->iounit) @@ -822,8 +824,8 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); } break; - case Ditem: - if(i >= nitem) + case Dlabel: + if(i1 >= nlabel) return Enofile; fcall->count = type_to_stat(&stat, "color", &m->qid); p = ixp_enc_stat(p, &stat); @@ -845,8 +847,8 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); fcall->count += type_to_stat(&stat, "new", &m->qid); p = ixp_enc_stat(p, &stat); - for(i = 0; i < page[pg]->narea; i++) { - if(i == page[pg]->sel) + for(i = 0; i < page[i1]->narea; i++) { + if(i == page[i1]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -860,8 +862,8 @@ xread(IXPConn *c, Fcall *fcall) case Darea: fcall->count = type_to_stat(&stat, "ctl", &m->qid); p = ixp_enc_stat(p, &stat); - for(i = 0; i < page[pg]->area[area]->nclient; i++) { - if(i == page[pg]->area[area]->sel) + for(i = 0; i < page[i1]->area[i2]->nclient; i++) { + if(i == page[i1]->area[i2]->sel) snprintf(buf, sizeof(buf), "%s", "sel"); else snprintf(buf, sizeof(buf), "%u", i + 1); @@ -897,21 +899,18 @@ xread(IXPConn *c, Fcall *fcall) return nil; break; case Fborder: - /*fprintf(stderr, "Fborder: qpath_type(m->qid.path)=%d, m->qid.dtype=%d\n", - qpath_type(m->qid.path), m->qid.dtype);*/ - - if(m->qid.dtype == Ddef) + if(m->qid.dir_type == Ddef) snprintf(buf, sizeof(buf), "%u", def.border); else - snprintf(buf, sizeof(buf), "%u", page[pg]->area[area]->client[cl]->frame.border); + snprintf(buf, sizeof(buf), "%u", page[i1]->area[i2]->client[i3]->frame.border); fcall->count = strlen(buf); memcpy(p, buf, fcall->count); break; case Fbar: - if(m->qid.dtype == Ddef) + if(m->qid.dir_type == Ddef) snprintf(buf, sizeof(buf), "%u", def.bar); else - snprintf(buf, sizeof(buf), "%u", page[pg]->area[area]->client[cl]->frame.bar); + snprintf(buf, sizeof(buf), "%u", page[i1]->area[i2]->client[i3]->frame.bar); fcall->count = strlen(buf); memcpy(p, buf, fcall->count); break; @@ -921,7 +920,7 @@ xread(IXPConn *c, Fcall *fcall) memcpy(p, buf, fcall->count); break; case Fgeom: - client = page[pg]->area[area]->client[cl]; + client = page[i1]->area[i2]->client[i3]; snprintf(buf, sizeof(buf), "%d %d %d %d", client->frame.rect.x, client->frame.rect.y, client->frame.rect.width, client->frame.rect.height); fcall->count = strlen(buf); @@ -933,8 +932,8 @@ xread(IXPConn *c, Fcall *fcall) memcpy(p, buf, fcall->count); break; case Fname: - if((fcall->count = strlen(page[pg]->area[area]->client[cl]->name))) - memcpy(p, page[pg]->area[area]->client[cl]->name, fcall->count); + if((fcall->count = strlen(page[i1]->area[i2]->client[i3]->name))) + memcpy(p, page[i1]->area[i2]->client[i3]->name, fcall->count); break; case Fexpand: snprintf(buf, sizeof(buf), "%u", iexpand + 1); @@ -942,16 +941,16 @@ xread(IXPConn *c, Fcall *fcall) memcpy(p, buf, fcall->count); break; case Fdata: - if(pg >= nitem) + if(i1 >= nlabel) return Enofile; - if((fcall->count = strlen(item[pg]->data))) - memcpy(p, item[pg]->data, fcall->count); + if((fcall->count = strlen(label[i1]->data))) + memcpy(p, label[i1]->data, fcall->count); break; case Fcolor: - if(pg >= nitem) + if(i1 >= nlabel) return Enofile; - if((fcall->count = strlen(item[pg]->colstr))) - memcpy(p, item[pg]->colstr, fcall->count); + if((fcall->count = strlen(label[i1]->colstr))) + memcpy(p, label[i1]->colstr, fcall->count); break; default: return "invalid read"; @@ -984,22 +983,14 @@ xwrite(IXPConn *c, Fcall *fcall) { char buf[256]; IXPMap *m = ixp_server_fid2map(c, fcall->fid); - unsigned short pgid, aid, cid; unsigned short i; - int pg = 0, area = 0, cl = 0; + unsigned char type; + int i1 = 0, i2 = 0, i3 = 0; if(!m) return Enofid; - - pgid = qpath_pgid(m->qid.path); - aid = qpath_aid(m->qid.path); - cid = qpath_cid(m->qid.path); - - if(pgid && ((pg = index_of_page_id(pgid)) == -1)) - return Enofile; - if(aid && ((area = index_of_area_id(page[pg], aid)) == -1)) - return Enofile; - if(cid && ((cl = index_of_client_id(page[pg]->area[area], cid)) == -1)) + decode_qpath(&m->qid, &type, &i1, &i2, &i3); + if((i1 == -1) || (i2 == -1) || (i3 == -1)) return Enofile; switch (qpath_type(m->qid.path)) { @@ -1008,7 +999,7 @@ xwrite(IXPConn *c, Fcall *fcall) return Enocommand; memcpy(buf, fcall->data, fcall->count); buf[fcall->count] = 0; - switch(m->qid.dtype) { + switch(m->qid.dir_type) { case Droot: if(!strncmp(buf, "quit", 5)) srv.running = 0; @@ -1058,10 +1049,10 @@ xwrite(IXPConn *c, Fcall *fcall) i = cext_strtonum(buf, 0, 0xffff, &err); if(err) return "border value out of range 0..0xffff"; - if(m->qid.dtype == Ddef) + if(m->qid.dir_type == Ddef) def.border = i; else { - page[pg]->area[area]->client[cl]->frame.border = i; + page[i1]->area[i2]->client[i3]->frame.border = i; /* TODO: resize client */ } break; @@ -1073,10 +1064,10 @@ xwrite(IXPConn *c, Fcall *fcall) i = cext_strtonum(buf, 0, 1, &err); if(err) return "bar value out of range 0, 1"; - if(m->qid.dtype == Ddef) + if(m->qid.dir_type == Ddef) def.border = i; else { - page[pg]->area[area]->client[cl]->frame.border = i; + page[i1]->area[i2]->client[i3]->frame.border = i; /* TODO: resize client */ } break; @@ -1096,7 +1087,7 @@ xwrite(IXPConn *c, Fcall *fcall) return "geometry values out of range"; memcpy(buf, fcall->data, fcall->count); buf[fcall->count] = 0; - blitz_strtorect(&rect, &page[pg]->area[area]->client[cl]->frame.rect, buf); + blitz_strtorect(&rect, &page[i1]->area[i2]->client[i3]->frame.rect, buf); /* TODO: resize client */ break; case Fexpand: @@ -1106,8 +1097,8 @@ xwrite(IXPConn *c, Fcall *fcall) memcpy(buf, fcall->data, fcall->count); buf[fcall->count] = 0; i = (unsigned short) cext_strtonum(buf, 1, 0xffff, &err); - if(!err && (pg - 1 < nitem)) { - iexpand = pg - 1; + if(!err && (i - 1 < nlabel)) { + iexpand = i - 1; draw_bar(); break; } @@ -1118,24 +1109,22 @@ xwrite(IXPConn *c, Fcall *fcall) case Fdata: { unsigned int len = fcall->count; - if(pg >= nitem) - return Enofile; - if(len >= sizeof(item[pg]->data)) - len = sizeof(item[pg]->data) - 1; - memcpy(item[pg]->data, fcall->data, len); - item[pg]->data[len] = 0; + if(len >= sizeof(label[i1]->data)) + len = sizeof(label[i1]->data) - 1; + memcpy(label[i1]->data, fcall->data, len); + label[i1]->data[len] = 0; draw_bar(); } break; case Fcolor: - if((pg >= nitem) || (fcall->count != 23) + if((i1 >= nlabel) || (fcall->count != 23) || (fcall->data[0] != '#') || (fcall->data[8] != '#') || (fcall->data[16] != '#') ) return "wrong color format"; - memcpy(item[pg]->colstr, fcall->data, fcall->count); - item[pg]->colstr[fcall->count] = 0; - blitz_loadcolor(dpy, screen, item[pg]->colstr, &item[pg]->color); + memcpy(label[i1]->colstr, fcall->data, fcall->count); + label[i1]->colstr[fcall->count] = 0; + blitz_loadcolor(dpy, screen, label[i1]->colstr, &label[i1]->color); draw_bar(); break; default: diff --git a/cmd/wm/page.c b/cmd/wm/page.c @@ -213,7 +213,7 @@ select_client(void *obj, char *arg) if(!c || !arg) return; - if(index_of_area(c->page, c->area) > 0) + if(area_to_index(c->page, c->area) > 0) select_column(c, arg); else { Area *a = c->area; @@ -240,7 +240,7 @@ select_client(void *obj, char *arg) */ int -index_of_page_id(unsigned short id) +pid_to_index(unsigned short id) { int i; if(id == NEW_OBJ) diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -661,8 +661,8 @@ main(int argc, char *argv[]) key = nil; keysz = nkey = 0; - item = nil; - nitem = itemsz = iexpand = 0; + label = nil; + nlabel = labelsz = iexpand = 0; def.font = strdup(BLITZ_FONT); def.border = DEF_BORDER; diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -27,7 +27,7 @@ enum { Dclient, Dkeys, Dbar, - Ditem, + Dlabel, Fexpand, Fdata, /* data to display */ Fcolor, @@ -116,7 +116,7 @@ typedef struct { char colstr[24]; Color color; XRectangle rect; -} Item; +} Label; /* default values */ typedef struct { @@ -147,9 +147,9 @@ size_t clientsz; Key **key; size_t keysz; size_t nkey; -Item **item; -size_t nitem; -size_t itemsz; +Label **label; +size_t nlabel; +size_t labelsz; size_t iexpand; Display *dpy; @@ -195,14 +195,14 @@ unsigned int valid_mask, num_lock_mask; /* area.c */ Area *alloc_area(); void destroy_area(Area *a); -int index_of_area(Page *p, Area *a); -int index_of_area_id(Page *p, unsigned short id); +int area_to_index(Page *p, Area *a); +int aid_to_index(Page *p, unsigned short id); /* bar.c */ -Item *new_item(); -void detach_item(Item *it); +Label *new_label(); +void detach_label(Label *l); void draw_bar(); -int index_of_item_id(unsigned short id); +int lid_to_index(unsigned short id); /* client.c */ Client *alloc_client(Window w, XWindowAttributes *wa); @@ -223,7 +223,7 @@ void focus_client(Client *c); Client *win_to_frame(Window w); void resize_client(Client *c, XRectangle * r, XPoint * pt); unsigned int bar_height(Client *c); -int index_of_client_id(Area *a, unsigned short id); +int cid_to_index(Area *a, unsigned short id); /* event.c */ void init_x_event_handler(); @@ -239,8 +239,8 @@ void new_ixp_conn(IXPConn *c); void handle_key(Window w, unsigned long mod, KeyCode keycode); void grab_key(Key *k); void ungrab_key(Key *k); -Key * key_of_name(char *name); -int index_of_key_id(unsigned short id); +Key * name_to_key(char *name); +int kid_to_index(unsigned short id); Key *create_key(char *name); void destroy_key(Key *k); void init_lock_modifiers(); @@ -260,7 +260,7 @@ Page *alloc_page(); void destroy_page(Page *p); void focus_page(Page *p); XRectangle *rectangles(unsigned int *num); -int index_of_page_id(unsigned short id); +int pid_to_index(unsigned short id); /* spawn.c */ void spawn(char *cmd); diff --git a/libixp/ixp.h b/libixp/ixp.h @@ -147,7 +147,7 @@ struct Qid { unsigned int version; unsigned long long path; /* internal use only */ - unsigned char dtype; + unsigned char dir_type; }; /*stat structure */