URI: 
       Keyboard navigation - 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 2c8bfd20bd0a5f65d9b513083210049701420ad6
   DIR parent 3cf543dfa6b3f04acdead19043cb862e12ad3396
  HTML Author: Stephen Paul Weber <singpolyma@singpolyma.net>
       Date:   Tue,  1 Nov 2011 13:10:47 -0500
       
       Keyboard navigation
       Diffstat:
         M thingmenu.c                         |      57 +++++++++++++++++++++++++++++--
       
       1 file changed, 54 insertions(+), 3 deletions(-)
       ---
   DIR 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;