URI: 
       Add numpad shortcuts. - thingmenu - A simple graphical menu launcher for X11.
  HTML git clone git://bitreich.org/thingmenu
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR LICENSE
       ---
   DIR commit 17f3dbe69cd92eef39836ced8ba24e3035aee89f
   DIR parent f3edf619a8441c5ebc5ea4b209770bf30788c137
  HTML Author: Christoph Lohmann <20h@r-36.net>
       Date:   Wed, 28 Dec 2022 22:23:39 +0100
       
       Add numpad shortcuts.
       
       Diffstat:
         M config.mk                           |       2 +-
         M thingmenu.1                         |       8 ++++++--
         M thingmenu.c                         |      85 ++++++++++++++++++++++++++++---
       
       3 files changed, 86 insertions(+), 9 deletions(-)
       ---
   DIR diff --git a/config.mk b/config.mk
       @@ -16,7 +16,7 @@ INCS = -I. -I/usr/include -I${X11INC}
        LIBS = -L/usr/lib -L${X11LIB} -lc -lX11
        
        # flags
       -CPPFLAGS = -DVERSION=\"${VERSION}\" -D_POSIX_C_SOURCE=200809L
       +CPPFLAGS = -DVERSION=\"${VERSION}\" -D_POSIX_C_SOURCE=200809L -D_GNU_SOURCE
        CFLAGS = -g -std=c99 -pedantic -Wall ${INCS} ${CPPFLAGS}
        LDFLAGS = -g ${LIBS}
        #LDFLAGS = -s ${LIBS}
   DIR diff --git a/thingmenu.1 b/thingmenu.1
       @@ -9,9 +9,10 @@
        .Sh SYNOPSIS
        .Nm
        .Bk -words
       -.Op Fl x
       -.Op Fl s
       +.Op Fl n
        .Op Fl o
       +.Op Fl s
       +.Op Fl x
        .Op Fl g Ar geometry
        .Op Fl w Ar widthscaling
        .Op Fl e Ar heightscaling
       @@ -62,6 +63,9 @@ button is clicked.
        .It Fl o
        Use the horizontal layout.
        .
       +.It Fl n
       +Prepend the numpad keys for shortcuts to the entries.
       +.
        .It Fl g
        Define the X11 geometry string, which is to be used.
        .
   DIR diff --git a/thingmenu.c b/thingmenu.c
       @@ -106,6 +106,7 @@ static char *name = "thingmenu";
        
        Entry **entries = NULL;
        int nentries = 0;
       +int exitentry = -1;
        int oneshot = 1;
        Bool ispressing = 0;
        
       @@ -157,6 +158,57 @@ keyrelease(XEvent *e)
        
                for (i = 0; i < nentries && !entries[i]->highlighted; i++);
        
       +        if (key >= XK_0 && key <= XK_9) {
       +                i = key - XK_0;
       +                key = XK_Return;
       +        } else if (key >= XK_KP_0 && key <= XK_KP_9) {
       +                i = key - XK_KP_0;
       +                key = XK_Return;
       +        }
       +
       +        switch (key) {
       +        case XK_KP_Insert:
       +                i = 0;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_End:
       +                i = 1;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Down:
       +                i = 2;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Page_Down:
       +                i = 3;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Left:
       +                i = 4;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Begin:
       +                i = 5;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Right:
       +                i = 6;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Home:
       +                i = 7;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Up:
       +                i = 8;
       +                key = XK_Return;
       +                break;
       +        case XK_KP_Page_Up:
       +                i = 9;
       +                key = XK_Return;
       +                break;
       +        }
       +
                switch (key) {
                case XK_k:
                        key = XK_Up;
       @@ -183,6 +235,10 @@ keyrelease(XEvent *e)
                        entries[i]->highlighted = True;
                        drawentry(entries[i]);
                        break;
       +        case XK_period:
       +        case XK_KP_Decimal:
       +        case XK_KP_Delete:
       +                i = exitentry;
                case XK_Return:
                case XK_space:
                        if (i < nentries) {
       @@ -614,7 +670,7 @@ updateentries(void)
        void
        usage(void)
        {
       -        fprintf(stderr, "usage: %s [-hxso] [-g geometry] [-w widthscaling] "
       +        fprintf(stderr, "usage: %s [-hnosx] [-g geometry] [-w widthscaling] "
                                "[-e heightscaling] [--] "
                                "label0 cmd0 [label1 cmd1 ...]\n", argv0);
                exit(1);
       @@ -623,7 +679,7 @@ usage(void)
        int
        main(int argc, char *argv[])
        {
       -        Bool addexit;
       +        Bool addexit, usenumpad;
                char *label, *cmd;
                int i, xr, yr, bitm;
                unsigned int wr, hr;
       @@ -631,6 +687,7 @@ main(int argc, char *argv[])
                argv0 = argv[0];
        
                addexit = True;
       +        usenumpad = False;
        
                if (argc < 2)
                        usage();
       @@ -654,6 +711,9 @@ main(int argc, char *argv[])
                case 'e':
                        heightscaling = atof(EARGF(usage()));
                        break;
       +        case 'n':
       +                usenumpad = True;
       +                break;
                case 'o':
                        horizontal = True;
                        break;
       @@ -681,8 +741,15 @@ main(int argc, char *argv[])
                                die("realloc returned NULL");
                        if (!(entries[nentries-1] = calloc(1, sizeof(*entries[0]))))
                                die("calloc returned NULL");
       -                if (!(entries[nentries-1]->label = strdup(label)))
       -                        die("strdup returned NULL\n");
       +                if (usenumpad == True && nentries < 11) {
       +                        if (!(asprintf(&entries[nentries-1]->label,
       +                                        "%d:%s", nentries-1, strdup(label)))) {
       +                                die("asprintf returned NULL\n");
       +                        }
       +                } else {
       +                        if (!(entries[nentries-1]->label = strdup(label)))
       +                                die("strdup returned NULL\n");
       +                }
                        if (!(entries[nentries-1]->cmd = strdup(cmd)))
                                die("strdup returned NULL\n");
                        entries[nentries-1]->forceexit = False;
       @@ -695,11 +762,17 @@ main(int argc, char *argv[])
                                die("realloc returned NULL");
                        if (!(entries[nentries-1] = calloc(1, sizeof(*entries[0]))))
                                die("calloc returned NULL");
       -                if (!(entries[nentries-1]->label = strdup("cancel")))
       -                        die("strdup returned NULL\n");
       +                if (usenumpad == True) {
       +                        if (!(entries[nentries-1]->label = strdup(".:cancel")))
       +                                die("strdup returned NULL\n");
       +                } else {
       +                        if (!(entries[nentries-1]->label = strdup("cancel")))
       +                                die("strdup returned NULL\n");
       +                }
                        if (!(entries[nentries-1]->cmd = strdup("exit")))
                                die("strdup returned NULL\n");
                        entries[nentries-1]->forceexit = True;
       +                exitentry = nentries - 1;
                }
        
                if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())