introduce drw_fontset_getwidth_clamp() - dmenu - my customized version of dmenu… | |
git clone git://git.codemadness.org/dmenu | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 6be057f060543bb0f3ed9423904263617cdffffe | |
parent 41fdabbf7c517f8d524b70cbd78238cc319ccef3 | |
Author: NRK <[email protected]> | |
Date: Thu, 24 Mar 2022 02:00:00 +0600 | |
introduce drw_fontset_getwidth_clamp() | |
getting the width of a string is an O(n) operation, and in many cases | |
users only care about getting the width upto a certain number. | |
instead of calling drw_fontset_getwidth() and *then* clamping the | |
result, this patch introduces drw_fontset_getwidth_clamp() function, | |
similar to strnlen(), which will stop once we reach n. | |
the `invert` parameter was overloaded internally to preserve the API, | |
however library users should be calling drw_fontset_getwidth_clamp() and | |
not depend upon internal behavior of drw_text(). | |
Diffstat: | |
M drw.c | 19 +++++++++++++++++-- | |
M drw.h | 1 + | |
2 files changed, 18 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/drw.c b/drw.c | |
@@ -268,7 +268,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned i… | |
return 0; | |
if (!render) { | |
- w = ~w; | |
+ w = invert ? invert : ~invert; | |
} else { | |
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg :… | |
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h); | |
@@ -300,7 +300,13 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned … | |
if (ew + tmpw > w) { | |
overflow = 1; | |
- utf8strlen = ellipsis_len; | |
+ /* called from drw_fontset_get… | |
+ * it wants the width AFTER th… | |
+ */ | |
+ if (!render) | |
+ x += tmpw; | |
+ else | |
+ utf8strlen = ellipsis_… | |
} else if (curfont == usedfont) { | |
utf8strlen += utf8charlen; | |
text += utf8charlen; | |
@@ -397,6 +403,15 @@ drw_fontset_getwidth(Drw *drw, const char *text) | |
return drw_text(drw, 0, 0, 0, 0, 0, text, 0); | |
} | |
+unsigned int | |
+drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n) | |
+{ | |
+ unsigned int tmp = 0; | |
+ if (drw && drw->fonts && text && n) | |
+ tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n); | |
+ return MIN(n, tmp); | |
+} | |
+ | |
void | |
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *… | |
{ | |
diff --git a/drw.h b/drw.h | |
@@ -35,6 +35,7 @@ void drw_free(Drw *drw); | |
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount); | |
void drw_fontset_free(Fnt* set); | |
unsigned int drw_fontset_getwidth(Drw *drw, const char *text); | |
+unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned i… | |
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned … | |
/* Colorscheme abstraction */ |