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:
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