dmenu-numbers-20220512-28fb3e2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-numbers-20220512-28fb3e2.diff (2804B)
       ---
            1 From c4cd209c2e322563750d09a3b64194d11cc12a10 Mon Sep 17 00:00:00 2001
            2 From: Ehsan Ghorbannezhad <ehsan@disroot.org>
            3 Date: Thu, 12 May 2022 22:32:47 +0430
            4 Subject: [PATCH] the numbers patch, updated to fix segfault in some conditions
            5 
            6 ---
            7  dmenu.c | 27 ++++++++++++++++++++++++---
            8  1 file changed, 24 insertions(+), 3 deletions(-)
            9 
           10 diff --git a/dmenu.c b/dmenu.c
           11 index 571bc35..70004e7 100644
           12 --- a/dmenu.c
           13 +++ b/dmenu.c
           14 @@ -24,6 +24,8 @@
           15                               * MAX(0, MIN((y)+(h),(r).y_org+(r).height) - MAX((y),(r).y_org)))
           16  #define LENGTH(X)             (sizeof X / sizeof X[0])
           17  #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
           18 +#define NUMBERSMAXDIGITS      100
           19 +#define NUMBERSBUFSIZE        (NUMBERSMAXDIGITS * 2) + 1
           20 
           21  /* enums */
           22  enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
           23 @@ -34,6 +36,7 @@ struct item {
           24          int out;
           25  };
           26 
           27 +static char numbers[NUMBERSBUFSIZE] = "";
           28  static char text[BUFSIZ] = "";
           29  static char *embed;
           30  static int bh, mw, mh;
           31 @@ -86,7 +89,7 @@ calcoffsets(void)
           32          if (lines > 0)
           33                  n = lines * bh;
           34          else
           35 -                n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">"));
           36 +                n = mw - (promptw + inputw + TEXTW("<") + TEXTW(">") + TEXTW(numbers));
           37          /* calculate which items will begin the next page and previous page */
           38          for (i = 0, next = curr; next; next = next->right)
           39                  if ((i += (lines > 0) ? bh : textw_clamp(next->text, n)) > n)
           40 @@ -143,6 +146,21 @@ drawitem(struct item *item, int x, int y, int w)
           41          return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
           42  }
           43 
           44 +static void
           45 +recalculatenumbers()
           46 +{
           47 +        unsigned int numer = 0, denom = 0;
           48 +        struct item *item;
           49 +        if (matchend) {
           50 +                numer++;
           51 +                for (item = matchend; item && item->left; item = item->left)
           52 +                        numer++;
           53 +        }
           54 +        for (item = items; item && item->text; item++)
           55 +                denom++;
           56 +        snprintf(numbers, NUMBERSBUFSIZE, "%d/%d", numer, denom);
           57 +}
           58 +
           59  static void
           60  drawmenu(void)
           61  {
           62 @@ -168,6 +186,7 @@ drawmenu(void)
           63                  drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
           64          }
           65 
           66 +        recalculatenumbers();
           67          if (lines > 0) {
           68                  /* draw vertical list */
           69                  for (item = curr; item != next; item = item->right)
           70 @@ -182,13 +201,15 @@ drawmenu(void)
           71                  }
           72                  x += w;
           73                  for (item = curr; item != next; item = item->right)
           74 -                        x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">")));
           75 +                        x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">") - TEXTW(numbers)));
           76                  if (next) {
           77                          w = TEXTW(">");
           78                          drw_setscheme(drw, scheme[SchemeNorm]);
           79 -                        drw_text(drw, mw - w, 0, w, bh, lrpad / 2, ">", 0);
           80 +                        drw_text(drw, mw - w - TEXTW(numbers), 0, w, bh, lrpad / 2, ">", 0);
           81                  }
           82          }
           83 +        drw_setscheme(drw, scheme[SchemeNorm]);
           84 +        drw_text(drw, mw - TEXTW(numbers), 0, TEXTW(numbers), bh, lrpad / 2, numbers, 0);
           85          drw_map(drw, win, 0, 0, mw, mh);
           86  }
           87 
           88 --
           89 2.36.1