| dmenu-prefixcompletion-4.7.diff - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dmenu-prefixcompletion-4.7.diff (2163B) | |
| --- | |
| 1 diff --git a/dmenu.c b/dmenu.c | |
| 2 index d605ab4..826604e 100644 | |
| 3 --- a/dmenu.c | |
| 4 +++ b/dmenu.c | |
| 5 @@ -218,7 +218,7 @@ match(void) | |
| 6 char buf[sizeof text], *s; | |
| 7 int i, tokc = 0; | |
| 8 size_t len, textsize; | |
| 9 - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend; | |
| 10 + struct item *item, *lprefix, *prefixend; | |
| 11 | |
| 12 strcpy(buf, text); | |
| 13 /* separate input text into tokens to be matched individually */ | |
| 14 @@ -227,8 +227,8 @@ match(void) | |
| 15 die("cannot realloc %u bytes:", tokn * sizeof *… | |
| 16 len = tokc ? strlen(tokv[0]) : 0; | |
| 17 | |
| 18 - matches = lprefix = lsubstr = matchend = prefixend = substrend … | |
| 19 - textsize = strlen(text) + 1; | |
| 20 + matches = lprefix = matchend = prefixend = NULL; | |
| 21 + textsize = strlen(text); | |
| 22 for (item = items; item && item->text; item++) { | |
| 23 for (i = 0; i < tokc; i++) | |
| 24 if (!fstrstr(item->text, tokv[i])) | |
| 25 @@ -240,8 +240,6 @@ match(void) | |
| 26 appenditem(item, &matches, &matchend); | |
| 27 else if (!fstrncmp(tokv[0], item->text, len)) | |
| 28 appenditem(item, &lprefix, &prefixend); | |
| 29 - else | |
| 30 - appenditem(item, &lsubstr, &substrend); | |
| 31 } | |
| 32 if (lprefix) { | |
| 33 if (matches) { | |
| 34 @@ -251,14 +249,6 @@ match(void) | |
| 35 matches = lprefix; | |
| 36 matchend = prefixend; | |
| 37 } | |
| 38 - if (lsubstr) { | |
| 39 - if (matches) { | |
| 40 - matchend->right = lsubstr; | |
| 41 - lsubstr->left = matchend; | |
| 42 - } else | |
| 43 - matches = lsubstr; | |
| 44 - matchend = substrend; | |
| 45 - } | |
| 46 curr = sel = matches; | |
| 47 calcoffsets(); | |
| 48 } | |
| 49 @@ -292,6 +282,7 @@ keypress(XKeyEvent *ev) | |
| 50 { | |
| 51 char buf[32]; | |
| 52 int len; | |
| 53 + struct item * item; | |
| 54 KeySym ksym = NoSymbol; | |
| 55 Status status; | |
| 56 | |
| 57 @@ -447,12 +438,17 @@ keypress(XKeyEvent *ev) | |
| 58 } | |
| 59 break; | |
| 60 case XK_Tab: | |
| 61 - if (!sel) | |
| 62 - return; | |
| 63 - strncpy(text, sel->text, sizeof text - 1); | |
| 64 + if (!matches) break; /* cannot complete no matches */ | |
| 65 + strncpy(text, matches->text, sizeof text - 1); | |
| 66 text[sizeof text - 1] = '\0'; | |
| 67 - cursor = strlen(text); | |
| 68 - match(); | |
| 69 + len = cursor = strlen(text); /* length of longest commo… | |
| 70 + for (item = matches; item && item->text; item = item->r… | |
| 71 + cursor = 0; | |
| 72 + while (cursor < len && text[cursor] == item->te… | |
| 73 + cursor++; | |
| 74 + len = cursor; | |
| 75 + } | |
| 76 + memset(text + len, '\0', strlen(text) - len); | |
| 77 break; | |
| 78 } | |
| 79 drawmenu(); |