URI: 
       introduce drw_fontset_getwidth_clamp() - dmenu - dynamic menu
  HTML git clone git://git.suckless.org/dmenu
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 6be057f060543bb0f3ed9423904263617cdffffe
   DIR parent 41fdabbf7c517f8d524b70cbd78238cc319ccef3
  HTML Author: NRK <nrk@disroot.org>
       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(-)
       ---
   DIR diff --git a/drw.c b/drw.c
       @@ -268,7 +268,7 @@ drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lp
                        return 0;
        
                if (!render) {
       -                w = ~w;
       +                w = invert ? invert : ~invert;
                } else {
                        XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
                        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 int h, unsigned int lp
        
                                                if (ew + tmpw > w) {
                                                        overflow = 1;
       -                                                utf8strlen = ellipsis_len;
       +                                                /* called from drw_fontset_getwidth_clamp():
       +                                                 * it wants the width AFTER the overflow
       +                                                 */
       +                                                if (!render)
       +                                                        x += tmpw;
       +                                                else
       +                                                        utf8strlen = ellipsis_len;
                                                } 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 *w, unsigned int *h)
        {
   DIR 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 int n);
        void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
        
        /* Colorscheme abstraction */