--- src/dmenu/dmenu.c	2010-08-14 01:41:23.361910238 -0700
+++ tab_to_select/dmenu.c	2010-08-14 01:33:04.218625197 -0700
@@ -173,6 +173,7 @@ keypress(XKeyEvent *ev) {
 	char buf[32];
 	size_t len;
 	KeySym ksym;
+	Bool newselection = False;
 
 	len = strlen(text);
 	XLookupString(ev, buf, sizeof buf, &ksym, NULL);
@@ -274,7 +275,8 @@ keypress(XKeyEvent *ev) {
 		else if(lines > 0)
 			return;
 	case XK_Up:
-		if(sel && sel->left && (sel = sel->left)->right == curr) {
+	case XK_ISO_Left_Tab:
+		if(sel && sel->left && (newselection = True) && (sel = sel->left)->right == curr) {
 			curr = prev;
 			calcoffsets();
 		}
@@ -303,19 +305,21 @@ keypress(XKeyEvent *ev) {
 		}
 		else if(lines > 0)
 			return;
+	case XK_Tab:
 	case XK_Down:
-		if(sel && sel->right && (sel = sel->right) == next) {
+		if(sel && sel->right && (newselection = True) && (sel = sel->right) == next) {
 			curr = next;
 			calcoffsets();
 		}
+                else if(!sel) {
+                    newselection = True;
+                    sel = matches;
+                }
 		break;
-	case XK_Tab:
-		if(!sel)
-			return;
+	}
+	if(newselection && sel) {
 		strncpy(text, sel->text, sizeof text);
-		cursor = strlen(text);
-		match();
-		break;
+		cursor = strlen(sel->text);
 	}
 	drawmenu();
 }
@@ -356,7 +360,8 @@ match(void) {
 		else
 			matches = lsubstr;
 	}
-	curr = prev = next = sel = matches;
+	curr = prev = next = matches;
+	sel = NULL;
 	calcoffsets();
 }
 
