dmenu-prefixcompletion-4.6.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.6.diff (2428B)
---
1 From 7ef1d5edfd6bd9c932452ac2fb2010c8e0d8c1c7 Mon Sep 17 00:00:00 2001
2 From: Felix Van der Jeugt <felix.vanderjeugt@gmail.com>
3 Date: Wed, 19 Oct 2016 22:18:21 +0200
4 Subject: [PATCH] tabcomplete with longest common prefix
5
6 ---
7 dmenu.c | 30 +++++++++++++-----------------
8 1 file changed, 13 insertions(+), 17 deletions(-)
9
10 diff --git a/dmenu.c b/dmenu.c
11 index 9278e91..40e717c 100644
12 --- a/dmenu.c
13 +++ b/dmenu.c
14 @@ -218,7 +218,7 @@ match(void)
15 char buf[sizeof text], *s;
16 int i, tokc = 0;
17 size_t len, textsize;
18 - struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
19 + struct item *item, *lprefix, *prefixend;
20
21 strcpy(buf, text);
22 /* separate input text into tokens to be matched individually */
23 @@ -227,7 +227,7 @@ match(void)
24 die("cannot realloc %u bytes:", tokn * sizeof *tokv);
25 len = tokc ? strlen(tokv[0]) : 0;
26
27 - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
28 + matches = lprefix = matchend = prefixend = NULL;
29 textsize = strlen(text);
30 for (item = items; item && item->text; item++) {
31 for (i = 0; i < tokc; i++)
32 @@ -240,8 +240,6 @@ match(void)
33 appenditem(item, &matches, &matchend);
34 else if (!fstrncmp(tokv[0], item->text, len))
35 appenditem(item, &lprefix, &prefixend);
36 - else
37 - appenditem(item, &lsubstr, &substrend);
38 }
39 if (lprefix) {
40 if (matches) {
41 @@ -251,14 +249,6 @@ match(void)
42 matches = lprefix;
43 matchend = prefixend;
44 }
45 - if (lsubstr) {
46 - if (matches) {
47 - matchend->right = lsubstr;
48 - lsubstr->left = matchend;
49 - } else
50 - matches = lsubstr;
51 - matchend = substrend;
52 - }
53 curr = sel = matches;
54 calcoffsets();
55 }
56 @@ -292,6 +282,7 @@ keypress(XKeyEvent *ev)
57 {
58 char buf[32];
59 int len;
60 + struct item * item;
61 KeySym ksym = NoSymbol;
62 Status status;
63
64 @@ -447,12 +438,17 @@ keypress(XKeyEvent *ev)
65 }
66 break;
67 case XK_Tab:
68 - if (!sel)
69 - return;
70 - strncpy(text, sel->text, sizeof text - 1);
71 + if (!matches) break; /* cannot complete no matches */
72 + strncpy(text, matches->text, sizeof text - 1);
73 text[sizeof text - 1] = '\0';
74 - cursor = strlen(text);
75 - match();
76 + len = cursor = strlen(text); /* length of longest common prefix */
77 + for (item = matches; item && item->text; item = item->right) {
78 + cursor = 0;
79 + while (cursor < len && text[cursor] == item->text[cursor])
80 + cursor++;
81 + len = cursor;
82 + }
83 + memset(text + len, '\0', strlen(text) - len);
84 break;
85 }
86 drawmenu();
87 --
88 2.10.1
89