commit 77f96d704bd16b04fe731da815a4e76c4e62decb
parent d893c63cdd927c33b9b8c9bc52aaa284199a650a
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Sat, 27 Sep 2025 12:10:37 +0200
cleanup schemes and colors
Diffstat:
3 files changed, 30 insertions(+), 4 deletions(-)
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);
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)
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);