dmenu-prefixcompletion-4.7.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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 *tokv);
           16          len = tokc ? strlen(tokv[0]) : 0;
           17  
           18 -        matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
           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 common prefix */
           70 +                for (item = matches; item && item->text; item = item->right) {
           71 +                        cursor = 0;
           72 +                        while (cursor < len && text[cursor] == item->text[cursor])
           73 +                                cursor++;
           74 +                        len = cursor;
           75 +                }
           76 +                memset(text + len, '\0', strlen(text) - len);
           77                  break;
           78          }
           79          drawmenu();