dmenu-tmenu-20240811-475d809.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-tmenu-20240811-475d809.diff (3229B)
       ---
            1 From a90fe0dcad642e4c314d08a86f0848c7c5bc87cb Mon Sep 17 00:00:00 2001
            2 From: Robert Bilski <robert@rbilski.com>
            3 Date: Sun, 11 Aug 2024 16:27:58 +0200
            4 Subject: [PATCH] Update tmenu patch
            5 
            6 ---
            7  config.def.h |  3 +++
            8  dmenu.1      |  3 +++
            9  dmenu.c      | 25 +++++++++++++++++++------
           10  3 files changed, 25 insertions(+), 6 deletions(-)
           11 
           12 diff --git a/config.def.h b/config.def.h
           13 index 1edb647..805d8c4 100644
           14 --- a/config.def.h
           15 +++ b/config.def.h
           16 @@ -21,3 +21,6 @@ static unsigned int lines      = 0;
           17   * for example: " /?\"&[]"
           18   */
           19  static const char worddelimiters[] = " ";
           20 +
           21 +/* delimiter for tmenu */
           22 +static char valuedelimiter = '\t';
           23 diff --git a/dmenu.1 b/dmenu.1
           24 index 323f93c..fb22ed3 100644
           25 --- a/dmenu.1
           26 +++ b/dmenu.1
           27 @@ -47,6 +47,9 @@ is faster, but will lock up X until stdin reaches end\-of\-file.
           28  .B \-i
           29  dmenu matches menu items case insensitively.
           30  .TP
           31 +.BI \-d " tmenu delimiter"
           32 +when used in a line, the value after the delimiter will be displayed. When selected, the value before the delimiter will be output. Only uses a single char as the delimiter.
           33 +.TP
           34  .BI \-l " lines"
           35  dmenu lists items vertically, with the given number of lines.
           36  .TP
           37 diff --git a/dmenu.c b/dmenu.c
           38 index 40f93e0..a456425 100644
           39 --- a/dmenu.c
           40 +++ b/dmenu.c
           41 @@ -28,7 +28,7 @@
           42  enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* color schemes */
           43  
           44  struct item {
           45 -        char *text;
           46 +        char *text, *value;
           47          struct item *left, *right;
           48          int out;
           49  };
           50 @@ -103,8 +103,8 @@ cleanup(void)
           51          XUngrabKey(dpy, AnyKey, AnyModifier, root);
           52          for (i = 0; i < SchemeLast; i++)
           53                  free(scheme[i]);
           54 -        for (i = 0; items && items[i].text; ++i)
           55 -                free(items[i].text);
           56 +        for (i = 0; items && items[i].value; ++i)
           57 +                free(items[i].value);
           58          free(items);
           59          drw_free(drw);
           60          XSync(dpy, False);
           61 @@ -489,7 +489,7 @@ insert:
           62                  break;
           63          case XK_Return:
           64          case XK_KP_Enter:
           65 -                puts((sel && !(ev->state & ShiftMask)) ? sel->text : text);
           66 +                puts((sel && !(ev->state & ShiftMask)) ? sel->value : text);
           67                  if (!(ev->state & ControlMask)) {
           68                          cleanup();
           69                          exit(0);
           70 @@ -564,11 +564,22 @@ readstdin(void)
           71                  if (!(items[i].text = strdup(line)))
           72                          die("strdup:");
           73  
           74 +                if (!(items[i].value = strdup(line)))
           75 +                        die("strdup:");
           76 +
           77 +                if ((items[i].text = strchr(items[i].value, valuedelimiter))) {
           78 +                        items[i].text[0] = '\0';
           79 +                        items[i].text++;
           80 +                } else {
           81 +                        items[i].text = items[i].value;
           82 +                }
           83                  items[i].out = 0;
           84          }
           85          free(line);
           86 -        if (items)
           87 +        if (items) {
           88                  items[i].text = NULL;
           89 +                items[i].value = NULL;
           90 +        }
           91          lines = MIN(lines, i);
           92  }
           93  
           94 @@ -715,7 +726,7 @@ setup(void)
           95  static void
           96  usage(void)
           97  {
           98 -        die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
           99 +        die("usage: dmenu [-bfiv] [-d tmenu-delim] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
          100              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
          101  }
          102  
          103 @@ -740,6 +751,8 @@ main(int argc, char *argv[])
          104                  } else if (i + 1 == argc)
          105                          usage();
          106                  /* these options take one argument */
          107 +                else if (!strcmp(argv[i], "-d"))   /* delimiter for tmenu */
          108 +                        valuedelimiter = argv[++i][0];
          109                  else if (!strcmp(argv[i], "-l"))   /* number of lines in vertical list */
          110                          lines = atoi(argv[++i]);
          111                  else if (!strcmp(argv[i], "-m"))
          112 -- 
          113 2.46.0
          114