cleanup schemes and colors - dwm - dynamic window manager
 (HTM) git clone git://git.suckless.org/dwm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 93f26863d14666e56e992de3670a77178e66ddf2
 (DIR) parent 74edc27caa65aba9ea8d1fe03d26e3b449f79590
 (HTM) Author: Hiltjo Posthuma <hiltjo@codemadness.org>
       Date:   Sat, 27 Sep 2025 12:10:17 +0200
       
       cleanup schemes and colors
       
       Diffstat:
         M drw.c                               |      28 +++++++++++++++++++++++++---
         M drw.h                               |       2 ++
         M dwm.c                               |       4 +++-
       
       3 files changed, 30 insertions(+), 4 deletions(-)
       ---
 (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);
 (DIR) diff --git a/dwm.c b/dwm.c
       @@ -485,8 +485,10 @@ cleanup(void)
                        cleanupmon(mons);
                for (i = 0; i < CurLast; i++)
                        drw_cur_free(drw, cursor[i]);
       -        for (i = 0; i < LENGTH(colors); i++)
       +        for (i = 0; i < LENGTH(colors); i++) {
       +                drw_scm_free(drw, scheme[i], 3);
                        free(scheme[i]);
       +        }
                free(scheme);
                XDestroyWindow(dpy, wmcheckwin);
                drw_free(drw);