diff --git a/dmenu.c b/dmenu.c index 9278e91..a3ba5bf 100644 --- a/dmenu.c +++ b/dmenu.c @@ -218,7 +218,7 @@ match(void) char buf[sizeof text], *s; int i, tokc = 0; size_t len, textsize; - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; + struct item *item, *lprefix, *prefixend; strcpy(buf, text); /* separate input text into tokens to be matched individually */ @@ -227,7 +227,7 @@ match(void) die("cannot realloc %u bytes:", tokn * sizeof *tokv); len = tokc ? strlen(tokv[0]) : 0; - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL; + matches = lprefix = matchend = prefixend = NULL; textsize = strlen(text); for (item = items; item && item->text; item++) { for (i = 0; i < tokc; i++) @@ -240,8 +240,6 @@ match(void) appenditem(item, &matches, &matchend); else if (!fstrncmp(tokv[0], item->text, len)) appenditem(item, &lprefix, &prefixend); - else - appenditem(item, &lsubstr, &substrend); } if (lprefix) { if (matches) { @@ -251,14 +249,6 @@ match(void) matches = lprefix; matchend = prefixend; } - if (lsubstr) { - if (matches) { - matchend->right = lsubstr; - lsubstr->left = matchend; - } else - matches = lsubstr; - matchend = substrend; - } curr = sel = matches; calcoffsets(); } @@ -292,6 +282,7 @@ keypress(XKeyEvent *ev) { char buf[32]; int len; + struct item * item; KeySym ksym = NoSymbol; Status status; @@ -447,12 +438,16 @@ keypress(XKeyEvent *ev) } break; case XK_Tab: - if (!sel) - return; - strncpy(text, sel->text, sizeof text - 1); + strncpy(text, matches->text, sizeof text - 1); text[sizeof text - 1] = '\0'; - cursor = strlen(text); - match(); + cursor = len = strlen(text); + for(item = matches; item && item->text; item = item->right) { + for(cursor = 0; + cursor < len && text[cursor] == item->text[cursor]; + cursor++); + len = cursor; + } + memset(text + cursor, '\0', strlen(text) - cursor); break; } drawmenu();