Commit Diff


commit - d893c63cdd927c33b9b8c9bc52aaa284199a650a
commit + 77f96d704bd16b04fe731da815a4e76c4e62decb
blob - fd49549caf05f0329336679236ef124e0e7a1ee4
blob + 9bad959d0849fb4c00a486ce74c0eefc29236e3b
--- dmenu.c
+++ 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);
blob - c41e6aff094243c2c58bccf69283192f3db16939
blob + 98dbaa8304cc6303925ecf384a09cb9076c96349
--- drw.c
+++ drw.c
@@ -178,8 +178,7 @@ drw_clr_create(Drw *drw, Clr *dest, const char *clrnam
 		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_
 	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_
 }
 
 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)
blob - fd7631b2ba4a3b3b3734345afae2b80078a8e980
blob + 2ed77bee5a158e64d584890064b49cb0b2cc823e
--- drw.h
+++ drw.h
@@ -40,7 +40,9 @@ void drw_font_getexts(Fnt *font, const char *text, uns
 
 /* 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);