thingmenu

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

commit 2c8bfd20bd0a5f65d9b513083210049701420ad6
parent 3cf543dfa6b3f04acdead19043cb862e12ad3396
Author: Stephen Paul Weber <singpolyma@singpolyma.net>
Date:   Tue,  1 Nov 2011 13:10:47 -0500

Keyboard navigation
Diffstat:
thingmenu.c | 57++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 54 insertions(+), 3 deletions(-)

diff --git a/thingmenu.c b/thingmenu.c @@ -56,6 +56,7 @@ typedef struct { /* function declarations */ static void motionnotify(XEvent *e); +static void keyrelease(XEvent *e); static void buttonpress(XEvent *e); static void buttonrelease(XEvent *e); static void cleanup(void); @@ -79,6 +80,7 @@ static void updateentries(void); /* variables */ static int screen; static void (*handler[LASTEvent]) (XEvent *) = { + [KeyRelease] = keyrelease, [ButtonPress] = buttonpress, [ButtonRelease] = buttonrelease, [ConfigureNotify] = configurenotify, @@ -140,6 +142,55 @@ motionnotify(XEvent *e) } void +keyrelease(XEvent *e) +{ + int i; + XKeyEvent *xkey = &e->xkey; + KeySym key = XLookupKeysym(xkey, 0); + + /* Find highlighted entry */ + for (i = 0; i < nentries && !entries[i]->highlighted; i++); + + switch (key) { + case XK_k: + key = XK_Up; + case XK_j: + if(key == XK_j) + key = XK_Down; + case XK_Up: + case XK_Down: + if (i < nentries) { + entries[i]->highlighted = False; + drawentry(entries[i]); + } + + if (key == XK_Up) { + i = ((i - 1) + nentries) % nentries; + } else if(key == XK_Down) { + if (i < nentries) { + i = (i + 1) % nentries; + } else { + i = 0; + } + } + + entries[i]->highlighted = True; + drawentry(entries[i]); + break; + case XK_Return: + case XK_space: + if (i < nentries) { + press(entries[i]); + unpress(entries[i]); + } + break; + case XK_Escape: + running = False; + break; + } +} + +void buttonpress(XEvent *e) { XButtonPressedEvent *ev = &e->xbutton; @@ -431,9 +482,9 @@ setup(void) win = XCreateWindow(dpy, root, wx, wy, ww, wh, 0, CopyFromParent, CopyFromParent, CopyFromParent, CWOverrideRedirect | CWBorderPixel | CWBackingPixel, &wa); - XSelectInput(dpy, win, StructureNotifyMask|ButtonReleaseMask| - ButtonPressMask|ExposureMask|LeaveWindowMask| - PointerMotionMask); + XSelectInput(dpy, win, StructureNotifyMask|KeyReleaseMask| + ButtonReleaseMask|ButtonPressMask| + ExposureMask|LeaveWindowMask|PointerMotionMask); sizeh = XAllocSizeHints(); sizeh->flags = PMaxSize | PMinSize;