From cce69140e3d5bc3626d5cb8a85f98b88fcfd5fb3 Mon Sep 17 00:00:00 2001 From: Polesznyák Márk Date: Sun, 22 Feb 2026 15:01:55 +0100 Subject: chore(dmenu): sync with upstream Commits: - cleanup schemes and colors (77f96d7) - drw.c: drw_scm_free: call free inside (8b48986) - add -of and -ob arguments for outline colors options for multi-selection (7175c48) --- dmenu/dmenu.1 | 10 ++++++++++ dmenu/dmenu.c | 6 +++++- dmenu/drw.c | 29 ++++++++++++++++++++++++++--- dmenu/drw.h | 2 ++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/dmenu/dmenu.1 b/dmenu/dmenu.1 index 2bf9c77..0e22e14 100644 --- a/dmenu/dmenu.1 +++ b/dmenu/dmenu.1 @@ -22,6 +22,10 @@ dmenu \- dynamic menu .IR color ] .RB [ \-sf .IR color ] +.RB [ \-ob +.IR color ] +.RB [ \-of +.IR color ] .RB [ \-w .IR windowid ] .P @@ -86,6 +90,12 @@ defines the selected background color. .BI \-sf " color" defines the selected foreground color. .TP +.BI \-ob " color" +defines the outline background color (for multiple selection). +.TP +.BI \-of " color" +defines the outline foreground color (for multiple selection). +.TP .B \-v prints version information to stdout, then exits. .TP diff --git a/dmenu/dmenu.c b/dmenu/dmenu.c index d8540f2..429195e 100644 --- a/dmenu/dmenu.c +++ b/dmenu/dmenu.c @@ -125,7 +125,7 @@ static void cleanup(void) { XUngrabKeyboard(dpy, CurrentTime); for (i = 0; i < SchemeLast; i++) - free(scheme[i]); + drw_scm_free(drw, scheme[i], 2); for (i = 0; items && items[i].text; ++i) free(items[i].text); free(items); @@ -900,6 +900,10 @@ int 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], "-ob")) /* outline background color */ + colors[SchemeOut][ColBg] = argv[++i]; + else if (!strcmp(argv[i], "-of")) /* outline foreground color */ + colors[SchemeOut][ColFg] = argv[++i]; else if (!strcmp(argv[i], "-w")) /* embedding window id */ embed = argv[++i]; else diff --git a/dmenu/drw.c b/dmenu/drw.c index f258a41..c88f43d 100644 --- a/dmenu/drw.c +++ b/dmenu/drw.c @@ -182,8 +182,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha) dest->pixel = (dest->pixel & 0x00FFFFFFU) | (alpha << 24); } -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ +/* Create color schemes. */ Clr * drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) { @@ -191,7 +190,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], si Clr *ret; /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) + if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(Clr)))) return NULL; for (i = 0; i < clrcount; i++) @@ -199,6 +198,30 @@ drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], si return ret; } +void +drw_clr_free(Drw *drw, Clr *c) +{ + if (!drw || !c) + return; + + /* c is typedef XftColor Clr */ + XftColorFree(drw->dpy, DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen), c); +} + +void +drw_scm_free(Drw *drw, Clr *scm, size_t clrcount) +{ + size_t i; + + if (!drw || !scm) + return; + + for (i = 0; i < clrcount; i++) + drw_clr_free(drw, &scm[i]); + free(scm); +} + void drw_setfontset(Drw *drw, Fnt *set) { diff --git a/dmenu/drw.h b/dmenu/drw.h index 94b8bbd..d00c2f2 100644 --- a/dmenu/drw.h +++ b/dmenu/drw.h @@ -43,7 +43,9 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in /* Colorscheme abstraction */ void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); +void drw_clr_free(Drw *drw, Clr *c); Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); +void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount); /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape); -- cgit v1.2.3