wmii

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

commit 81b32b785ec60bc0c36cece7c05915dfc804da6e
parent 4d7f8725ee65fc7b29fee9cc39f25640b45e3d82
Author: Anselm R. Garbe <garbeam@wmii.de>
Date:   Fri, 10 Mar 2006 16:21:20 +0100

simplified wmii, removed /keys namespace, instead keys are grabbed through writing /def/keys, just read it to get a list of grabbed keys


Diffstat:
cmd/wm/event.c | 6+-----
cmd/wm/fs.c | 148+++++++++++++++++++++++++++++++++----------------------------------------------
cmd/wm/kb.c | 58+++++++++++++++++++++++++++++-----------------------------
cmd/wm/wm.c | 3++-
cmd/wm/wm.h | 12++++--------
rc/wmiirc | 2+-
6 files changed, 99 insertions(+), 130 deletions(-)

diff --git a/cmd/wm/event.c b/cmd/wm/event.c @@ -210,11 +210,7 @@ handle_keypress(XEvent *e) static void handle_keymapnotify(XEvent *e) { - unsigned int i; - for(i = 0; i < nkey; i++) { - ungrab_key(key[i]); - grab_key(key[i]); - } + update_keys(); } static void diff --git a/cmd/wm/fs.c b/cmd/wm/fs.c @@ -38,9 +38,8 @@ static char Enocommand[] = "command not supported"; * /def/font FsFfont xlib font name * /def/selcolors FsFselcolors sel color * /def/normcolors FsFnormcolors normal colors - * /def/rules FsFrules normal colors - * /keys/ FsDkeys - * /keys/foo FsFkey + * /def/rules FsFrules rules + * /def/keys FsFkeys keys * /tags/ FsDtags * /tags/foo FsFtags * /bar/ FsDbar @@ -123,7 +122,6 @@ decode_qpath(Qid *qid, unsigned char *type, int *i1, int *i2, int *i3) *i1 = cid2index(i1id); else { switch(*type) { - case FsFkey: *i1 = kid2index(i1id); break; case FsFdata: case FsFcolors: case FsDlabel: *i1 = lid2index(i1id); break; @@ -150,7 +148,6 @@ qid2name(Qid *qid) switch(type) { case FsDroot: return "/"; break; case FsDdef: return "def"; break; - case FsDkeys: return "keys"; break; case FsDtags: return "tags"; break; case FsDclients: return "clients"; break; case FsDbar: return "bar"; break; @@ -200,6 +197,7 @@ qid2name(Qid *qid) case FsFnormcolors: return "normcolors"; break; case FsFfont: return "font"; break; case FsFrules: return "rules"; break; + case FsFkeys: return "keys"; break; case FsFcolors: return "colors"; break; case FsFdata: if(i1 == -1) @@ -245,11 +243,6 @@ qid2name(Qid *qid) return "mode"; break; case FsFevent: return "event"; break; - case FsFkey: - if(i1 == -1) - return nil; - return key[i1]->name; - break; default: return nil; break; } } @@ -275,8 +268,6 @@ name2type(char *name, unsigned char dir_type) return FsDbar; if(!strncmp(name, "def", 4)) return FsDdef; - if(!strncmp(name, "keys", 5)) - return FsDkeys; if(!strncmp(name, "ctl", 4)) return FsFctl; if(!strncmp(name, "event", 6)) @@ -301,6 +292,8 @@ name2type(char *name, unsigned char dir_type) return FsFnormcolors; if(!strncmp(name, "font", 5)) return FsFfont; + if(!strncmp(name, "keys", 5)) + return FsFkeys; if(!strncmp(name, "rules", 6)) return FsFrules; if(!strncmp(name, "data", 5)) @@ -311,8 +304,6 @@ name2type(char *name, unsigned char dir_type) return FsFtag; if((dir_type == FsDbar) && name2label(name)) return FsDlabel; - if((dir_type == FsDkeys) && name2key(name)) - return FsFkey; if(!strncmp(name, "sel", 4)) goto dyndir; i = (unsigned short) cext_strtonum(name, 0, 0xffff, &err); @@ -346,7 +337,6 @@ mkqid(Qid *dir, char *wname, Qid *new) *new = root_qid; break; case FsDdef: - case FsDkeys: case FsDtags: case FsDclients: case FsDbar: @@ -415,17 +405,6 @@ mkqid(Qid *dir, char *wname, Qid *new) new->path = mkqpath(FsDlabel, l->id, 0, 0); } break; - case FsFkey: - if(dir_type != FsDkeys) - return -1; - { - Key *k; - if(!(k = name2key(wname))) - return -1; - new->type = IXP_QTFILE; - new->path = mkqpath(FsFkey, k->id, 0, 0); - } - break; case FsFdata: case FsFcolors: if((dir_i1 == -1) || (dir_type != FsDlabel)) @@ -457,6 +436,7 @@ mkqid(Qid *dir, char *wname, Qid *new) case FsFselcolors: case FsFnormcolors: case FsFsnap: + case FsFkeys: if(dir_type != FsDdef) return -1; default: @@ -508,7 +488,6 @@ type2stat(Stat *stat, char *wname, Qid *dir) return mkstat(stat, dir, wname, 0, DMDIR | DMREAD | DMEXEC); break; case FsDbar: - case FsDkeys: case FsFctl: return mkstat(stat, dir, wname, 0, DMWRITE); break; @@ -565,9 +544,6 @@ type2stat(Stat *stat, char *wname, Qid *dir) return mkstat(stat, dir, wname, strlen(def.tag), DMREAD | DMWRITE); return mkstat(stat, dir, wname, 0, 0); break; - case FsFkey: - return mkstat(stat, dir, wname, 0, DMWRITE); - break; case FsFexpand: return mkstat(stat, dir, wname, strlen(expand), DMREAD | DMWRITE); break; @@ -582,6 +558,9 @@ type2stat(Stat *stat, char *wname, Qid *dir) case FsFnormcolors: return mkstat(stat, dir, wname, 23, DMREAD | DMWRITE); break; + case FsFkeys: + return mkstat(stat, dir, wname, def.keys ? strlen(def.keys) : 0, DMREAD | DMWRITE); + break; case FsFrules: return mkstat(stat, dir, wname, def.rules ? strlen(def.rules) : 0, DMREAD | DMWRITE); break; @@ -671,9 +650,6 @@ xcreate(IXPConn *c, Fcall *fcall) return "illegal file name"; type = qpath_type(m->qid.path); switch(type) { - case FsDkeys: - grab_key(get_key(fcall->name)); - break; case FsDbar: if(!strncmp(fcall->name, "expand", 7)) return "illegal file name"; @@ -719,7 +695,7 @@ xremove(IXPConn *c, Fcall *fcall) decode_qpath(&m->qid, &type, &i1, &i2, &i3); if((i1 == -1) || (i2 == -1) || (i3 == -1)) return Enofile; - if(type != FsDlabel && type != FsFkey) + if(type != FsDlabel) return Enoperm; /* clunk */ cext_array_detach((void **)c->map, m, &c->mapsz); @@ -734,13 +710,6 @@ xremove(IXPConn *c, Fcall *fcall) draw_bar(); } break; - case FsFkey: - { - Key *k = key[i1]; - ungrab_key(k); - destroy_key(k); - } - break; default: break; } @@ -770,24 +739,6 @@ xread(IXPConn *c, Fcall *fcall) fcall->count = 0; if(fcall->offset) { switch (type) { - case FsDkeys: - /* jump to offset */ - len = 0; - for(i = 0; i < nkey; i++) { - len += type2stat(&stat, key[i]->name, &m->qid); - if(len <= fcall->offset) - continue; - break; - } - /* offset found, proceeding */ - for(; i < nkey; i++) { - len = type2stat(&stat, key[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; @@ -904,6 +855,20 @@ xread(IXPConn *c, Fcall *fcall) c->is_pending = 1; return nil; break; + case FsFkeys: + len = def.keys ? strlen(def.keys) : 0; + if(len <= fcall->offset) { + fcall->count = 0; + break; + } + fcall->count = len - fcall->offset; + if(fcall->count > fcall->iounit) { + memcpy(p, def.keys + fcall->offset, fcall->iounit); + fcall->count = fcall->iounit; + } + else if(fcall->count) + memcpy(p, def.keys + fcall->offset, fcall->count); + break; case FsFrules: len = def.rules ? strlen(def.rules) : 0; if(len <= fcall->offset) { @@ -931,8 +896,6 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "def", &m->qid); p = ixp_enc_stat(p, &stat); - fcall->count += type2stat(&stat, "keys", &m->qid); - p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "bar", &m->qid); p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "tags", &m->qid); @@ -942,15 +905,6 @@ xread(IXPConn *c, Fcall *fcall) fcall->count += type2stat(&stat, "ws", &m->qid); p = ixp_enc_stat(p, &stat); break; - case FsDkeys: - for(i = 0; i < nkey; i++) { - len = type2stat(&stat, key[i]->name, &m->qid); - if(fcall->count + len > fcall->iounit) - break; - fcall->count += len; - p = ixp_enc_stat(p, &stat); - } - break; case FsDclients: for(i = 0; i < nclient; i++) { snprintf(buf, sizeof(buf), "%u", i); @@ -1000,6 +954,8 @@ xread(IXPConn *c, Fcall *fcall) p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "font", &m->qid); p = ixp_enc_stat(p, &stat); + fcall->count += type2stat(&stat, "keys", &m->qid); + p = ixp_enc_stat(p, &stat); fcall->count += type2stat(&stat, "rules", &m->qid); p = ixp_enc_stat(p, &stat); break; @@ -1141,6 +1097,15 @@ xread(IXPConn *c, Fcall *fcall) if((fcall->count = strlen(def.normcolor))) memcpy(p, def.normcolor, fcall->count); break; + case FsFkeys: + fcall->count = def.keys ? strlen(def.keys) : 0; + if(fcall->count > fcall->iounit) { + memcpy(p, def.keys, fcall->iounit); + fcall->count = fcall->iounit; + } + else if(fcall->count) + memcpy(p, def.keys, fcall->count); + break; case FsFrules: fcall->count = def.rules ? strlen(def.rules) : 0; if(fcall->count > fcall->iounit) { @@ -1190,7 +1155,7 @@ xstat(IXPConn *c, Fcall *fcall) static char * xwrite(IXPConn *c, Fcall *fcall) { - char buf[256]; + char buf[256], *tmp; IXPMap *m = ixp_server_fid2map(c, fcall->fid); unsigned char type; unsigned int len; @@ -1352,22 +1317,33 @@ xwrite(IXPConn *c, Fcall *fcall) if(client[i]->frame[j]->area->tag == tag[sel]) draw_client(client[i]); break; + case FsFkeys: + if(def.keyssz < fcall->offset + fcall->count + 1) { + def.keyssz = fcall->offset + fcall->count + 1; + tmp = cext_emallocz(def.keyssz); + len = def.keys ? strlen(def.keys) : 0; + if(len) { + memcpy(tmp, def.keys, len); + free(def.keys); + } + def.keys = tmp; + } + memcpy(def.keys + fcall->offset, fcall->data, fcall->count); + def.keys[fcall->offset + fcall->count] = 0; + break; case FsFrules: - { - char *tmp; - if(def.rulessz < fcall->offset + fcall->count + 1) { - def.rulessz = fcall->offset + fcall->count + 1; - tmp = cext_emallocz(def.rulessz); - len = def.rules ? strlen(def.rules) : 0; - if(len) { - memcpy(tmp, def.rules, len); - free(def.rules); - } - def.rules = tmp; + if(def.rulessz < fcall->offset + fcall->count + 1) { + def.rulessz = fcall->offset + fcall->count + 1; + tmp = cext_emallocz(def.rulessz); + len = def.rules ? strlen(def.rules) : 0; + if(len) { + memcpy(tmp, def.rules, len); + free(def.rules); } - memcpy(def.rules + fcall->offset, fcall->data, fcall->count); - def.rules[fcall->offset + fcall->count] = 0; + def.rules = tmp; } + memcpy(def.rules + fcall->offset, fcall->data, fcall->count); + def.rules[fcall->offset + fcall->count] = 0; break; case FsFfont: if(def.font) @@ -1389,8 +1365,6 @@ xwrite(IXPConn *c, Fcall *fcall) tag[i1]->area[i2]->mode = i; arrange_area(tag[i1]->area[i2]); break; - case FsFkey: - break; default: return "invalid write"; break; @@ -1407,6 +1381,8 @@ xclunk(IXPConn *c, Fcall *fcall) if(!m) return Enofid; + if(qpath_type(m->qid.path) == FsFkeys) + update_keys(); cext_array_detach((void **)c->map, m, &c->mapsz); free(m); fcall->id = RCLUNK; diff --git a/cmd/wm/kb.c b/cmd/wm/kb.c @@ -61,7 +61,7 @@ blitz_strtomod(char *val) return mod; } -void +static void grab_key(Key *k) { XGrabKey(dpy, k->key, k->mod, root, @@ -75,7 +75,7 @@ grab_key(Key *k) XSync(dpy, False); } -void +static void ungrab_key(Key *k) { XUngrabKey(dpy, k->key, k->mod, root); @@ -86,7 +86,17 @@ ungrab_key(Key *k) XSync(dpy, False); } -Key * +static Key * +name2key(const char *name) +{ + unsigned int i; + for(i = 0; i < nkey; i++) + if(!strncmp(key[i]->name, name, sizeof(key[i]->name))) + return key[i]; + return nil; +} + +static Key * get_key(const char *name) { char buf[128]; @@ -248,34 +258,24 @@ handle_key(Window w, unsigned long mod, KeyCode keycode) free(found); } -Key * -name2key(const char *name) -{ - unsigned int i; - for(i = 0; i < nkey; i++) - if(!strncmp(key[i]->name, name, sizeof(key[i]->name))) - return key[i]; - return nil; -} - -int -kid2index(unsigned short id) -{ - int i; - for(i = 0; i < nkey; i++) - if(key[i]->id == id) - return i; - return -1; -} - - void update_keys() { - unsigned int i; - for(i = 0; i < nkey; i++) { - ungrab_key(key[i]); - grab_key(key[i]); + char *l, *p; + + while(nkey) { + ungrab_key(key[0]); + destroy_key(key[0]); } -} + for(l = p = def.keys; p && *p;) { + if(*p == '\n') { + *p = 0; + grab_key(get_key(l)); + *p = '\n'; + l = ++p; + } + else + p++; + } +} diff --git a/cmd/wm/wm.c b/cmd/wm/wm.c @@ -318,7 +318,8 @@ main(int argc, char *argv[]) nlabel = labelsz = 0; def.rules = nil; def.rulessz = 0; - + def.keys = nil; + def.keyssz = 0; def.font = strdup(BLITZ_FONT); def.border = DEF_BORDER; def.snap = DEF_SNAP; diff --git a/cmd/wm/wm.h b/cmd/wm/wm.h @@ -50,7 +50,6 @@ enum { FsDclients, FsDclient, FsDGclient, - FsDkeys, FsDtags, FsDbar, FsDlabel, @@ -60,7 +59,7 @@ enum { FsFfont, FsFselcolors, FsFnormcolors, - FsFkey, + FsFkeys, FsFborder, FsFsnap, FsFbar, @@ -163,6 +162,8 @@ typedef struct { Color norm; unsigned int border; unsigned int snap; + char *keys; + unsigned int keyssz; char *rules; unsigned int rulessz; } Default; @@ -271,13 +272,8 @@ void new_ixp_conn(IXPConn *c); /* kb.c */ void handle_key(Window w, unsigned long mod, KeyCode keycode); -void grab_key(Key *k); -void ungrab_key(Key *k); -Key *name2key(const char *name); -int kid2index(unsigned short id); -Key *get_key(const char *name); -void destroy_key(Key *k); void init_lock_modifiers(); +void update_keys(); /* mouse.c */ void mouse_resize(Client *c, Align align); diff --git a/rc/wmiirc b/rc/wmiirc @@ -47,7 +47,7 @@ proglist $OLD_PATH >/tmp/ns.$USER.$DISPLAY/progs & # SHORTCUTS while read key do - wmiir create /keys/$key + wmiir write /def/keys done <<EOF $MODKEY-Control-c $MODKEY-Control-w,y