dmenu-fuzzyhighlight-caseinsensitive-4.9.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-fuzzyhighlight-caseinsensitive-4.9.diff (4647B)
       ---
            1 From 2de2780bef245ae44d677abd20c589160f0d984b Mon Sep 17 00:00:00 2001
            2 From: Oleh Kopeykin <olehkopeykin@yandex.by>
            3 Date: Sun, 5 Feb 2023 01:15:35 +0300
            4 Subject: [PATCH] Adds the fuzzyhighlight patch
            5 
            6 ---
            7  config.def.h |  2 ++
            8  dmenu.1      | 20 ++++++++++++++++++
            9  dmenu.c      | 57 +++++++++++++++++++++++++++++++++++++++++++++++++---
           10  3 files changed, 76 insertions(+), 3 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 51612b9..0103bda 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -12,6 +12,8 @@ static const char *colors[SchemeLast][2] = {
           17          /*     fg         bg       */
           18          [SchemeNorm] = { "#bbbbbb", "#222222" },
           19          [SchemeSel] = { "#eeeeee", "#005577" },
           20 +        [SchemeSelHighlight] = { "#ffc978", "#005577" },
           21 +        [SchemeNormHighlight] = { "#ffc978", "#222222" },
           22          [SchemeOut] = { "#000000", "#00ffff" },
           23  };
           24  /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
           25 diff --git a/dmenu.1 b/dmenu.1
           26 index 323f93c..472b179 100644
           27 --- a/dmenu.1
           28 +++ b/dmenu.1
           29 @@ -20,6 +20,14 @@ dmenu \- dynamic menu
           30  .IR color ]
           31  .RB [ \-sf
           32  .IR color ]
           33 +.RB [ \-nhb
           34 +.IR color ]
           35 +.RB [ \-nhf
           36 +.IR color ]
           37 +.RB [ \-shb
           38 +.IR color ]
           39 +.RB [ \-shf
           40 +.IR color ]
           41  .RB [ \-w
           42  .IR windowid ]
           43  .P
           44 @@ -75,6 +83,18 @@ defines the selected background color.
           45  .BI \-sf " color"
           46  defines the selected foreground color.
           47  .TP
           48 +.BI \-nhb " color"
           49 +defines the normal highlight background color.
           50 +.TP
           51 +.BI \-nhf " color"
           52 +defines the normal highlight foreground color.
           53 +.TP
           54 +.BI \-shb " color"
           55 +defines the selected highlight background color.
           56 +.TP
           57 +.BI \-shf " color"
           58 +defines the selected highlight foreground color.
           59 +.TP
           60  .B \-v
           61  prints version information to stdout, then exits.
           62  .TP
           63 diff --git a/dmenu.c b/dmenu.c
           64 index 96ddc98..442d707 100644
           65 --- a/dmenu.c
           66 +++ b/dmenu.c
           67 @@ -27,7 +27,9 @@
           68  #define TEXTW(X)              (drw_fontset_getwidth(drw, (X)) + lrpad)
           69  
           70  /* enums */
           71 -enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
           72 +enum { SchemeNorm, SchemeSel, SchemeNormHighlight, SchemeSelHighlight,
           73 +       SchemeOut, SchemeLast }; /* color schemes */
           74 +
           75  
           76  struct item {
           77          char *text;
           78 @@ -115,9 +117,47 @@ cistrstr(const char *s, const char *sub)
           79          return NULL;
           80  }
           81  
           82 +static void
           83 +drawhighlights(struct item *item, int x, int y, int maxw)
           84 +{
           85 +        int i, indent;
           86 +        char *highlight;
           87 +        char c;
           88 +
           89 +        if (!(strlen(item->text) && strlen(text)))
           90 +                return;
           91 +
           92 +        drw_setscheme(drw, scheme[item == sel
           93 +                           ? SchemeSelHighlight
           94 +                           : SchemeNormHighlight]);
           95 +        for (i = 0, highlight = item->text; *highlight && text[i];) {
           96 +                if (!fstrncmp(&text[i], highlight, 1)) {
           97 +                        c = highlight[1];
           98 +                        highlight[1] = '\0';
           99 +
          100 +                        /* get indentation */
          101 +                        indent = TEXTW(item->text);
          102 +
          103 +                        /* highlight character */
          104 +                        drw_text(
          105 +                                drw,
          106 +                                x + indent - lrpad,
          107 +                                y,
          108 +                                MIN(maxw - indent, TEXTW(highlight) - lrpad),
          109 +                                bh, 0, highlight, 0
          110 +                        );
          111 +                        highlight[1] = c;
          112 +                        i++;
          113 +                }
          114 +                highlight++;
          115 +        }
          116 +}
          117 +
          118 +
          119  static int
          120  drawitem(struct item *item, int x, int y, int w)
          121  {
          122 +        int r;
          123          if (item == sel)
          124                  drw_setscheme(drw, scheme[SchemeSel]);
          125          else if (item->out)
          126 @@ -125,7 +165,9 @@ drawitem(struct item *item, int x, int y, int w)
          127          else
          128                  drw_setscheme(drw, scheme[SchemeNorm]);
          129  
          130 -        return drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
          131 +        r = drw_text(drw, x, y, w, bh, lrpad / 2, item->text, 0);
          132 +        drawhighlights(item, x, y, w);
          133 +        return r;
          134  }
          135  
          136  static void
          137 @@ -770,7 +812,8 @@ static void
          138  usage(void)
          139  {
          140          fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
          141 -              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
          142 +              "             [-nb color] [-nf color] [-sb color] [-sf color]\n"
          143 +              "             [-nhb color] [-nhf color] [-shb color] [-shf color] [-w windowid]\n", stderr);
          144          exit(1);
          145  }
          146  
          147 @@ -813,6 +856,14 @@ main(int argc, char *argv[])
          148                          colors[SchemeSel][ColBg] = argv[++i];
          149                  else if (!strcmp(argv[i], "-sf"))  /* selected foreground color */
          150                          colors[SchemeSel][ColFg] = argv[++i];
          151 +                else if (!strcmp(argv[i], "-nhb")) /* normal hi background color */
          152 +                        colors[SchemeNormHighlight][ColBg] = argv[++i];
          153 +                else if (!strcmp(argv[i], "-nhf")) /* normal hi foreground color */
          154 +                        colors[SchemeNormHighlight][ColFg] = argv[++i];
          155 +                else if (!strcmp(argv[i], "-shb")) /* selected hi background color */
          156 +                        colors[SchemeSelHighlight][ColBg] = argv[++i];
          157 +                else if (!strcmp(argv[i], "-shf")) /* selected hi foreground color */
          158 +                        colors[SchemeSelHighlight][ColFg] = argv[++i];
          159                  else if (!strcmp(argv[i], "-w"))   /* embedding window id */
          160                          embed = argv[++i];
          161                  else
          162 -- 
          163 2.39.1
          164