Initial commit
This commit is contained in:
		
							
								
								
									
										152
									
								
								patches/dmenu-fuzzyhighlight-4.9.diff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								patches/dmenu-fuzzyhighlight-4.9.diff
									
									
									
									
									
										Normal 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 | ||||
							
								
								
									
										163
									
								
								patches/dmenu-fuzzymatch-4.9.diff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								patches/dmenu-fuzzymatch-4.9.diff
									
									
									
									
									
										Normal 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 | ||||
|  | ||||
							
								
								
									
										103
									
								
								patches/dmenu-password-5.0.diff
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								patches/dmenu-password-5.0.diff
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | ||||
| From c4de1032bd4c247bc20b6ab92a10a8d778966679 Mon Sep 17 00:00:00 2001 | ||||
| From: Mehrad Mahmoudian <m.mahmoudian@gmail.com> | ||||
| Date: Tue, 4 May 2021 12:05:09 +0300 | ||||
| Subject: [PATCH] patched with password patch | ||||
|  | ||||
| --- | ||||
|  dmenu.1 |  5 ++++- | ||||
|  dmenu.c | 21 +++++++++++++++++---- | ||||
|  2 files changed, 21 insertions(+), 5 deletions(-) | ||||
|  | ||||
| diff --git a/dmenu.1 b/dmenu.1 | ||||
| index 323f93c..762f707 100644 | ||||
| --- a/dmenu.1 | ||||
| +++ b/dmenu.1 | ||||
| @@ -3,7 +3,7 @@ | ||||
|  dmenu \- dynamic menu | ||||
|  .SH SYNOPSIS | ||||
|  .B dmenu | ||||
| -.RB [ \-bfiv ] | ||||
| +.RB [ \-bfivP ] | ||||
|  .RB [ \-l | ||||
|  .IR lines ] | ||||
|  .RB [ \-m | ||||
| @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file. | ||||
|  .B \-i | ||||
|  dmenu matches menu items case insensitively. | ||||
|  .TP | ||||
| +.B \-P | ||||
| +dmenu will not directly display the keyboard input, but instead replace it with dots. All data from stdin will be ignored. | ||||
| +.TP | ||||
|  .BI \-l " lines" | ||||
|  dmenu lists items vertically, with the given number of lines. | ||||
|  .TP | ||||
| diff --git a/dmenu.c b/dmenu.c | ||||
| index 65f25ce..ad8f63b 100644 | ||||
| --- a/dmenu.c | ||||
| +++ b/dmenu.c | ||||
| @@ -37,7 +37,7 @@ struct item { | ||||
|  static char text[BUFSIZ] = ""; | ||||
|  static char *embed; | ||||
|  static int bh, mw, mh; | ||||
| -static int inputw = 0, promptw; | ||||
| +static int inputw = 0, promptw, passwd = 0; | ||||
|  static int lrpad; /* sum of left and right padding */ | ||||
|  static size_t cursor; | ||||
|  static struct item *items = NULL; | ||||
| @@ -132,6 +132,7 @@ drawmenu(void) | ||||
|  	unsigned int curpos; | ||||
|  	struct item *item; | ||||
|  	int x = 0, y = 0, w; | ||||
| +	char *censort; | ||||
|   | ||||
|  	drw_setscheme(drw, scheme[SchemeNorm]); | ||||
|  	drw_rect(drw, 0, 0, mw, mh, 1, 1); | ||||
| @@ -143,7 +144,12 @@ drawmenu(void) | ||||
|  	/* draw input field */ | ||||
|  	w = (lines > 0 || !matches) ? mw - x : inputw; | ||||
|  	drw_setscheme(drw, scheme[SchemeNorm]); | ||||
| -	drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); | ||||
| +	if (passwd) { | ||||
| +	        censort = ecalloc(1, sizeof(text)); | ||||
| +		memset(censort, '.', strlen(text)); | ||||
| +		drw_text(drw, x, 0, w, bh, lrpad / 2, censort, 0); | ||||
| +		free(censort); | ||||
| +	} else drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0); | ||||
|   | ||||
|  	curpos = TEXTW(text) - TEXTW(&text[cursor]); | ||||
|  	if ((curpos += lrpad / 2 - 1) < w) { | ||||
| @@ -524,6 +530,11 @@ readstdin(void) | ||||
|  	char buf[sizeof text], *p; | ||||
|  	size_t i, imax = 0, size = 0; | ||||
|  	unsigned int tmpmax = 0; | ||||
| +	if(passwd){ | ||||
| +    	inputw = lines = 0; | ||||
| +    	return; | ||||
| +  	} | ||||
| + | ||||
|   | ||||
|  	/* read each line from stdin and add it to the item list */ | ||||
|  	for (i = 0; fgets(buf, sizeof buf, stdin); i++) { | ||||
| @@ -689,7 +700,7 @@ setup(void) | ||||
|  static void | ||||
|  usage(void) | ||||
|  { | ||||
| -	fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" | ||||
| +	fputs("usage: dmenu [-bfivP] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" | ||||
|  	      "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); | ||||
|  	exit(1); | ||||
|  } | ||||
| @@ -712,7 +723,9 @@ main(int argc, char *argv[]) | ||||
|  		else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */ | ||||
|  			fstrncmp = strncasecmp; | ||||
|  			fstrstr = cistrstr; | ||||
| -		} else if (i + 1 == argc) | ||||
| +		} else if (!strcmp(argv[i], "-P"))   /* is the input a password */ | ||||
| +			passwd = 1; | ||||
| +		else if (i + 1 == argc) | ||||
|  			usage(); | ||||
|  		/* these options take one argument */ | ||||
|  		else if (!strcmp(argv[i], "-l"))   /* number of lines in vertical list */ | ||||
| --  | ||||
| 2.31.1 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user