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

This commit is contained in:
Anselm R. Garbe 2006-03-10 16:21:20 +01:00
parent 4d7f8725ee
commit 81b32b785e
6 changed files with 100 additions and 131 deletions

View File

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

View File

@ -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 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;
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);
}
memcpy(def.rules + fcall->offset, fcall->data, fcall->count);
def.rules[fcall->offset + fcall->count] = 0;
def.keys = tmp;
}
memcpy(def.keys + fcall->offset, fcall->data, fcall->count);
def.keys[fcall->offset + fcall->count] = 0;
break;
case FsFrules:
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;
}
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;

View File

@ -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++;
}
}

View File

@ -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;

View File

@ -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);

View File

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