tinstant ^E - dmenu - Dmenu fork with xft fonts.
 (HTM) git clone git://r-36.net/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 86468aafe52a94ce6ba1a3601a587c65724a61aa
 (DIR) parent be9afce03548e8110744064d1c9c67795c13cdb6
 (HTM) Author: Connor Lane Smith <cls@lubutu.com>
       Date:   Sat, 14 May 2011 18:39:27 +0100
       
       instant ^E
       Diffstat:
         dmenu.c                             |      36 +++++++++++++++++--------------
       
       1 file changed, 20 insertions(+), 16 deletions(-)
       ---
 (DIR) diff --git a/dmenu.c b/dmenu.c
       t@@ -55,8 +55,8 @@ static Atom utf8;
        static Bool topbar = True;
        static DC *dc;
        static Item *items = NULL;
       -static Item *matches, *sel;
       -static Item *prev, *curr, *next;
       +static Item *matches, *matchend;
       +static Item *prev, *curr, *next, *sel;
        static Window root, win;
        
        static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
       t@@ -308,12 +308,15 @@ keypress(XKeyEvent *ev) {
                                cursor = len;
                                break;
                        }
       -                while(next) {
       -                        sel = curr = next;
       +                if(next) {
       +                        curr = matchend;
                                calcoffsets();
       +                        curr = prev;
       +                        calcoffsets();
       +                        while(next && (curr = curr->right))
       +                                calcoffsets();
                        }
       -                while(sel && sel->right)
       -                        sel = sel->right;
       +                sel = matchend;
                        break;
                case XK_Escape:
                        exit(EXIT_FAILURE);
       t@@ -381,10 +384,10 @@ keypress(XKeyEvent *ev) {
        void
        match(void) {
                size_t len;
       -        Item *item, *itemend, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
       +        Item *item, *lexact, *lprefix, *lsubstr, *exactend, *prefixend, *substrend;
        
                len = strlen(text);
       -        matches = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL;
       +        matches = lexact = lprefix = lsubstr = matchend = exactend = prefixend = substrend = NULL;
                for(item = items; item && item->text; item++)
                        if(!fstrncmp(text, item->text, len + 1))
                                appenditem(item, &lexact, &exactend);
       t@@ -395,24 +398,25 @@ match(void) {
        
                if(lexact) {
                        matches = lexact;
       -                itemend = exactend;
       +                matchend = exactend;
                }
                if(lprefix) {
       -                if(itemend) {
       -                        itemend->right = lprefix;
       -                        lprefix->left = itemend;
       +                if(matchend) {
       +                        matchend->right = lprefix;
       +                        lprefix->left = matchend;
                        }
                        else
                                matches = lprefix;
       -                itemend = prefixend;
       +                matchend = prefixend;
                }
                if(lsubstr) {
       -                if(itemend) {
       -                        itemend->right = lsubstr;
       -                        lsubstr->left = itemend;
       +                if(matchend) {
       +                        matchend->right = lsubstr;
       +                        lsubstr->left = matchend;
                        }
                        else
                                matches = lsubstr;
       +                matchend = substrend;
                }
                curr = sel = matches;
                calcoffsets();