dmenu-noinputlinesbelowpromptfullwidth-5.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dmenu-noinputlinesbelowpromptfullwidth-5.2.diff (5287B)
---
1 diff -up dmenu/config.def.h dmenu-noinputlinesbelowpromptfullwidth/config.def.h
2 --- dmenu/config.def.h 2024-03-03 12:59:00.545293913 -0600
3 +++ dmenu-noinputlinesbelowpromptfullwidth/config.def.h 2024-03-03 12:50:07.883388742 -0600
4 @@ -2,6 +2,7 @@
5 /* Default settings; can be overriden by command line. */
6
7 static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */
8 +static int draw_input = 1; /* -noi option; if 0, the input will not be drawn by default */
9 /* -fn option overrides fonts[0]; default X11 font or font set */
10 static const char *fonts[] = {
11 "monospace:size=10"
12 diff -up dmenu/dmenu.c dmenu-noinputlinesbelowpromptfullwidth/dmenu.c
13 --- dmenu/dmenu.c 2024-03-03 12:59:00.545293913 -0600
14 +++ dmenu-noinputlinesbelowpromptfullwidth/dmenu.c 2024-03-03 15:06:12.469545907 -0600
15 @@ -147,30 +147,32 @@ drawmenu(void)
16 {
17 unsigned int curpos;
18 struct item *item;
19 - int x = 0, y = 0, w;
20 + int x = 0, y = 0, w = 0;
21
22 drw_setscheme(drw, scheme[SchemeNorm]);
23 drw_rect(drw, 0, 0, mw, mh, 1, 1);
24
25 if (prompt && *prompt) {
26 drw_setscheme(drw, scheme[SchemeSel]);
27 - x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0);
28 + x = drw_text(drw, x, 0, !draw_input ? mw : promptw, bh, lrpad / 2, prompt, 0);
29 }
30 - /* draw input field */
31 - w = (lines > 0 || !matches) ? mw - x : inputw;
32 - drw_setscheme(drw, scheme[SchemeNorm]);
33 - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
34
35 - curpos = TEXTW(text) - TEXTW(&text[cursor]);
36 - if ((curpos += lrpad / 2 - 1) < w) {
37 + if (draw_input) {
38 + w = (lines > 0 || !matches) ? mw - x : inputw;
39 drw_setscheme(drw, scheme[SchemeNorm]);
40 - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
41 + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
42 +
43 + curpos = TEXTW(text) - TEXTW(&text[cursor]);
44 + if ((curpos += lrpad / 2 - 1) < w) {
45 + drw_setscheme(drw, scheme[SchemeNorm]);
46 + drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
47 + }
48 }
49
50 if (lines > 0) {
51 /* draw vertical list */
52 for (item = curr; item != next; item = item->right)
53 - drawitem(item, x, y += bh, mw - x);
54 + drawitem(item, (!draw_input && prompt && *prompt) ? x - mw : x - promptw, y += bh, mw);
55 } else if (matches) {
56 /* draw horizontal list */
57 x += inputw;
58 @@ -178,8 +180,8 @@ drawmenu(void)
59 if (curr->left) {
60 drw_setscheme(drw, scheme[SchemeNorm]);
61 drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0);
62 + x += w;
63 }
64 - x += w;
65 for (item = curr; item != next; item = item->right)
66 x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">")));
67 if (next) {
68 @@ -358,16 +360,19 @@ keypress(XKeyEvent *ev)
69 case XK_p: ksym = XK_Up; break;
70
71 case XK_k: /* delete right */
72 - text[cursor] = '\0';
73 - match();
74 + if (draw_input) {
75 + text[cursor] = '\0';
76 + match();
77 + }
78 break;
79 case XK_u: /* delete left */
80 - insert(NULL, 0 - cursor);
81 + if (draw_input)
82 + insert(NULL, 0 - cursor);
83 break;
84 case XK_w: /* delete word */
85 - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
86 + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]) && draw_input)
87 insert(NULL, nextrune(-1) - cursor);
88 - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
89 + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]) && draw_input)
90 insert(NULL, nextrune(-1) - cursor);
91 break;
92 case XK_y: /* paste selection */
93 @@ -414,23 +419,23 @@ keypress(XKeyEvent *ev)
94 switch(ksym) {
95 default:
96 insert:
97 - if (!iscntrl((unsigned char)*buf))
98 + if (!iscntrl((unsigned char)*buf) && draw_input)
99 insert(buf, len);
100 break;
101 case XK_Delete:
102 case XK_KP_Delete:
103 - if (text[cursor] == '\0')
104 + if (text[cursor] == '\0' || !draw_input)
105 return;
106 cursor = nextrune(+1);
107 /* fallthrough */
108 case XK_BackSpace:
109 - if (cursor == 0)
110 + if (cursor == 0 || !draw_input)
111 return;
112 insert(NULL, nextrune(-1) - cursor);
113 break;
114 case XK_End:
115 case XK_KP_End:
116 - if (text[cursor] != '\0') {
117 + if (text[cursor] != '\0' && draw_input) {
118 cursor = strlen(text);
119 break;
120 }
121 @@ -514,7 +519,7 @@ insert:
122 }
123 break;
124 case XK_Tab:
125 - if (!sel)
126 + if (!sel || !draw_input)
127 return;
128 cursor = strnlen(sel->text, sizeof text - 1);
129 memcpy(text, sel->text, cursor);
130 @@ -677,7 +682,7 @@ setup(void)
131 mw = wa.width;
132 }
133 promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
134 - inputw = mw / 3; /* input width: ~33% of monitor width */
135 + inputw = !draw_input ? 0 : mw / 3; /* input width: ~33% of monitor width */
136 match();
137
138 /* create menu window */
139 @@ -715,7 +720,7 @@ setup(void)
140 static void
141 usage(void)
142 {
143 - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
144 + die("usage: dmenu [-bfiv] [-noi] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
145 " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
146 }
147
148 @@ -734,6 +739,8 @@ main(int argc, char *argv[])
149 topbar = 0;
150 else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */
151 fast = 1;
152 + else if (!strcmp(argv[i], "-noi")) /* no input field. intended to be used with a prompt */
153 + draw_input = 0;
154 else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
155 fstrncmp = strncasecmp;
156 fstrstr = cistrstr;