Commit Diff


commit - aaf0ca63c20c9b2aa596628a0ca82a162eb95e85
commit + b74734beb3bcc4e916680531dcc46a6dfb0da2ea
blob - bed6f3e1da40eaac4a9cf7cb546b847fe2d5f8ca
blob + a686ad70b4b102547f75d9b931a392a4c1ca3172
--- dmenu/dmenu.1
+++ dmenu/dmenu.1
@@ -53,6 +53,9 @@ dmenu will not directly display the keyboard input, bu
 .BI \-d " delimiter"
 when used in a line, the value after the delimiter will be displayed. When selected, the value before the delimiter will be output. Only uses a single char as the delimiter.
 .TP
+.B \-S
+dmenu does not sort menu items after matching.
+.TP
 .BI \-l " lines"
 dmenu lists items vertically, with the given number of lines.
 .TP
blob - c55b1c10e3f2568ab338cb887e353dee1e465a00
blob + 0fc063bc7dbeb142ba339c208cb3695b6a11d796
--- dmenu/dmenu.c
+++ dmenu/dmenu.c
@@ -49,6 +49,7 @@ static struct item *items = NULL;
 static struct item *matches, *matchend;
 static struct item *prev, *curr, *next, *sel;
 static int mon = -1, screen;
+static int sortmatches = 1;
 
 static Atom clip, utf8;
 static Display *dpy;
@@ -408,13 +409,18 @@ match(void)
 				break;
 		if (i != tokc) /* not all tokens match */
 			continue;
-		/* exact matches go first, then prefixes, then substrings */
-		if (!tokc || !fstrncmp(text, item->text, textsize))
+
+		if (!sortmatches)
 			appenditem(item, &matches, &matchend);
-		else if (!fstrncmp(tokv[0], item->text, len))
-			appenditem(item, &lprefix, &prefixend);
-		else
-			appenditem(item, &lsubstr, &substrend);
+		else {
+			/* exact matches go first, then prefixes, then substrings */
+			if (!tokc || !fstrncmp(text, item->text, textsize))
+				appenditem(item, &matches, &matchend);
+			else if (!fstrncmp(tokv[0], item->text, len))
+				appenditem(item, &lprefix, &prefixend);
+			else
+				appenditem(item, &lsubstr, &substrend);
+		}
 	}
 	if (lprefix) {
 		if (matches) {
@@ -878,7 +884,7 @@ setup(void)
 static void
 usage(void)
 {
-	die("usage: dmenu [-bfivP] [-d delim] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+	die("usage: dmenu [-bfivPS] [-d delim] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
 	    "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
 }
 
@@ -897,8 +903,10 @@ 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], "-F"))   /* grabs keyboard before reading stdin */
+		else if (!strcmp(argv[i], "-F"))   /* disable fuzzy matching */
 			fuzzy = 0;
+		else if (!strcmp(argv[i], "-S"))   /* do not sort matches */
+			sortmatches = 0;
 		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
 			fstrncmp = strncasecmp;
 			fstrstr = cistrstr;