about summary refs log tree commit diff
path: root/dmenu.c
diff options
context:
space:
mode:
authorConnor Lane Smith <cls@lubutu.com>2011-05-14 18:39:27 +0100
committerConnor Lane Smith <cls@lubutu.com>2011-05-14 18:39:27 +0100
commit86468aafe52a94ce6ba1a3601a587c65724a61aa (patch)
tree710bf1aa90ec6919738e1572444d8ef009264c40 /dmenu.c
parentfix typo (diff)
downloaddmenu-86468aafe52a94ce6ba1a3601a587c65724a61aa.tar.gz
dmenu-86468aafe52a94ce6ba1a3601a587c65724a61aa.tar.bz2
dmenu-86468aafe52a94ce6ba1a3601a587c65724a61aa.zip
instant ^E
Diffstat (limited to 'dmenu.c')
-rw-r--r--dmenu.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/dmenu.c b/dmenu.c
index 68fc9ff..b6f1ef2 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -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;
@@ -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);
@@ -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);
@@ -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();