cleanup schemes and colors 93f26863
Hiltjo Posthuma · 2025-09-27 12:10 3 file(s) · +30 −4
drw.c +25 −3
178 178
		die("error, cannot allocate color '%s'", clrname);
179 179
}
180 180
181 -
/* Wrapper to create color schemes. The caller has to call free(3) on the
182 -
 * returned color scheme when done using it. */
181 +
/* Create color schemes. */
183 182
Clr *
184 183
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
185 184
{
187 186
	Clr *ret;
188 187
189 188
	/* need at least two colors for a scheme */
190 -
	if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
189 +
	if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(Clr))))
191 190
		return NULL;
192 191
193 192
	for (i = 0; i < clrcount; i++)
194 193
		drw_clr_create(drw, &ret[i], clrnames[i]);
195 194
	return ret;
195 +
}
196 +
197 +
void
198 +
drw_clr_free(Drw *drw, Clr *c)
199 +
{
200 +
	if (!drw || !c)
201 +
		return;
202 +
203 +
	/* c is typedef XftColor Clr */
204 +
	XftColorFree(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
205 +
	             DefaultColormap(drw->dpy, drw->screen), c);
206 +
}
207 +
208 +
void
209 +
drw_scm_free(Drw *drw, Clr *scm, size_t clrcount)
210 +
{
211 +
	size_t i;
212 +
213 +
	if (!drw || !scm)
214 +
		return;
215 +
216 +
	for (i = 0; i < clrcount; i++)
217 +
		drw_clr_free(drw, &scm[i]);
196 218
}
197 219
198 220
void
drw.h +2 −0
40 40
41 41
/* Colorscheme abstraction */
42 42
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
43 +
void drw_clr_free(Drw *drw, Clr *c);
43 44
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
45 +
void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount);
44 46
45 47
/* Cursor abstraction */
46 48
Cur *drw_cur_create(Drw *drw, int shape);
dwm.c +3 −1
485 485
		cleanupmon(mons);
486 486
	for (i = 0; i < CurLast; i++)
487 487
		drw_cur_free(drw, cursor[i]);
488 -
	for (i = 0; i < LENGTH(colors); i++)
488 +
	for (i = 0; i < LENGTH(colors); i++) {
489 +
		drw_scm_free(drw, scheme[i], 3);
489 490
		free(scheme[i]);
491 +
	}
490 492
	free(scheme);
491 493
	XDestroyWindow(dpy, wmcheckwin);
492 494
	drw_free(drw);