Replaced patches.org with patches folder

Includes new patch for better vim keys.
This commit is contained in:
2024-10-24 14:29:12 +01:00
parent a9e36deccc
commit 0ee43b8855
5 changed files with 601 additions and 6 deletions

View File

@@ -1,6 +0,0 @@
#+TITLE: Patches
List of patches
- fuzzymatch-4.9 (custom installed)
- fuzzyhighlight-4.9 (bit of code wrangling)
- json (instant install)

View File

@@ -0,0 +1,60 @@
From a9e36deccc71e5774a198e652c986211bb7a123e Mon Sep 17 00:00:00 2001
From: Aryadev Chavali <aryadev@aryadevchavali.com>
Date: Thu, 24 Oct 2024 14:23:01 +0100
Subject: [PATCH] [PATCH] M-j and M-k iterate choices 1-1, M-h and M-l
page-page.
Flip the M-{j, k} and M-{h, l} commands, to mirror my Emacs
configuration.
---
dmenu.1 | 8 ++++----
dmenu.c | 8 ++++----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/dmenu.1 b/dmenu.1
index 472b179..d635316 100644
--- a/dmenu.1
+++ b/dmenu.1
@@ -199,16 +199,16 @@ Home
End
.TP
.B M\-h
-Up
+Page up
.TP
.B M\-j
-Page down
+Down
.TP
.B M\-k
-Page up
+Up
.TP
.B M\-l
-Down
+Page down
.SH SEE ALSO
.IR dwm (1),
.IR stest (1)
diff --git a/dmenu.c b/dmenu.c
index 9ecbd86..8a3c68e 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -515,10 +515,10 @@ keypress(XKeyEvent *ev)
goto draw;
case XK_g: ksym = XK_Home; break;
case XK_G: ksym = XK_End; break;
- case XK_h: ksym = XK_Up; break;
- case XK_j: ksym = XK_Next; break;
- case XK_k: ksym = XK_Prior; break;
- case XK_l: ksym = XK_Down; break;
+ case XK_h: ksym = XK_Prior; break;
+ case XK_j: ksym = XK_Down; break;
+ case XK_k: ksym = XK_Up; break;
+ case XK_l: ksym = XK_Next; break;
default:
return;
}
--
2.47.0

View File

@@ -0,0 +1,152 @@
Author: Chris Noxz <chris@noxz.tech>
note: This patch is meant to be used together with fuzzymatch
diff -upN dmenu-4.9/config.def.h dmenu-4.9-fuzzyhighlight/config.def.h
--- dmenu-4.9/config.def.h 2019-02-02 13:55:02.000000000 +0100
+++ dmenu-4.9-fuzzyhighlight/config.def.h 2020-04-04 10:26:36.990890854 +0200
@@ -11,6 +11,8 @@ static const char *colors[SchemeLast][2]
/* fg bg */
[SchemeNorm] = { "#bbbbbb", "#222222" },
[SchemeSel] = { "#eeeeee", "#005577" },
+ [SchemeSelHighlight] = { "#ffc978", "#005577" },
+ [SchemeNormHighlight] = { "#ffc978", "#222222" },
[SchemeOut] = { "#000000", "#00ffff" },
};
/* -l option; if nonzero, dmenu uses vertical list with given number of lines */
diff -upN dmenu-4.9/dmenu.1 dmenu-4.9-fuzzyhighlight/dmenu.1
--- dmenu-4.9/dmenu.1 2019-02-02 13:55:02.000000000 +0100
+++ dmenu-4.9-fuzzyhighlight/dmenu.1 2020-04-04 10:30:16.430054933 +0200
@@ -20,6 +20,14 @@ dmenu \- dynamic menu
.IR color ]
.RB [ \-sf
.IR color ]
+.RB [ \-nhb
+.IR color ]
+.RB [ \-nhf
+.IR color ]
+.RB [ \-shb
+.IR color ]
+.RB [ \-shf
+.IR color ]
.RB [ \-w
.IR windowid ]
.P
@@ -75,6 +83,18 @@ defines the selected background color.
.BI \-sf " color"
defines the selected foreground color.
.TP
+.BI \-nhb " color"
+defines the normal highlight background color.
+.TP
+.BI \-nhf " color"
+defines the normal highlight foreground color.
+.TP
+.BI \-shb " color"
+defines the selected highlight background color.
+.TP
+.BI \-shf " color"
+defines the selected highlight foreground color.
+.TP
.B \-v
prints version information to stdout, then exits.
.TP
diff -upN dmenu-4.9/dmenu.c dmenu-4.9-fuzzyhighlight/dmenu.c
--- dmenu-4.9/dmenu.c 2019-02-02 13:55:02.000000000 +0100
+++ dmenu-4.9-fuzzyhighlight/dmenu.c 2020-04-04 10:27:43.888026309 +0200
@@ -26,7 +26,9 @@
#define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad)
/* enums */
-enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
+enum { SchemeNorm, SchemeSel, SchemeNormHighlight, SchemeSelHighlight,
+ SchemeOut, SchemeLast }; /* color schemes */
+
struct item {
char *text;
@@ -113,9 +115,49 @@ cistrstr(const char *s, const char *sub)
return NULL;
}
+static void
+drawhighlights(struct item *item, int x, int y, int maxw)
+{
+ int i, indent;
+ char *highlight;
+ char c;
+
+ if (!(strlen(item->text) && strlen(text)))
+ return;
+
+ drw_setscheme(drw, scheme[item == sel
+ ? SchemeSelHighlight
+ : SchemeNormHighlight]);
+ for (i = 0, highlight = item->text; *highlight && text[i];) {
+ if (*highlight == text[i]) {
+ /* get indentation */
+ c = *highlight;
+ *highlight = '\0';
+ indent = TEXTW(item->text);
+ *highlight = c;
+
+ /* highlight character */
+ c = highlight[1];
+ highlight[1] = '\0';
+ drw_text(
+ drw,
+ x + indent - (lrpad / 2),
+ y,
+ MIN(maxw - indent, TEXTW(highlight) - lrpad),
+ bh, 0, highlight, 0
+ );
+ highlight[1] = c;
+ i++;
+ }
+ highlight++;
+ }
+}
+
+
static int
drawitem(struct item *item, int x, int y, int w)
{
+ int r;
if (item == sel)
drw_setscheme(drw, scheme[SchemeSel]);
else if (item->out)
@@ -123,7 +165,9 @@ drawitem(struct item *item, int x, int y
else
drw_setscheme(drw, scheme[SchemeNorm]);
- return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
+ r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
+ drawhighlights(item, x, y, w);
+ return r;
}
static void
@@ -683,7 +727,8 @@ static void
usage(void)
{
fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
- " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
+ " [-nb color] [-nf color] [-sb color] [-sf color]\n"
+ " [-nhb color] [-nhf color] [-shb color] [-shf color] [-w windowid]\n", stderr);
exit(1);
}
@@ -724,6 +769,14 @@ main(int argc, char *argv[])
colors[SchemeSel][ColBg] = argv[++i];
else if (!strcmp(argv[i], "-sf")) /* selected foreground color */
colors[SchemeSel][ColFg] = argv[++i];
+ else if (!strcmp(argv[i], "-nhb")) /* normal hi background color */
+ colors[SchemeNormHighlight][ColBg] = argv[++i];
+ else if (!strcmp(argv[i], "-nhf")) /* normal hi foreground color */
+ colors[SchemeNormHighlight][ColFg] = argv[++i];
+ else if (!strcmp(argv[i], "-shb")) /* selected hi background color */
+ colors[SchemeSelHighlight][ColBg] = argv[++i];
+ else if (!strcmp(argv[i], "-shf")) /* selected hi foreground color */
+ colors[SchemeSelHighlight][ColFg] = argv[++i];
else if (!strcmp(argv[i], "-w")) /* embedding window id */
embed = argv[++i];
else

View File

@@ -0,0 +1,163 @@
From 94353eb52055927d9079f3d9e33da1c954abf386 Mon Sep 17 00:00:00 2001
From: aleks <aleks.stier@icloud.com>
Date: Wed, 26 Jun 2019 13:25:10 +0200
Subject: [PATCH] Add support for fuzzy-matching
---
config.def.h | 1 +
config.mk | 2 +-
dmenu.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 91 insertions(+), 1 deletion(-)
diff --git a/config.def.h b/config.def.h
index 1edb647..51612b9 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 0929b4a..d14309a 100644
--- a/config.mk
+++ b/config.mk
@@ -20,7 +20,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.c b/dmenu.c
index 6b8f51b..96ddc98 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>
@@ -32,6 +33,7 @@ struct item {
char *text;
struct item *left, *right;
int out;
+ double distance;
};
static char text[BUFSIZ] = "";
@@ -210,9 +212,94 @@ 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;
@@ -702,6 +789,8 @@ 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 */
+ fuzzy = 0;
else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
fstrncmp = strncasecmp;
fstrstr = cistrstr;
--
2.22.0

View File

@@ -0,0 +1,226 @@
diff --git a/config.mk b/config.mk
index 0929b4a..4627988 100644
--- a/config.mk
+++ b/config.mk
@@ -18,13 +18,19 @@ FREETYPEINC = /usr/include/freetype2
# OpenBSD (uncomment)
#FREETYPEINC = $(X11INC)/freetype2
+# jansson
+JANSSONINC = `pkg-config --cflags jansson`
+JANSSONLIBS = `pkg-config --libs jansson`
+# uncomment on RHEL for strcasecmp
+#EXTRAFLAGS=-D_GNU_SOURCE
+
# includes and libs
-INCS = -I$(X11INC) -I$(FREETYPEINC)
-LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS)
+INCS = -I$(X11INC) -I$(FREETYPEINC) $(JANSSONINC)
+LIBS = -L$(X11LIB) -lX11 $(XINERAMALIBS) $(FREETYPELIBS) $(JANSSONLIBS)
# flags
-CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS)
-CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS)
+CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700 -D_POSIX_C_SOURCE=200809L -DVERSION=\"$(VERSION)\" $(XINERAMAFLAGS) $(EXTRAFLAGS)
+CFLAGS = -std=c99 -pedantic -Wall -Os $(INCS) $(CPPFLAGS)
LDFLAGS = $(LIBS)
# compiler and linker
diff --git a/dmenu.c b/dmenu.c
index 65f25ce..58c1e23 100644
--- a/dmenu.c
+++ b/dmenu.c
@@ -15,6 +15,7 @@
#include <X11/extensions/Xinerama.h>
#endif
#include <X11/Xft/Xft.h>
+#include <jansson.h>
#include "drw.h"
#include "util.h"
@@ -32,6 +33,7 @@ struct item {
char *text;
struct item *left, *right;
int out;
+ json_t *json;
};
static char text[BUFSIZ] = "";
@@ -40,6 +42,8 @@ static int bh, mw, mh;
static int inputw = 0, promptw;
static int lrpad; /* sum of left and right padding */
static size_t cursor;
+static size_t items_sz = 0;
+static size_t items_ln = 0;
static struct item *items = NULL;
static struct item *matches, *matchend;
static struct item *prev, *curr, *next, *sel;
@@ -58,6 +62,18 @@ static Clr *scheme[SchemeLast];
static int (*fstrncmp)(const char *, const char *, size_t) = strncmp;
static char *(*fstrstr)(const char *, const char *) = strstr;
+static void listjson(json_t *obj);
+static json_t *json = NULL;
+
+static struct item *
+itemnew(void)
+{
+ if (items_ln + 1 >= (items_sz / sizeof *items))
+ if (!(items = realloc(items, (items_sz += BUFSIZ))))
+ die("cannot realloc %u bytes:", items_sz);
+ return &items[items_ln++];
+}
+
static void
appenditem(struct item *item, struct item **list, struct item **last)
{
@@ -221,6 +237,8 @@ match(void)
size_t len, textsize;
struct item *item, *lprefix, *lsubstr, *prefixend, *substrend;
+ if (json)
+ fstrstr = strcasestr;
strcpy(buf, text);
/* separate input text into tokens to be matched individually */
for (s = strtok(buf, " "); s; tokv[tokc - 1] = s, s = strtok(NULL, " "))
@@ -464,7 +482,19 @@ insert:
break;
case XK_Return:
case XK_KP_Enter:
- puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
+ if (sel && sel->json) {
+ if (json_is_object(sel->json)) {
+ listjson(sel->json);
+ text[0] = '\0';
+ match();
+ drawmenu();
+ break;
+ } else {
+ puts(json_string_value(sel->json));
+ }
+ } else {
+ puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
+ }
if (!(ev->state & ControlMask)) {
cleanup();
exit(0);
@@ -519,32 +549,71 @@ paste(void)
}
static void
+readjson(const char *path)
+{
+ json_error_t jerr;
+
+ if (!(json = json_load_file(path, 0, &jerr)))
+ die("%s @ line: %i - %s", jerr.text, jerr.line, path);
+}
+
+static void
+listjson(json_t *obj)
+{
+ void *iter;
+ unsigned imax = 0;
+ unsigned tmpmax = 0;
+ struct item *item;
+
+ items_ln = 0;
+ iter = json_object_iter(obj);
+ while (iter) {
+ item = itemnew();
+ item->text = (char*) json_object_iter_key(iter);
+ item->json = json_object_iter_value(iter);
+ item->out = 0;
+ drw_font_getexts(drw->fonts, item->text, strlen(item->text),
+ &tmpmax, NULL);
+ if (tmpmax > inputw) {
+ inputw = tmpmax;
+ imax = items_ln - 1;
+ }
+ iter = json_object_iter_next(obj, iter);
+ }
+ if (items)
+ items[items_ln].text = NULL;
+ inputw = items ? TEXTW(items[imax].text) : 0;
+ lines = MIN(lines, items_ln - 1);
+}
+
+static void
readstdin(void)
{
char buf[sizeof text], *p;
- size_t i, imax = 0, size = 0;
+ size_t i;
+ unsigned int imax = 0;
unsigned int tmpmax = 0;
+ struct item *item;
/* read each line from stdin and add it to the item list */
for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
- if (i + 1 >= size / sizeof *items)
- if (!(items = realloc(items, (size += BUFSIZ))))
- die("cannot realloc %u bytes:", size);
+ item = itemnew();
if ((p = strchr(buf, '\n')))
*p = '\0';
- if (!(items[i].text = strdup(buf)))
+ if (!(item->text = strdup(buf)))
die("cannot strdup %u bytes:", strlen(buf) + 1);
- items[i].out = 0;
+ item->json = NULL;
+ item->out = 0;
drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL);
if (tmpmax > inputw) {
inputw = tmpmax;
- imax = i;
+ imax = items_ln - 1;
}
}
if (items)
- items[i].text = NULL;
+ items[items_ln].text = NULL;
inputw = items ? TEXTW(items[imax].text) : 0;
- lines = MIN(lines, i);
+ lines = MIN(lines, items_ln);
}
static void
@@ -689,8 +758,9 @@ setup(void)
static void
usage(void)
{
- fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
- " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
+ fputs("usage: dmenu [-bfiv] [-j json-file] [-l lines] [-p prompt]\n"
+ " [-fn font] [-m monitor] [-nb color] [-nf color]\n"
+ " [-sb color] [-sf color] [-w windowid]\n", stderr);
exit(1);
}
@@ -715,6 +785,8 @@ main(int argc, char *argv[])
} else if (i + 1 == argc)
usage();
/* these options take one argument */
+ else if (!strcmp(argv[i], "-j"))
+ readjson(argv[++i]);
else if (!strcmp(argv[i], "-l")) /* number of lines in vertical list */
lines = atoi(argv[++i]);
else if (!strcmp(argv[i], "-m"))
@@ -759,9 +831,15 @@ main(int argc, char *argv[])
if (fast && !isatty(0)) {
grabkeyboard();
- readstdin();
+ if (json)
+ listjson(json);
+ else
+ readstdin();
} else {
- readstdin();
+ if (json)
+ listjson(json);
+ else
+ readstdin();
grabkeyboard();
}
setup();