sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | 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;