dmenu-prefixcompletion-flag-4.9.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dmenu-prefixcompletion-flag-4.9.diff (3607B)
---
1 diff --git i/config.def.h w/config.def.h
2 index 1edb647..5d312d2 100644
3 --- i/config.def.h
4 +++ w/config.def.h
5 @@ -21,3 +21,8 @@ static unsigned int lines = 0;
6 * for example: " /?\"&[]"
7 */
8 static const char worddelimiters[] = " ";
9 +
10 +/*
11 + * Use prefix matching by default; can be inverted with the -x flag.
12 + */
13 +static int use_prefix = 1;
14 diff --git i/dmenu.1 w/dmenu.1
15 index 323f93c..429fdfa 100644
16 --- i/dmenu.1
17 +++ w/dmenu.1
18 @@ -3,7 +3,7 @@
19 dmenu \- dynamic menu
20 .SH SYNOPSIS
21 .B dmenu
22 -.RB [ \-bfiv ]
23 +.RB [ \-bfivx ]
24 .RB [ \-l
25 .IR lines ]
26 .RB [ \-m
27 @@ -78,6 +78,9 @@ defines the selected foreground color.
28 .B \-v
29 prints version information to stdout, then exits.
30 .TP
31 +.B \-x
32 +Invert prefix matching setting.
33 +.TP
34 .BI \-w " windowid"
35 embed into windowid.
36 .SH USAGE
37 diff --git i/dmenu.c w/dmenu.c
38 index 6b8f51b..3cef454 100644
39 --- i/dmenu.c
40 +++ w/dmenu.c
41 @@ -228,8 +228,13 @@ match(void)
42 die("cannot realloc %u bytes:", tokn * sizeof *tokv);
43 len = tokc ? strlen(tokv[0]) : 0;
44
45 - matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
46 - textsize = strlen(text) + 1;
47 + if (use_prefix) {
48 + matches = lprefix = matchend = prefixend = NULL;
49 + textsize = strlen(text);
50 + } else {
51 + matches = lprefix = lsubstr = matchend = prefixend = substrend = NULL;
52 + textsize = strlen(text) + 1;
53 + }
54 for (item = items; item && item->text; item++) {
55 for (i = 0; i < tokc; i++)
56 if (!fstrstr(item->text, tokv[i]))
57 @@ -241,7 +246,7 @@ match(void)
58 appenditem(item, &matches, &matchend);
59 else if (!fstrncmp(tokv[0], item->text, len))
60 appenditem(item, &lprefix, &prefixend);
61 - else
62 + else if (!use_prefix)
63 appenditem(item, &lsubstr, &substrend);
64 }
65 if (lprefix) {
66 @@ -252,7 +257,7 @@ match(void)
67 matches = lprefix;
68 matchend = prefixend;
69 }
70 - if (lsubstr) {
71 + if (!use_prefix && lsubstr) {
72 if (matches) {
73 matchend->right = lsubstr;
74 lsubstr->left = matchend;
75 @@ -260,6 +265,7 @@ match(void)
76 matches = lsubstr;
77 matchend = substrend;
78 }
79 +
80 curr = sel = matches;
81 calcoffsets();
82 }
83 @@ -309,6 +315,7 @@ keypress(XKeyEvent *ev)
84 {
85 char buf[32];
86 int len;
87 + struct item * item;
88 KeySym ksym;
89 Status status;
90
91 @@ -487,12 +494,17 @@ insert:
92 }
93 break;
94 case XK_Tab:
95 - if (!sel)
96 - return;
97 - strncpy(text, sel->text, sizeof text - 1);
98 + if (!matches) break; /* cannot complete no matches */
99 + strncpy(text, matches->text, sizeof text - 1);
100 text[sizeof text - 1] = '\0';
101 - cursor = strlen(text);
102 - match();
103 + len = cursor = strlen(text); /* length of longest common prefix */
104 + for (item = matches; item && item->text; item = item->right) {
105 + cursor = 0;
106 + while (cursor < len && text[cursor] == item->text[cursor])
107 + cursor++;
108 + len = cursor;
109 + }
110 + memset(text + len, '\0', strlen(text) - len);
111 break;
112 }
113
114 @@ -682,7 +694,7 @@ setup(void)
115 static void
116 usage(void)
117 {
118 - fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
119 + fputs("usage: dmenu [-bfivx] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
120 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
121 exit(1);
122 }
123 @@ -705,7 +717,9 @@ main(int argc, char *argv[])
124 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
125 fstrncmp = strncasecmp;
126 fstrstr = cistrstr;
127 - } else if (i + 1 == argc)
128 + } else if (!strcmp(argv[i], "-x")) /* invert use_prefix */
129 + use_prefix = !use_prefix;
130 + else if (i + 1 == argc)
131 usage();
132 /* these options take one argument */
133 else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */