thingmenu

A simple graphical menu launcher for X11.
git clone git://r-36.net/thingmenu
Log | Files | Refs | LICENSE

commit 17f3dbe69cd92eef39836ced8ba24e3035aee89f
parent f3edf619a8441c5ebc5ea4b209770bf30788c137
Author: Christoph Lohmann <20h@r-36.net>
Date:   Wed, 28 Dec 2022 22:23:39 +0100

Add numpad shortcuts.

Diffstat:
Mconfig.mk | 2+-
Mthingmenu.1 | 8++++++--
Mthingmenu.c | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
3 files changed, 86 insertions(+), 9 deletions(-)

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} 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. . 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())