cleanup schemes and colors - dmenu - dynamic menu
 (HTM) git clone git://git.suckless.org/dmenu
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 77f96d704bd16b04fe731da815a4e76c4e62decb
 (DIR) parent d893c63cdd927c33b9b8c9bc52aaa284199a650a
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 27 Sep 2025 12:10:37 +0200
       
       cleanup schemes and colors
       
       Diffstat:
         M dmenu.c                             |       4 +++-
         M drw.c                               |      28 +++++++++++++++++++++++++---
         M drw.h                               |       2 ++
       
       3 files changed, 30 insertions(+), 4 deletions(-)
       ---
 (DIR) diff --git a/dmenu.c b/dmenu.c
       @@ -101,8 +101,10 @@ cleanup(void)
                size_t i;
        
                XUngrabKeyboard(dpy, CurrentTime);
       -        for (i = 0; i < SchemeLast; i++)
       +        for (i = 0; i < SchemeLast; i++) {
       +                drw_scm_free(drw, scheme[i], 2);
                        free(scheme[i]);
       +        }
                for (i = 0; items && items[i].text; ++i)
                        free(items[i].text);
                free(items);
 (DIR) diff --git a/drw.c b/drw.c
       @@ -178,8 +178,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
                        die("error, cannot allocate color '%s'", clrname);
        }
        
       -/* 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[], size_t clrcount)
        {
       @@ -187,7 +186,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
                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++)
       @@ -196,6 +195,29 @@ drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
        }
        
        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]);
       +}
       +
       +void
        drw_setfontset(Drw *drw, Fnt *set)
        {
                if (drw)
 (DIR) diff --git a/drw.h b/drw.h
       @@ -40,7 +40,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);
       +void drw_clr_free(Drw *drw, Clr *c);
        Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
       +void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
        
        /* Cursor abstraction */
        Cur *drw_cur_create(Drw *drw, int shape);