From f149dd4fdf6987e1b7b67fc86f6807ffd3fe4aa4 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 11 Jan 2026 18:37:23 +0000 Subject: [PATCH] Cache XftDraw context in Drw struct to reduce allocation overhead drw_text is called frequently for drawing text (window titles, status bar). Previously, it created and destroyed an XftDraw object on every call. This commit caches the XftDraw object in the Drw struct, initializing it in drw_create and updating it in drw_resize. This reduces X server round-trips and memory allocation overhead during rendering. --- drw.c | 21 +++++++++++++-------- drw.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/drw.c b/drw.c index 7e99a386..eeb6a133 100644 --- a/drw.c +++ b/drw.c @@ -80,6 +80,8 @@ Drw *drw_create(Display *dpy, int screen, Window root, unsigned int w, drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen)); drw->gc = XCreateGC(dpy, root, 0, NULL); XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter); + drw->xftdraw = XftDrawCreate(dpy, drw->drawable, DefaultVisual(dpy, screen), + DefaultColormap(dpy, screen)); return drw; } @@ -96,11 +98,20 @@ void drw_resize(Drw *drw, unsigned int w, unsigned int h) { } drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen)); + if (drw->xftdraw) { + XftDrawDestroy(drw->xftdraw); + } + drw->xftdraw = XftDrawCreate(drw->dpy, drw->drawable, + DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen)); } void drw_free(Drw *drw) { XFreePixmap(drw->dpy, drw->drawable); XFreeGC(drw->dpy, drw->gc); + if (drw->xftdraw) { + XftDrawDestroy(drw->xftdraw); + } drw_fontset_free(drw->fonts); free(drw); } @@ -272,7 +283,6 @@ int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int ellipsis_w = 0; unsigned int ellipsis_len; - XftDraw *d = NULL; Fnt *usedfont; Fnt *curfont; Fnt *nextfont; @@ -316,9 +326,6 @@ int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); } - d = XftDrawCreate(drw->dpy, drw->drawable, - DefaultVisual(drw->dpy, drw->screen), - DefaultColormap(drw->dpy, drw->screen)); x += lpad; w -= lpad; } @@ -386,7 +393,8 @@ int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, if (utf8strlen) { if (render) { ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent; - XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg], + XftDrawStringUtf8(drw->xftdraw, + &drw->scheme[invert ? ColBg : ColFg], usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen); } @@ -457,9 +465,6 @@ int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, } } } - if (d) { - XftDrawDestroy(d); - } return x + (render ? w : 0); } diff --git a/drw.h b/drw.h index 971765c6..2bf738ec 100644 --- a/drw.h +++ b/drw.h @@ -35,6 +35,7 @@ typedef struct { GC gc; Clr *scheme; Fnt *fonts; + XftDraw *xftdraw; } Drw; /* Drawable abstraction */