# HG changeset patch # User paulo@thepaulopc # Date 1307914374 25200 # Node ID 0968b3739b8d01191b735d2efa62fb4dfea86213 # Parent e060ab82b136c5ae8aa8221d0392a215eda78cea apply keymodes patch diff -r e060ab82b136 -r 0968b3739b8d client.c --- a/client.c Wed Jan 27 23:28:29 2010 -0800 +++ b/client.c Sun Jun 12 14:32:54 2011 -0700 @@ -426,6 +426,11 @@ lt->arrange(); } +void +zoom_insert(Arg *arg) { + func_insert(zoom, arg); +} + Client * prevtiled(Client *c) { for(; c && (c->isversatile || !isvisible(c)); c = c->prev); diff -r e060ab82b136 -r 0968b3739b8d config.h --- a/config.h Wed Jan 27 23:28:29 2010 -0800 +++ b/config.h Sun Jun 12 14:32:54 2011 -0700 @@ -46,79 +46,15 @@ #define MASTER 650 /* per thousand */ #define NMASTER 1 /* clients in master area */ +#define COMMANDMODE 1 +#define INSERTMODE 2 + /* key definitions */ #define MODKEY Mod4Mask #define KEYS \ static Key key[] = { \ /* modifier key function argument */ \ - { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "/home/paulo/bin/myterm.sh" } }, \ - { MODKEY, XK_backslash, spawn, { .cmd = "/home/paulo/bin/myterm.sh -e /home/paulo/bin/viclip.sh" } }, \ - { MODKEY, XK_n, pushdown, { 0 } }, \ - { MODKEY, XK_p, pushup, { 0 } }, \ - { MODKEY, XK_Tab, focusnext, { 0 } }, \ - { MODKEY|ShiftMask, XK_Tab, focusprev, { 0 } }, \ - { MODKEY, XK_Return, zoom, { 0 } }, \ - { MODKEY, XK_g, resizemaster, { .i = 15 } }, \ - { MODKEY, XK_s, resizemaster, { .i = -15 } }, \ - { MODKEY, XK_i, incnmaster, { .i = 1 } }, \ - { MODKEY, XK_d, incnmaster, { .i = -1 } }, \ - { MODKEY|ShiftMask, XK_grave, tag, { .i = -1 } }, \ - { MODKEY|ShiftMask, XK_1, tag, { .i = 0 } }, \ - { MODKEY|ShiftMask, XK_2, tag, { .i = 1 } }, \ - { MODKEY|ShiftMask, XK_3, tag, { .i = 2 } }, \ - { MODKEY|ShiftMask, XK_4, tag, { .i = 3 } }, \ - { MODKEY|ShiftMask, XK_5, tag, { .i = 4 } }, \ - { MODKEY|ShiftMask, XK_6, tag, { .i = 5 } }, \ - { MODKEY|ShiftMask, XK_7, tag, { .i = 6 } }, \ - { MODKEY|ShiftMask, XK_8, tag, { .i = 7 } }, \ - { MODKEY|ShiftMask, XK_9, tag, { .i = 8 } }, \ - { MODKEY|ShiftMask, XK_0, tag, { .i = 9 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_1, toggletag, { .i = 0 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_2, toggletag, { .i = 1 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_3, toggletag, { .i = 2 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_4, toggletag, { .i = 3 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_5, toggletag, { .i = 4 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_6, toggletag, { .i = 5 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_7, toggletag, { .i = 6 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_8, toggletag, { .i = 7 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_9, toggletag, { .i = 8 } }, \ - { MODKEY|ControlMask|ShiftMask, XK_0, toggletag, { .i = 9 } }, \ - { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ - { MODKEY, XK_space, setlayout, { .i = -1 } }, \ - { MODKEY|ShiftMask, XK_space, setlayout, { .i = -2 } }, \ - { MODKEY, XK_F1, setlayout, { .i = 0 } }, \ - { MODKEY, XK_F2, setlayout, { .i = 1 } }, \ - { MODKEY, XK_F3, setlayout, { .i = 2 } }, \ - { MODKEY, XK_F4, setlayout, { .i = 3 } }, \ - { MODKEY, XK_F5, setlayout, { .i = 4 } }, \ - { MODKEY, XK_F6, setlayout, { .i = 5 } }, \ - { MODKEY, XK_F7, setlayout, { .i = 6 } }, \ - { MODKEY|ControlMask, XK_space, toggleversatile,{ 0 } }, \ - { MODKEY, XK_grave, view, { .i = -1 } }, \ - { MODKEY, XK_1, view, { .i = 0 } }, \ - { MODKEY, XK_2, view, { .i = 1 } }, \ - { MODKEY, XK_3, view, { .i = 2 } }, \ - { MODKEY, XK_4, view, { .i = 3 } }, \ - { MODKEY, XK_5, view, { .i = 4 } }, \ - { MODKEY, XK_6, view, { .i = 5 } }, \ - { MODKEY, XK_7, view, { .i = 6 } }, \ - { MODKEY, XK_8, view, { .i = 7 } }, \ - { MODKEY, XK_9, view, { .i = 8 } }, \ - { MODKEY, XK_0, view, { .i = 9 } }, \ - { MODKEY, XK_minus, next_view, { .i = -1 } }, \ - { MODKEY, XK_equal, next_view, { .i = 1 } }, \ - { MODKEY, XK_BackSpace, last_view, { 0 } }, \ - { MODKEY|ControlMask, XK_1, toggleview, { .i = 0 } }, \ - { MODKEY|ControlMask, XK_2, toggleview, { .i = 1 } }, \ - { MODKEY|ControlMask, XK_3, toggleview, { .i = 2 } }, \ - { MODKEY|ControlMask, XK_4, toggleview, { .i = 3 } }, \ - { MODKEY|ControlMask, XK_5, toggleview, { .i = 4 } }, \ - { MODKEY|ControlMask, XK_6, toggleview, { .i = 5 } }, \ - { MODKEY|ControlMask, XK_7, toggleview, { .i = 6 } }, \ - { MODKEY|ControlMask, XK_8, toggleview, { .i = 7 } }, \ - { MODKEY|ControlMask, XK_9, toggleview, { .i = 8 } }, \ - { MODKEY|ControlMask, XK_0, toggleview, { .i = 9 } }, \ - { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ + { MODKEY, XK_Escape, setkeymode, { .i = COMMANDMODE } }, \ { MODKEY, XK_h, moveresize, "-25x 0y 0w 0h" }, \ { MODKEY, XK_l, moveresize, "25x 0y 0w 0h" }, \ { MODKEY, XK_j, moveresize, "0x 25y 0w 0h" }, \ @@ -134,3 +70,87 @@ }; #define MAX_TASKS 13 /* max number of apps in taskbar */ + +#define CMDKEYS \ +static Key cmdkeys[] = { \ + /* modifier keys function argument */ \ + { 0, XK_Escape, clearcmd, { 0 } }, \ + { ControlMask, XK_c, clearcmd, { 0 } }, \ + { MODKEY|ShiftMask, XK_x, killclient, { 0 } }, \ + { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ + { 0, XK_i, setkeymode, { .i = INSERTMODE } }, \ + { 0, XK_o, spawn, { .cmd = "/home/paulo/bin/myterm.sh" } }, \ + { ShiftMask, XK_o, spawn_insert, { .cmd = "/home/paulo/bin/myterm.sh" } }, \ + { 0, XK_backslash, spawn, { .cmd = "/home/paulo/bin/myterm.sh -e /home/paulo/bin/viclip.sh" } }, \ + { ShiftMask, XK_backslash, spawn_insert, { .cmd = "/home/paulo/bin/myterm.sh -e /home/paulo/bin/viclip.sh" } }, \ + { 0, XK_n, pushdown, { 0 } }, \ + { ShiftMask, XK_n, pushup, { 0 } }, \ + { 0, XK_j, focusnext, { 0 } }, \ + { 0, XK_k, focusprev, { 0 } }, \ + { 0, XK_Return, zoom, { 0 } }, \ + { ShiftMask, XK_Return, zoom_insert, { 0 } }, \ + { 0, XK_m, resizemaster, { .i = 15 } }, \ + { ShiftMask, XK_m, resizemaster, { .i = -15 } }, \ + { 0, XK_d, incnmaster, { .i = 1 } }, \ + { ShiftMask, XK_d, incnmaster, { .i = -1 } }, \ + { 0, XK_v, next_view, { .i = 1 } }, \ + { ShiftMask, XK_v, next_view, { .i = -1 } }, \ + { 0, XK_BackSpace, last_view, { 0 } }, \ + { 0, XK_l, setlayout, { .i = -1 } }, \ + { ShiftMask, XK_l, setlayout, { .i = -2 } }, \ +}; + +#define COMMANDS \ +static Command commands[] = { \ + /* modifier (4 keys) keysyms (4 keys) function argument */ \ + { {0, 0, 0, 0}, {XK_grave, XK_v, 0, 0}, view, { .i = -1 } }, \ + { {0, 0, 0, 0}, {XK_1, XK_v, 0, 0}, view, { .i = 0 } }, \ + { {0, 0, 0, 0}, {XK_2, XK_v, 0, 0}, view, { .i = 1 } }, \ + { {0, 0, 0, 0}, {XK_3, XK_v, 0, 0}, view, { .i = 2 } }, \ + { {0, 0, 0, 0}, {XK_4, XK_v, 0, 0}, view, { .i = 3 } }, \ + { {0, 0, 0, 0}, {XK_5, XK_v, 0, 0}, view, { .i = 4 } }, \ + { {0, 0, 0, 0}, {XK_6, XK_v, 0, 0}, view, { .i = 5 } }, \ + { {0, 0, 0, 0}, {XK_7, XK_v, 0, 0}, view, { .i = 6 } }, \ + { {0, 0, 0, 0}, {XK_8, XK_v, 0, 0}, view, { .i = 7 } }, \ + { {0, 0, 0, 0}, {XK_9, XK_v, 0, 0}, view, { .i = 8 } }, \ + { {0, 0, 0, 0}, {XK_0, XK_v, 0, 0}, view, { .i = 9 } }, \ + { {0, ShiftMask, 0, 0}, {XK_grave, XK_v, 0, 0}, toggleversatile, { 0 } }, \ + { {0, ShiftMask, 0, 0}, {XK_1, XK_v, 0, 0}, toggleview, { .i = 0 } }, \ + { {0, ShiftMask, 0, 0}, {XK_2, XK_v, 0, 0}, toggleview, { .i = 1 } }, \ + { {0, ShiftMask, 0, 0}, {XK_3, XK_v, 0, 0}, toggleview, { .i = 2 } }, \ + { {0, ShiftMask, 0, 0}, {XK_4, XK_v, 0, 0}, toggleview, { .i = 3 } }, \ + { {0, ShiftMask, 0, 0}, {XK_5, XK_v, 0, 0}, toggleview, { .i = 4 } }, \ + { {0, ShiftMask, 0, 0}, {XK_6, XK_v, 0, 0}, toggleview, { .i = 5 } }, \ + { {0, ShiftMask, 0, 0}, {XK_7, XK_v, 0, 0}, toggleview, { .i = 6 } }, \ + { {0, ShiftMask, 0, 0}, {XK_8, XK_v, 0, 0}, toggleview, { .i = 7 } }, \ + { {0, ShiftMask, 0, 0}, {XK_9, XK_v, 0, 0}, toggleview, { .i = 8 } }, \ + { {0, ShiftMask, 0, 0}, {XK_0, XK_v, 0, 0}, toggleview, { .i = 9 } }, \ + { {0, 0, 0, 0}, {XK_1, XK_l, 0, 0}, setlayout, { .i = 0 } }, \ + { {0, 0, 0, 0}, {XK_2, XK_l, 0, 0}, setlayout, { .i = 1 } }, \ + { {0, 0, 0, 0}, {XK_3, XK_l, 0, 0}, setlayout, { .i = 2 } }, \ + { {0, 0, 0, 0}, {XK_4, XK_l, 0, 0}, setlayout, { .i = 3 } }, \ + { {0, 0, 0, 0}, {XK_5, XK_l, 0, 0}, setlayout, { .i = 4 } }, \ + { {0, 0, 0, 0}, {XK_6, XK_l, 0, 0}, setlayout, { .i = 5 } }, \ + { {0, 0, 0, 0}, {XK_7, XK_l, 0, 0}, setlayout, { .i = 6 } }, \ + { {0, 0, 0, 0}, {XK_grave, XK_t, 0, 0}, tag, { .i = -1 } }, \ + { {0, 0, 0, 0}, {XK_1, XK_t, 0, 0}, tag, { .i = 0 } }, \ + { {0, 0, 0, 0}, {XK_2, XK_t, 0, 0}, tag, { .i = 1 } }, \ + { {0, 0, 0, 0}, {XK_3, XK_t, 0, 0}, tag, { .i = 2 } }, \ + { {0, 0, 0, 0}, {XK_4, XK_t, 0, 0}, tag, { .i = 3 } }, \ + { {0, 0, 0, 0}, {XK_5, XK_t, 0, 0}, tag, { .i = 4 } }, \ + { {0, 0, 0, 0}, {XK_6, XK_t, 0, 0}, tag, { .i = 5 } }, \ + { {0, 0, 0, 0}, {XK_7, XK_t, 0, 0}, tag, { .i = 6 } }, \ + { {0, 0, 0, 0}, {XK_8, XK_t, 0, 0}, tag, { .i = 7 } }, \ + { {0, 0, 0, 0}, {XK_9, XK_t, 0, 0}, tag, { .i = 8 } }, \ + { {0, 0, 0, 0}, {XK_0, XK_t, 0, 0}, tag, { .i = 9 } }, \ + { {0, ShiftMask, 0, 0}, {XK_1, XK_t, 0, 0}, toggletag, { .i = 0 } }, \ + { {0, ShiftMask, 0, 0}, {XK_2, XK_t, 0, 0}, toggletag, { .i = 1 } }, \ + { {0, ShiftMask, 0, 0}, {XK_3, XK_t, 0, 0}, toggletag, { .i = 2 } }, \ + { {0, ShiftMask, 0, 0}, {XK_4, XK_t, 0, 0}, toggletag, { .i = 3 } }, \ + { {0, ShiftMask, 0, 0}, {XK_5, XK_t, 0, 0}, toggletag, { .i = 4 } }, \ + { {0, ShiftMask, 0, 0}, {XK_6, XK_t, 0, 0}, toggletag, { .i = 5 } }, \ + { {0, ShiftMask, 0, 0}, {XK_7, XK_t, 0, 0}, toggletag, { .i = 6 } }, \ + { {0, ShiftMask, 0, 0}, {XK_8, XK_t, 0, 0}, toggletag, { .i = 7 } }, \ + { {0, ShiftMask, 0, 0}, {XK_9, XK_t, 0, 0}, toggletag, { .i = 8 } }, \ + { {0, ShiftMask, 0, 0}, {XK_0, XK_t, 0, 0}, toggletag, { .i = 9 } }, \ +}; diff -r e060ab82b136 -r 0968b3739b8d draw.c --- a/draw.c Wed Jan 27 23:28:29 2010 -0800 +++ b/draw.c Sun Jun 12 14:32:54 2011 -0700 @@ -71,13 +71,21 @@ dc.w = blw; drawtext(lt->symbol, dc.norm); x = dc.x + dc.w; - dc.w = textw(stext); + + char *_stext = stext; + if (getkeymode() == COMMANDMODE) { + strcpy(cmtext, "-- CMD -- "); + strncat(cmtext, stext, sizeof cmtext - 1 - strlen(cmtext)); + _stext = cmtext; + } + dc.w = textw(_stext); dc.x = sw - dc.w; if(dc.x < x) { dc.x = x; dc.w = sw - x; } - drawtext(stext, dc.norm); + drawtext(_stext, dc.norm); + if((dc.w = dc.x - x) > bh) { dc.x = x; drawtext(sel ? sel->name : NULL, sel ? dc.sel : dc.norm); diff -r e060ab82b136 -r 0968b3739b8d dwm.h --- a/dwm.h Wed Jan 27 23:28:29 2010 -0800 +++ b/dwm.h Sun Jun 12 14:32:54 2011 -0700 @@ -33,6 +33,8 @@ #include "config.h" #include +#define LENGTH(X) (sizeof X / sizeof X[0]) + /* mask shorthands, used in event.c and client.c */ #define BUTTONMASK (ButtonPressMask | ButtonReleaseMask) @@ -87,6 +89,7 @@ extern const char *tags[]; /* all tags */ extern char stext[256]; /* status text */ +extern char cmtext[256]; /* command mode text */ extern int screen, sx, sy, sw, sh; /* screen geometry */ extern int wax, way, wah, waw; /* windowarea geometry */ extern unsigned int bh, blw; /* bar height, bar layout label width */ @@ -114,6 +117,7 @@ extern void updatetitle(Client *c); /* update the name of c */ extern void unmanage(Client *c); /* destroy c */ extern void zoom(Arg *arg); /* zooms the focused client to master area, arg is ignored */ +extern void zoom_insert(Arg *arg); /* zoom, then go into insert mode */ extern void pushup(Arg *arg); extern void pushdown(Arg *arg); extern void moveresize(Arg *arg); @@ -126,6 +130,10 @@ /* event.c */ extern void grabkeys(void); /* grab all keys defined in config.h */ +extern void clearcmd(Arg *arg); +extern void setkeymode(Arg *arg); +extern unsigned int getkeymode(void); +extern void func_insert(void (*argfunc)(Arg *), Arg *arg); /* layout.c */ extern void focusnext(Arg *arg); /* focuses next visible client, arg is ignored */ @@ -158,4 +166,4 @@ extern void *emallocz(unsigned int size); /* allocates zero-initialized memory, exits on error */ extern void eprint(const char *errstr, ...); /* prints errstr and exits with 1 */ extern void spawn(Arg *arg); /* forks a new subprocess with arg's cmd */ - +extern void spawn_insert(Arg *arg); /* spawn, then go into insert mode */ diff -r e060ab82b136 -r 0968b3739b8d event.c --- a/event.c Wed Jan 27 23:28:29 2010 -0800 +++ b/event.c Sun Jun 12 14:32:54 2011 -0700 @@ -2,12 +2,15 @@ * See LICENSE file for license details. */ #include "dwm.h" -#include #include #include /* static */ +static unsigned int cmdmod[4]; +static unsigned int keymode = COMMANDMODE; +static KeySym cmdkeysym[4]; + typedef struct { unsigned long mod; KeySym keysym; @@ -287,7 +290,7 @@ } static void -keypress(XEvent *e) { +defkeypress(XEvent *e) { static unsigned int len = sizeof key / sizeof key[0]; unsigned int i; KeySym keysym; @@ -372,6 +375,75 @@ unmanage(c); } +typedef struct { + unsigned int mod[4]; + KeySym keysym[4]; + void (*func)(Arg *arg); + Arg arg; +} Command; + +CMDKEYS +COMMANDS + +void +keypress(XEvent *e) { + unsigned int i, j; + Arg a = {0}; + Bool ismatch = False, maybematch = False; + KeySym keysym; + XKeyEvent *ev; + + if(keymode == INSERTMODE) + defkeypress(e); + else if(keymode == COMMANDMODE) { + ev = &e->xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + if(keysym < XK_Shift_L || keysym > XK_Hyper_R) { + for(j = 0; j < LENGTH(cmdkeysym); j++) + if(cmdkeysym[j] == 0) { + cmdkeysym[j] = keysym; + cmdmod[j] = ev->state; + break; + } + for(i = 0; i < LENGTH(commands); i++) { + for(j = 0; j < LENGTH(cmdkeysym); j++) { + if(cmdkeysym[j] == commands[i].keysym[j] + && CLEANMASK(cmdmod[j]) == CLEANMASK(commands[i].mod[j])) + ismatch = True; + else if(cmdkeysym[j] == 0 + && cmdmod[j] == 0) { + ismatch = False; + maybematch = True; + break; + } else { + ismatch = False; + break; + } + } + if(ismatch) { + if(commands[i].func) + commands[i].func(&(commands[i].arg)); + clearcmd(&a); + break; + } + + } + if(!maybematch) + clearcmd(&a); + if(!ismatch) { + for(i = 0; i < LENGTH(cmdkeys); i++) + if(keysym == cmdkeys[i].keysym + && CLEANMASK(cmdkeys[i].mod) == CLEANMASK(ev->state) + && cmdkeys[i].func) { + cmdkeys[i].func(&(cmdkeys[i].arg)); + ismatch = True; + break; + } + } + } + } +} + /* extern */ void (*handler[LASTEvent]) (XEvent *) = { @@ -389,7 +461,7 @@ }; void -grabkeys(void) { +grabdefkeys(void) { static unsigned int len = sizeof key / sizeof key[0]; unsigned int i; KeyCode code; @@ -407,3 +479,50 @@ GrabModeAsync, GrabModeAsync); } } + +void +clearcmd(Arg *arg) { + unsigned int i; + + for(i = 0; i < LENGTH(cmdkeysym); i++) { + cmdkeysym[i] = 0; + cmdmod[i] = 0; + } +} + +void +grabkeys(void) { + if(keymode == INSERTMODE) { + XUngrabKeyboard(dpy, CurrentTime); + grabdefkeys(); + } else if(keymode == COMMANDMODE) { + XUngrabKey(dpy, AnyKey, AnyModifier, root); + //XGrabKey(dpy, AnyKey, AnyModifier, root, + // True, GrabModeAsync, GrabModeAsync); + XGrabKeyboard(dpy, root, True, GrabModeAsync, GrabModeAsync, CurrentTime); + } +} + +void +setkeymode(Arg *arg) { + Arg a = {0}; + + if(!arg) + return; + keymode = arg->i; + clearcmd(&a); + grabkeys(); + drawstatus(); +} + +unsigned int +getkeymode(void) { + return keymode; +} + +void +func_insert(void (*argfunc)(Arg *), Arg *arg) { + Arg a = { .i = INSERTMODE }; + argfunc(arg); + setkeymode(&a); +} diff -r e060ab82b136 -r 0968b3739b8d main.c --- a/main.c Wed Jan 27 23:28:29 2010 -0800 +++ b/main.c Sun Jun 12 14:32:54 2011 -0700 @@ -18,6 +18,7 @@ /* extern */ char stext[256]; +char cmtext[256]; int screen, sx, sy, sw, sh, wax, way, waw, wah; unsigned int bh, ntags, numlockmask; Atom wmatom[WMLast], netatom[NetLast]; diff -r e060ab82b136 -r 0968b3739b8d util.c --- a/util.c Wed Jan 27 23:28:29 2010 -0800 +++ b/util.c Sun Jun 12 14:32:54 2011 -0700 @@ -52,3 +52,8 @@ } wait(0); } + +void +spawn_insert(Arg *arg) { + func_insert(spawn, arg); +}