Luke Jones

dmenupatches - commit 68f4a89

feat: patch init68f4a89f7d2cde06b8f76aeb65f36954aa6f2c3aLukeJ<luke.jones.2567@gmail.com>2026-09-28T20:22:07+01:00
diff --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 +