diff -up dmenu/config.def.h dmenu-noinput/config.def.h --- dmenu/config.def.h 2024-03-03 12:59:00.545293913 -0600 +++ dmenu-noinput/config.def.h 2024-03-03 10:00:59.974900500 -0600 @@ -2,6 +2,7 @@ /* Default settings; can be overriden by command line. */ static int topbar = 1; /* -b option; if 0, dmenu appears at bottom */ +static int draw_input = 1; /* -noi option; if 0, the input will not be drawn by default */ /* -fn option overrides fonts[0]; default X11 font or font set */ static const char *fonts[] = { "monospace:size=10" diff -up dmenu/dmenu.c dmenu-noinput/dmenu.c --- dmenu/dmenu.c 2024-03-03 12:59:00.545293913 -0600 +++ dmenu-noinput/dmenu.c 2024-03-03 12:15:44.416277776 -0600 @@ -147,7 +147,7 @@ drawmenu(void) { unsigned int curpos; struct item *item; - int x = 0, y = 0, w; + int x = 0, y = 0, w = 0; drw_setscheme(drw, scheme[SchemeNorm]); drw_rect(drw, 0, 0, mw, mh, 1, 1); @@ -156,15 +156,17 @@ drawmenu(void) drw_setscheme(drw, scheme[SchemeSel]); x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0); } - /* draw input field */ - w = (lines > 0 || !matches) ? mw - x : inputw; - drw_setscheme(drw, scheme[SchemeNorm]); - drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); - curpos = TEXTW(text) - TEXTW(&text[cursor]); - if ((curpos += lrpad / 2 - 1) < w) { + if (draw_input) { + w = (lines > 0 || !matches) ? mw - x : inputw; drw_setscheme(drw, scheme[SchemeNorm]); - drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); + drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); + + curpos = TEXTW(text) - TEXTW(&text[cursor]); + if ((curpos += lrpad / 2 - 1) < w) { + drw_setscheme(drw, scheme[SchemeNorm]); + drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0); + } } if (lines > 0) { @@ -178,8 +180,8 @@ drawmenu(void) if (curr->left) { drw_setscheme(drw, scheme[SchemeNorm]); drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0); + x += w; } - x += w; for (item = curr; item != next; item = item->right) x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">"))); if (next) { @@ -358,16 +360,19 @@ keypress(XKeyEvent *ev) case XK_p: ksym = XK_Up; break; case XK_k: /* delete right */ - text[cursor] = '\0'; - match(); + if (draw_input) { + text[cursor] = '\0'; + match(); + } break; case XK_u: /* delete left */ - insert(NULL, 0 - cursor); + if (draw_input) + insert(NULL, 0 - cursor); break; case XK_w: /* delete word */ - while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)])) + while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]) && draw_input) insert(NULL, nextrune(-1) - cursor); - while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)])) + while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]) && draw_input) insert(NULL, nextrune(-1) - cursor); break; case XK_y: /* paste selection */ @@ -414,23 +419,23 @@ keypress(XKeyEvent *ev) switch(ksym) { default: insert: - if (!iscntrl((unsigned char)*buf)) + if (!iscntrl((unsigned char)*buf) && draw_input) insert(buf, len); break; case XK_Delete: case XK_KP_Delete: - if (text[cursor] == '\0') + if (text[cursor] == '\0' || !draw_input) return; cursor = nextrune(+1); /* fallthrough */ case XK_BackSpace: - if (cursor == 0) + if (cursor == 0 || !draw_input) return; insert(NULL, nextrune(-1) - cursor); break; case XK_End: case XK_KP_End: - if (text[cursor] != '\0') { + if (text[cursor] != '\0' && draw_input) { cursor = strlen(text); break; } @@ -514,7 +519,7 @@ insert: } break; case XK_Tab: - if (!sel) + if (!sel || !draw_input) return; cursor = strnlen(sel->text, sizeof text - 1); memcpy(text, sel->text, cursor); @@ -677,7 +682,7 @@ setup(void) mw = wa.width; } promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0; - inputw = mw / 3; /* input width: ~33% of monitor width */ + inputw = !draw_input ? 0 : mw / 3; /* input width: ~33% of monitor width */ match(); /* create menu window */ @@ -715,7 +720,7 @@ setup(void) static void usage(void) { - die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + die("usage: dmenu [-bfiv] [-noi] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]"); } @@ -734,6 +739,8 @@ main(int argc, char *argv[]) topbar = 0; else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */ fast = 1; + else if (!strcmp(argv[i], "-noi")) /* no input field. intended to be used with a prompt */ + draw_input = 0; else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ fstrncmp = strncasecmp; fstrstr = cistrstr;