--- 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(); }