Index: scrotwm.c =================================================================== RCS file: /cvs/src/OpenBSD/ports/mystuff/x11/scrotwm/scrotwm.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.4.15 diff -u -p -r1.1.1.1 -r1.1.1.1.4.15 --- scrotwm.c 5 Aug 2009 09:09:15 -0000 1.1.1.1 +++ scrotwm.c 9 Aug 2009 14:34:23 -0000 1.1.1.1.4.15 @@ -51,7 +51,7 @@ static const char *cvstag = "$scrotwm: scrotwm.c,v 1.170 2009/05/28 18:25:30 marco Exp $"; -#define SWM_VERSION "0.9.5" +#define SWM_VERSION "0.9.6" #include #include @@ -264,6 +264,7 @@ enum keyfuncid { kf_focus_prev, kf_swap_next, kf_swap_prev, + kf_spawn_exec, kf_spawn_term, kf_spawn_menu, kf_quit, @@ -320,6 +321,7 @@ void update_modkey(unsigned int); int bindmatch(const char *var, const char *name, unsigned int currmod, char *keystr, enum keyfuncid *kfid, unsigned int *mod, KeySym *ks); void setkeybinding(unsigned int mod, KeySym ks, enum keyfuncid kfid); +void setspawnexec(const char *val); /* quirks */ int quirkmatch(const char *var, const char *name, char *qstr, char *qclass, char *qname, unsigned long *qquirk); @@ -615,8 +617,11 @@ conf_load(char *filename) else if (!strncmp(var, "bar_delay", strlen("bar_delay"))) bar_delay = atoi(val); else if (!bindmatch(var, "bind", modkey, val, - &kfid, &modmask, &ks)) + &kfid, &modmask, &ks)) { setkeybinding(modmask, ks, kfid); + if (kfid == kf_spawn_exec) + setspawnexec(var); + } else goto bad; break; @@ -1122,6 +1127,15 @@ spawn(struct swm_region *r, union arg *a } void +spawnexec(struct swm_region *r, const char *command) +{ + char *argv[] = { command, NULL }; + union arg args = { .argv = argv }; + fprintf (stderr, "%s: executing \"%s\"\n", __func__, command); + spawn(r, &args); +} + +void spawnterm(struct swm_region *r, union arg *args) { DNPRINTF(SWM_D_MISC, "spawnterm\n"); @@ -2143,6 +2157,7 @@ struct keyfunc { { "focus_prev", focus, {.id = SWM_ARG_ID_FOCUSPREV} }, { "swap_next", swapwin, {.id = SWM_ARG_ID_SWAPNEXT} }, { "swap_prev", swapwin, {.id = SWM_ARG_ID_SWAPPREV} }, + { "spawn_exec", NULL, {0} }, { "spawn_term", spawnterm, {.argv = spawn_term} }, { "spawn_menu", spawnmenu, {.argv = spawn_menu} }, { "quit", quit, {0} }, @@ -2186,6 +2201,7 @@ struct key { unsigned int mod; KeySym keysym; enum keyfuncid funcid; + char *command; }; int keys_size = 0, keys_length = 0; struct key *keys = NULL; @@ -2295,12 +2311,18 @@ bindmatch(const char *var, const char *n } } - return (1); + /* Assume binding for custom command. */ + *kfid = kf_spawn_exec; + return (!parsekeys(keystr, currmod, mod, ks)); } void setkeybinding(unsigned int mod, KeySym ks, enum keyfuncid kfid) { int i, j; + + if (kfid == kf_spawn_exec) + goto skip_find; + /* find existing */ for (i = 0; i < keys_length; i++) { if (keys[i].mod == mod && keys[i].keysym == ks) { @@ -2331,6 +2353,7 @@ setkeybinding(unsigned int mod, KeySym k "error: setkeybinding: cannot find mod/key combination"); return; } +skip_find: /* not found: add */ if (keys_size == 0 || keys == NULL) { keys_size = 4; @@ -2357,6 +2380,7 @@ setkeybinding(unsigned int mod, KeySym k keys[j].mod = mod; keys[j].keysym = ks; keys[j].funcid = kfid; + keys[j].command = NULL; } else { fprintf(stderr, "keys array problem?\n"); if (!keys) { @@ -2365,6 +2389,28 @@ setkeybinding(unsigned int mod, KeySym k } } } + +void +setspawnexec(const char *val) +{ + size_t n; + const char *c; + struct key *k; + + c = strchr(val, '['); + if (!c || c[1] == ']') { + warnx("invalid bind entry\n"); + return; + } + n = strlen(++c); + k = &keys[keys_length-1]; + k->command = malloc(n+1); + if (!k->command) + err(1, NULL); + strlcpy(k->command, c, n); + k->command[n] = '\0'; +} + void setup_keys(void) { @@ -2506,13 +2552,14 @@ keypress(XEvent *e) keysym = XKeycodeToKeysym(display, (KeyCode)ev->keycode, 0); for (i = 0; i < keys_length; i++) - if (keysym == keys[i].keysym - && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) - && keyfuncs[keys[i].funcid].func) - keyfuncs[keys[i].funcid].func( - root_to_region(ev->root), - &(keyfuncs[keys[i].funcid].args) - ); + if (keysym == keys[i].keysym) { + if (CLEANMASK(keys[i].mod) == + CLEANMASK(ev->state) && keyfuncs[keys[i].funcid].func) + keyfuncs[keys[i].funcid].func(root_to_region(ev->root), + &(keyfuncs[keys[i].funcid].args)); + else if (keys[i].command != NULL) + spawnexec(root_to_region(ev->root), keys[i].command); + } } void