dmenu

my build of dmenu
git clone git://git.ckyln.com/~cem/dmenu.git
Log | Files | Refs | README | LICENSE

commit 09f7d8135b237ec8adccf86dc84e7e6327784837
parent 7247033a80f470b0b7aeb9598649ad15036c7be9
Author: Cem Keylan <cem@ckyln.com>
Date:   Mon, 21 Sep 2020 12:46:44 +0300

Add highlight patch

Diffstat:
Mconfig.def.h | 2++
Mdmenu.1 | 20++++++++++++++++++++
Mdmenu.c | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++--
3 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -13,6 +13,8 @@ static const char *colors[SchemeLast][2] = { /* fg bg */ [SchemeNorm] = { "#bfbfbf", "#282a36" }, [SchemeSel] = { "#f8f8f2", "#9d638a" }, + [SchemeSelHighlight] = { "#9AEDFE", "#9d638a" }, + [SchemeNormHighlight] = { "#F1FA8C", "#282a36" }, [SchemeOut] = { "#000000", "#00ffff" }, }; /* -l option; if nonzero, dmenu uses vertical list with given number of lines */ diff --git a/dmenu.1 b/dmenu.1 @@ -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 @@ -81,6 +89,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 --git a/dmenu.c b/dmenu.c @@ -27,7 +27,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; @@ -124,9 +126,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) @@ -134,7 +176,9 @@ drawitem(struct item *item, int x, int y, int w) 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 @@ -811,6 +855,7 @@ static void usage(void) { fputs("usage: dmenu [-bfiPv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n" + " [-nhb color] [-nhf color] [-shb color] [-shf color]\n" " [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr); exit(1); } @@ -858,6 +903,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