sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

dmenu-instant-5.3.diff (2522B)


      1 From 26b302783a16dc2aa19451d9ba4515c8484f4a05 Mon Sep 17 00:00:00 2001
      2 From: Max Schillinger <maxschillinger@web.de>
      3 Date: Tue, 27 Aug 2024 16:19:41 +0200
      4 Subject: [PATCH] Instant mode
      5 
      6 Add '-n' flag to select the only (remaining) entry automatically.
      7 ---
      8  config.def.h |  1 +
      9  dmenu.1      |  5 ++++-
     10  dmenu.c      | 13 +++++++++++--
     11  3 files changed, 16 insertions(+), 3 deletions(-)
     12 
     13 diff --git a/config.def.h b/config.def.h
     14 index 1edb647..7e6f1ed 100644
     15 --- a/config.def.h
     16 +++ b/config.def.h
     17 @@ -1,6 +1,7 @@
     18  /* See LICENSE file for copyright and license details. */
     19  /* Default settings; can be overriden by command line. */
     20  
     21 +static int instant = 0;                     /* -n  option; if 1, select single entry automatically */
     22  static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
     23  /* -fn option overrides fonts[0]; default X11 font or font set */
     24  static const char *fonts[] = {
     25 diff --git a/dmenu.1 b/dmenu.1
     26 index 323f93c..29bdf7f 100644
     27 --- a/dmenu.1
     28 +++ b/dmenu.1
     29 @@ -3,7 +3,7 @@
     30  dmenu \- dynamic menu
     31  .SH SYNOPSIS
     32  .B dmenu
     33 -.RB [ \-bfiv ]
     34 +.RB [ \-bfinv ]
     35  .RB [ \-l
     36  .IR lines ]
     37  .RB [ \-m
     38 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
     39  .B \-i
     40  dmenu matches menu items case insensitively.
     41  .TP
     42 +.B \-n
     43 +dmenu instantly selects if only one match.
     44 +.TP
     45  .BI \-l " lines"
     46  dmenu lists items vertically, with the given number of lines.
     47  .TP
     48 diff --git a/dmenu.c b/dmenu.c
     49 index 40f93e0..92d5154 100644
     50 --- a/dmenu.c
     51 +++ b/dmenu.c
     52 @@ -277,6 +277,13 @@ match(void)
     53  		matchend = substrend;
     54  	}
     55  	curr = sel = matches;
     56 +
     57 +	if (instant && matches && matches==matchend && !lsubstr) {
     58 +		puts(matches->text);
     59 +		cleanup();
     60 +		exit(0);
     61 +	}
     62 +
     63  	calcoffsets();
     64  }
     65  
     66 @@ -715,7 +722,7 @@ setup(void)
     67  static void
     68  usage(void)
     69  {
     70 -	die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
     71 +	die("usage: dmenu [-bfinv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
     72  	    "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
     73  }
     74  
     75 @@ -737,7 +744,9 @@ main(int argc, char *argv[])
     76  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
     77  			fstrncmp = strncasecmp;
     78  			fstrstr = cistrstr;
     79 -		} else if (i + 1 == argc)
     80 +		} else if (!strcmp(argv[i], "-n")) /* instant select only match */
     81 +			instant = 1;
     82 +		else if (i + 1 == argc)
     83  			usage();
     84  		/* these options take one argument */
     85  		else if (!strcmp(argv[i], "-l"))   /* number of lines in vertical list */
     86 -- 
     87 2.46.0
     88