dmenupatches - commit 68f4a89
feat: patch init68f4a89f7d2cde06b8f76aeb65f36954aa6f2c3aLukeJ<luke.jones.2567@gmail.com>2026-09-28T20:22:07+01:00diff --git a/01-dmenu-desktoponly.diff b/01-dmenu-desktoponly.diff
new file mode 100644
index 0000000..bc6698e
--- /dev/null
+++ b/01-dmenu-desktoponly.diff
@@ -0,0 +1,86 @@
+From fada397413584331798a1a9b8703a10110450889 Mon Sep 17 00:00:00 2001
+From: Robert Bilski <robert@rbilski.com>
+Date: Sun, 4 Aug 2024 22:07:35 +0200
+Subject: [PATCH] Handle .desktop files
+
+Retrieve files from applications/ and open them using gtk-launch
+---
+ Makefile | 8 ++++++--
+ dmenu_path_desktop | 18 ++++++++++++++++++
+ dmenu_run_desktop | 2 ++
+ 3 files changed, 26 insertions(+), 2 deletions(-)
+ create mode 100755 dmenu_path_desktop
+ create mode 100755 dmenu_run_desktop
+
+diff --git a/Makefile b/Makefile
+index 458c524..f157bb1 100644
+--- a/Makefile
++++ b/Makefile
+@@ -28,7 +28,7 @@ clean:
+ dist: clean
+ mkdir -p dmenu-$(VERSION)
+ cp LICENSE Makefile README arg.h config.def.h config.mk dmenu.1\
+- drw.h util.h dmenu_path dmenu_run stest.1 $(SRC)\
++ drw.h util.h dmenu_path dmenu_path_desktop dmenu_run dmenu_run_desktop stest.1 $(SRC)\
+ dmenu-$(VERSION)
+ tar -cf dmenu-$(VERSION).tar dmenu-$(VERSION)
+ gzip dmenu-$(VERSION).tar
+@@ -36,10 +36,12 @@ dist: clean
+
+ install: all
+ mkdir -p $(DESTDIR)$(PREFIX)/bin
+- cp -f dmenu dmenu_path dmenu_run stest $(DESTDIR)$(PREFIX)/bin
++ cp -f dmenu dmenu_path dmenu_path_desktop dmenu_run dmenu_run_desktop stest $(DESTDIR)$(PREFIX)/bin
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path
++ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_path_desktop
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run
++ chmod 755 $(DESTDIR)$(PREFIX)/bin/dmenu_run_desktop
+ chmod 755 $(DESTDIR)$(PREFIX)/bin/stest
+ mkdir -p $(DESTDIR)$(MANPREFIX)/man1
+ sed "s/VERSION/$(VERSION)/g" < dmenu.1 > $(DESTDIR)$(MANPREFIX)/man1/dmenu.1
+@@ -50,7 +52,9 @@ install: all
+ uninstall:
+ rm -f $(DESTDIR)$(PREFIX)/bin/dmenu\
+ $(DESTDIR)$(PREFIX)/bin/dmenu_path\
++ $(DESTDIR)$(PREFIX)/bin/dmenu_path_desktop\
+ $(DESTDIR)$(PREFIX)/bin/dmenu_run\
++ $(DESTDIR)$(PREFIX)/bin/dmenu_run_desktop\
+ $(DESTDIR)$(PREFIX)/bin/stest\
+ $(DESTDIR)$(MANPREFIX)/man1/dmenu.1\
+ $(DESTDIR)$(MANPREFIX)/man1/stest.1
+diff --git a/dmenu_path_desktop b/dmenu_path_desktop
+new file mode 100755
+index 0000000..5ff74b3
+--- /dev/null
++++ b/dmenu_path_desktop
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++cachedir="${XDG_CACHE_HOME:-"$HOME/.cache"}"
++cache="$cachedir/dmenu_run_desktop"
++
++[ ! -e "$cachedir" ] && mkdir -p "$cachedir"
++
++dirs=""
++IFS=:
++for dir in "${XDG_DATA_DIRS:-"/usr/local/share:/usr/share"}"; do
++ dirs="${dirs}:${dir}/applications"
++done;
++
++if stest -dqr -n "$cache" $PATH; then
++ stest -fl $dirs | grep -v 'mimeinfo.cache' | sed 's/\.[^./]*$//' | sort -u | tee "$cache"
++else
++ cat "$cache"
++fi
+diff --git a/dmenu_run_desktop b/dmenu_run_desktop
+new file mode 100755
+index 0000000..a90aceb
+--- /dev/null
++++ b/dmenu_run_desktop
+@@ -0,0 +1,2 @@
++#!/bin/sh
++dmenu_path_desktop | dmenu "$@" | xargs gtk-launch &
+--
+2.46.0
+
diff --git a/02-dmenu-fuzzymatch.diff b/02-dmenu-fuzzymatch.diff
new file mode 100644
index 0000000..1df92a5
--- /dev/null
+++ b/02-dmenu-fuzzymatch.diff
@@ -0,0 +1,196 @@
+From d166c2c90f777f5a80f628d493cdcf7bf03034b8 Mon Sep 17 00:00:00 2001
+From: Justinas Grigas <dev@jstnas.com>
+Date: Mon, 17 Jun 2024 02:52:15 +0100
+Subject: [PATCH] fuzzymatch: Add support for fuzzy-matching
+
+This version of the patch updates the manpage.
+---
+ config.def.h | 1 +
+ config.mk | 2 +-
+ dmenu.1 | 5 ++-
+ dmenu.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 95 insertions(+), 3 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 1edb647..a4e6174 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -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 fuzzy = 1; /* -F option; if 0, dmenu doesn't use fuzzy matching */
+ /* -fn option overrides fonts[0]; default X11 font or font set */
+ static const char *fonts[] = {
+ "monospace:size=10"
+diff --git a/config.mk b/config.mk
+index 137f7c8..6a19175 100644
+--- a/config.mk
++++ b/config.mk
+@@ -21,7 +21,7 @@ FREETYPEINC = /usr/include/freetype2
+
+ # includes and libs
+ INCS = -I$(X11INC) -I$(FREETYPEINC)
+-LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
++LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) -lm
+
+ # flags
+ CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
+diff --git a/dmenu.1 b/dmenu.1
+index 323f93c..e2c5ef4 100644
+--- a/dmenu.1
++++ b/dmenu.1
+@@ -3,7 +3,7 @@
+ dmenu \- dynamic menu
+ .SH SYNOPSIS
+ .B dmenu
+-.RB [ \-bfiv ]
++.RB [ \-bFfiv ]
+ .RB [ \-l
+ .IR lines ]
+ .RB [ \-m
+@@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL.
+ .B \-b
+ dmenu appears at the bottom of the screen.
+ .TP
++.B \-F
++disables fuzzy matching.
++.TP
+ .B \-f
+ dmenu grabs the keyboard before reading stdin if not reading from a tty. This
+ is faster, but will lock up X until stdin reaches end\-of\-file.
+diff --git a/dmenu.c b/dmenu.c
+index 40f93e0..03e1f45 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -1,6 +1,7 @@
+ /* See LICENSE file for copyright and license details. */
+ #include <ctype.h>
+ #include <locale.h>
++#include <math.h>
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
+@@ -31,6 +32,7 @@ struct item {
+ char *text;
+ struct item *left, *right;
+ int out;
++ double distance;
+ };
+
+ static char text[BUFSIZ] = "";
+@@ -226,9 +228,93 @@ grabkeyboard(void)
+ die("cannot grab keyboard");
+ }
+
++int
++compare_distance(const void *a, const void *b)
++{
++ struct item *da = *(struct item **) a;
++ struct item *db = *(struct item **) b;
++
++ if (!db)
++ return 1;
++ if (!da)
++ return -1;
++
++ return da->distance == db->distance ? 0 : da->distance < db->distance ? -1 : 1;
++}
++
++void
++fuzzymatch(void)
++{
++ /* bang - we have so much memory */
++ struct item *it;
++ struct item **fuzzymatches = NULL;
++ char c;
++ int number_of_matches = 0, i, pidx, sidx, eidx;
++ int text_len = strlen(text), itext_len;
++
++ matches = matchend = NULL;
++
++ /* walk through all items */
++ for (it = items; it && it->text; ++it) {
++ if (text_len) {
++ itext_len = strlen(it->text);
++ pidx = 0; /* pointer */
++ sidx = eidx = -1; /* start of match, end of match */
++ /* walk through item text */
++ for (i = 0; i < itext_len && (c = it->text[i]); ++i) {
++ /* fuzzy match pattern */
++ if (!fstrncmp(&text[pidx], &c, 1)) {
++ if(sidx == -1)
++ sidx = i;
++ ++pidx;
++ if (pidx == text_len) {
++ eidx = i;
++ break;
++ }
++ }
++ }
++ /* build list of matches */
++ if (eidx != -1) {
++ /* compute distance */
++ /* add penalty if match starts late (log(sidx+2))
++ * add penalty for long a match without many matching characters */
++ it->distance = log(sidx + 2) + (double)(eidx - sidx - text_len);
++ /* fprintf(stderr, "distance %s %f\n", it->text, it->distance); */
++ appenditem(it, &matches, &matchend);
++ ++number_of_matches;
++ }
++ } else {
++ appenditem(it, &matches, &matchend);
++ }
++ }
++
++ if (number_of_matches) {
++ /* initialize array with matches */
++ if (!(fuzzymatches = realloc(fuzzymatches,
++ number_of_matches * sizeof(struct item *))))
++ die("cannot realloc %u bytes:", number_of_matches * sizeof(struct item *));
++ for (i = 0, it = matches; it && i < number_of_matches; ++i, it = it->right)
++ fuzzymatches[i] = it;
++ /* sort matches according to distance */
++ qsort(fuzzymatches, number_of_matches, sizeof(struct item*), compare_distance);
++ /* rebuild list of matches */
++ matches = matchend = NULL;
++ for (i = 0, it = fuzzymatches[i]; i < number_of_matches && it &&
++ it->text; ++i, it = fuzzymatches[i])
++ appenditem(it, &matches, &matchend);
++ free(fuzzymatches);
++ }
++ curr = sel = matches;
++ calcoffsets();
++}
++
+ static void
+ match(void)
+ {
++ if (fuzzy) {
++ fuzzymatch();
++ return;
++ }
+ static char **tokv = NULL;
+ static int tokn = 0;
+
+@@ -715,7 +801,7 @@ setup(void)
+ static void
+ usage(void)
+ {
+- die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
++ die("usage: dmenu [-bFfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
+ " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
+ }
+
+@@ -732,6 +818,8 @@ main(int argc, char *argv[])
+ exit(0);
+ } else if (!strcmp(argv[i], "-b")) /* appears at the bottom of the screen */
+ topbar = 0;
++ else if (!strcmp(argv[i], "-F")) /* disables fuzzy matching */
++ fuzzy = 0;
+ else if (!strcmp(argv[i], "-f")) /* grabs keyboard before reading stdin */
+ fast = 1;
+ else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
+--
+2.45.2
+
diff --git a/03-dmenu-date.diff b/03-dmenu-date.diff
new file mode 100644
index 0000000..a46db90
--- /dev/null
+++ b/03-dmenu-date.diff
@@ -0,0 +1,57 @@
+From 64fb38e3778addc0272eb8793deb909e639e5746 Mon Sep 17 00:00:00 2001
+From: piotr-marendowski <piotr-marendowski@tutanota.com>
+Date: Thu, 6 Jul 2023 10:03:03 +0000
+Subject: [PATCH] Displays date and time at the bottom of the vertical layout.
+
+---
+ dmenu.c | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+diff --git a/dmenu.c b/dmenu.c
+index 7cf253b..5428f67 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -84,7 +84,7 @@ calcoffsets(void)
+ int i, n;
+
+ if (lines > 0)
+- n = lines * bh;
++ n = (lines * bh) - 1;
+ else
+ n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
+ /* calculate which items will begin the next page and previous page */
+@@ -143,6 +143,22 @@ drawitem(struct item *item, int x, int y, int w)
+ return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
+ }
+
++static int
++drawdate(int x, int y, int w)
++{
++ char date[128];
++ time_t t = time(NULL);
++ struct tm *tm = localtime(&t);
++
++ /* Hour:Minute DayOfTheWeek DayOfTheMonth Month Year */
++ strftime(date, sizeof(date), "%H:%M %A %d %B %Y", tm);
++
++ drw_setscheme(drw, scheme[SchemeSel]);
++
++ int r = drw_text(drw, x, y, w, bh, lrpad / 2, date, 0);
++ return r;
++}
++
+ static void
+ drawmenu(void)
+ {
+@@ -172,6 +188,8 @@ drawmenu(void)
+ /* draw vertical list */
+ for (item = curr; item != next; item = item->right)
+ drawitem(item, x, y += bh, mw - x);
++
++ drawdate(x, lines * bh, w);
+ } else if (matches) {
+ /* draw horizontal list */
+ x += inputw;
+--
+2.41.0
+