URI: 
       changing Key.func into Key.func[NFUNCS], this allows sequences execution of functions per keypress (avoids implementing useless masterfunctions which call atomic ones) - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 19390b1a91da680a502ce5acebd086cfbe32627c
   DIR parent 8dc86051df197792d35521743cc2cb72b60a47ff
  HTML Author: arg@mig29 <unknown>
       Date:   Mon, 27 Nov 2006 13:21:38 +0100
       
       changing Key.func into Key.func[NFUNCS], this allows sequences execution of functions per keypress (avoids implementing useless masterfunctions which call atomic ones)
       Diffstat:
         M config.arg.h                        |      63 ++++++++++++++++---------------
         M config.default.h                    |      69 ++++++++++++++++---------------
         M event.c                             |       9 +++++----
       
       3 files changed, 72 insertions(+), 69 deletions(-)
       ---
   DIR diff --git a/config.arg.h b/config.arg.h
       @@ -17,45 +17,46 @@ const char *tags[] = { "dev", "work", "net", "fnord", NULL };
        #define STATUSBGCOLOR                "#222222"
        #define STATUSFGCOLOR                "#99ccff"
        
       -#define MASTER                        600 /* per thousand */
       +#define MASTER                        600                /* per thousand */
        #define MODKEY                        Mod1Mask
       -#define SNAP                        40 /* pixel */
       +#define NFUNCS                        1                /* number of funcs per key */
       +#define SNAP                        40                /* pixel */
        
        #define KEYS \
        static Key key[] = { \
       -        /* modifier                        key                function        arguments */ \
       -        { MODKEY|ShiftMask,                XK_Return,        spawn, \
       +        /* modifier                        key                functions                arguments */ \
       +        { MODKEY|ShiftMask,                XK_Return,        { spawn }, \
                        { .cmd = "exec urxvtc -tr -bg black -fg '#eeeeee' -cr '#eeeeee' +sb -fn '"FONT"'" } }, \
       -        { MODKEY,                        XK_p,                spawn, \
       +        { MODKEY,                        XK_p,                { spawn }, \
                        { .cmd = "exe=\"$(lsx `echo $PATH | sed 's/:/ /g'` | sort -u " \
                                " | dmenu -font '"FONT"' -normbg '"NORMBGCOLOR"' -normfg '"NORMFGCOLOR"' " \
                                "-selbg '"SELBGCOLOR"' -selfg '"SELFGCOLOR"')\" && exec $exe" } }, \
       -        { MODKEY,                        XK_j,                focusnext,        { 0 } }, \
       -        { MODKEY,                        XK_k,                focusprev,        { 0 } }, \
       -        { MODKEY,                        XK_Return,        zoom,                { 0 } }, \
       -        { MODKEY,                        XK_g,                resizemaster,        { .i = 15 } }, \
       -        { MODKEY,                        XK_s,                resizemaster,        { .i = -15 } }, \
       -        { 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|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|ShiftMask,                XK_c,                killclient,        { 0 } }, \
       -        { MODKEY,                        XK_space,        togglemode,        { 0 } }, \
       -        { MODKEY|ShiftMask,                XK_space,        togglefloat,        { 0 } }, \
       -        { MODKEY,                        XK_0,                viewall,        { 0 } }, \
       -        { 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|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|ShiftMask,                XK_q,                quit,                { 0 } }, \
       +        { MODKEY,                        XK_j,                { focusnext },                { 0 } }, \
       +        { MODKEY,                        XK_k,                { focusprev },                { 0 } }, \
       +        { MODKEY,                        XK_Return,        { zoom },                { 0 } }, \
       +        { MODKEY,                        XK_g,                { resizemaster },        { .i = 15 } }, \
       +        { MODKEY,                        XK_s,                { resizemaster },        { .i = -15 } }, \
       +        { 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|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|ShiftMask,                XK_c,                { killclient },                { 0 } }, \
       +        { MODKEY,                        XK_space,        { togglemode },                { 0 } }, \
       +        { MODKEY|ShiftMask,                XK_space,        { togglefloat },        { 0 } }, \
       +        { MODKEY,                        XK_0,                { viewall },                { 0 } }, \
       +        { 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|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|ShiftMask,                XK_q,                { quit },                { 0 } }, \
        };
        
        #define RULES \
   DIR diff --git a/config.default.h b/config.default.h
       @@ -17,44 +17,45 @@ const char *tags[] = { "1", "2", "3", "4", "5", NULL };
        #define STATUSBGCOLOR                "#dddddd"
        #define STATUSFGCOLOR                "#222222"
        
       -#define MASTER                        600 /* per thousand */
       +#define MASTER                        600                /* per thousand */
        #define MODKEY                        Mod1Mask
       -#define SNAP                        20 /* pixel */
       +#define NFUNCS                        1                /* number of funcs per key */
       +#define SNAP                        20                /* pixel */
        
        #define KEYS \
        static Key key[] = { \
       -        /* modifier                        key                function        arguments */ \
       -        { MODKEY|ShiftMask,                XK_Return,        spawn,                { .cmd = "exec xterm" } }, \
       -        { 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|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|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|ShiftMask,                XK_c,                killclient,        { 0 } }, \
       -        { MODKEY,                        XK_space,        togglemode,        { 0 } }, \
       -        { MODKEY|ShiftMask,                XK_space,        togglefloat,        { 0 } }, \
       -        { MODKEY,                        XK_0,                viewall,        { 0 } }, \
       -        { 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|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|ShiftMask,                XK_q,                quit,                { 0 } }, \
       +        /* modifier                        key                functions                arguments */ \
       +        { MODKEY|ShiftMask,                XK_Return,        { spawn },                { .cmd = "exec xterm" } }, \
       +        { 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|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|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|ShiftMask,                XK_c,                { killclient },                { 0 } }, \
       +        { MODKEY,                        XK_space,        { togglemode },                { 0 } }, \
       +        { MODKEY|ShiftMask,                XK_space,        { togglefloat },        { 0 } }, \
       +        { MODKEY,                        XK_0,                { viewall },                { 0 } }, \
       +        { 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|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|ShiftMask,                XK_q,                { quit },                { 0 } }, \
        };
        
        /* Query class:instance:title for regex matching info with following command:
   DIR diff --git a/event.c b/event.c
       @@ -11,7 +11,7 @@
        typedef struct {
                unsigned long mod;
                KeySym keysym;
       -        void (*func)(Arg *arg);
       +        void (*func[NFUNCS])(Arg *arg);
                Arg arg;
        } Key;
        
       @@ -245,7 +245,7 @@ expose(XEvent *e) {
        static void
        keypress(XEvent *e) {
                static unsigned int len = sizeof key / sizeof key[0];
       -        unsigned int i;
       +        unsigned int i, j;
                KeySym keysym;
                XKeyEvent *ev = &e->xkey;
        
       @@ -254,8 +254,9 @@ keypress(XEvent *e) {
                        if(keysym == key[i].keysym
                                && CLEANMASK(key[i].mod) == CLEANMASK(ev->state))
                        {
       -                        if(key[i].func)
       -                                key[i].func(&key[i].arg);
       +                        for(j = 0; j < NFUNCS; j++)
       +                                if(key[i].func[j])
       +                                        key[i].func[j](&key[i].arg);
                                return;
                        }
                }