sites

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

dmenu-nosort-5.0.diff (2749B)


      1 From 7fbf9575aff62301e17b7f0601080633ae2a8a34 Mon Sep 17 00:00:00 2001
      2 From: Matt Briancon <matt.briancon@gmail.com>
      3 Date: Fri, 25 Sep 2020 22:13:38 -0400
      4 Subject: [PATCH] -S: do not sort matches
      5 
      6 ---
      7  dmenu.1 |  3 +++
      8  dmenu.c | 23 ++++++++++++++++-------
      9  2 files changed, 19 insertions(+), 7 deletions(-)
     10 
     11 diff --git a/dmenu.1 b/dmenu.1
     12 index 323f93c..b6af611 100644
     13 --- a/dmenu.1
     14 +++ b/dmenu.1
     15 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
     16  .B \-i
     17  dmenu matches menu items case insensitively.
     18  .TP
     19 +.B \-S
     20 +dmenu does not sort menu items after matching.
     21 +.TP
     22  .BI \-l " lines"
     23  dmenu lists items vertically, with the given number of lines.
     24  .TP
     25 diff --git a/dmenu.c b/dmenu.c
     26 index 65f25ce..efe968c 100644
     27 --- a/dmenu.c
     28 +++ b/dmenu.c
     29 @@ -1,6 +1,7 @@
     30  /* See LICENSE file for copyright and license details. */
     31  #include <ctype.h>
     32  #include <locale.h>
     33 +#include <stdbool.h>
     34  #include <stdio.h>
     35  #include <stdlib.h>
     36  #include <string.h>
     37 @@ -44,6 +45,7 @@ static struct item *items = NULL;
     38  static struct item *matches, *matchend;
     39  static struct item *prev, *curr, *next, *sel;
     40  static int mon = -1, screen;
     41 +static bool sortmatches = true;
     42 
     43  static Atom clip, utf8;
     44  static Display *dpy;
     45 @@ -236,13 +238,18 @@ match(void)
     46  				break;
     47  		if (i != tokc) /* not all tokens match */
     48  			continue;
     49 -		/* exact matches go first, then prefixes, then substrings */
     50 -		if (!tokc || !fstrncmp(text, item->text, textsize))
     51 +
     52 +		if (!sortmatches)
     53  			appenditem(item, &matches, &matchend);
     54 -		else if (!fstrncmp(tokv[0], item->text, len))
     55 -			appenditem(item, &lprefix, &prefixend);
     56 -		else
     57 -			appenditem(item, &lsubstr, &substrend);
     58 +		else {
     59 +			/* exact matches go first, then prefixes, then substrings */
     60 +			if (!tokc || !fstrncmp(text, item->text, textsize))
     61 +				appenditem(item, &matches, &matchend);
     62 +			else if (!fstrncmp(tokv[0], item->text, len))
     63 +				appenditem(item, &lprefix, &prefixend);
     64 +			else
     65 +				appenditem(item, &lsubstr, &substrend);
     66 +		}
     67  	}
     68  	if (lprefix) {
     69  		if (matches) {
     70 @@ -689,7 +696,7 @@ setup(void)
     71  static void
     72  usage(void)
     73  {
     74 -	fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
     75 +	fputs("usage: dmenu [-bfivS] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
     76  	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
     77  	exit(1);
     78  }
     79 @@ -709,6 +716,8 @@ main(int argc, char *argv[])
     80  			topbar = 0;
     81  		else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
     82  			fast = 1;
     83 +		else if (!strcmp(argv[i], "-S"))   /* do not sort matches */
     84 +			sortmatches = false;
     85  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
     86  			fstrncmp = strncasecmp;
     87  			fstrstr = cistrstr;
     88 --
     89 2.25.1
     90