dmenu-dynamicoptions-20200526-01e2dfc7.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-dynamicoptions-20200526-01e2dfc7.diff (3809B)
       ---
            1 From 01e2dfc79126a7600463b4cf9fa16b4be6886cae Mon Sep 17 00:00:00 2001
            2 From: Tiago Teles <tiago.sequeira.teles@gmail.com>
            3 Date: Tue, 26 May 2020 19:55:55 +0100
            4 Subject: [PATCH] -dy flag for dynamic menu updating
            5 
            6 This patch adds a flag (`-dy`) which makes dmenu run the command given to it
            7 whenever input is changed with the current input as the last argument and
            8 update the option list according to the output of that command.
            9 ---
           10  config.def.h |  1 +
           11  dmenu.c      | 43 ++++++++++++++++++++++++++++++++++++-------
           12  2 files changed, 37 insertions(+), 7 deletions(-)
           13 
           14 diff --git a/config.def.h b/config.def.h
           15 index 1edb6477..035b8777 100644
           16 --- a/config.def.h
           17 +++ b/config.def.h
           18 @@ -7,6 +7,7 @@ static const char *fonts[] = {
           19          "monospace:size=10"
           20  };
           21  static const char *prompt      = NULL;      /* -p  option; prompt to the left of input field */
           22 +static const char *dynamic     = NULL;      /* -dy option; dynamic command to run on input change */
           23  static const char *colors[SchemeLast][2] = {
           24          /*     fg         bg       */
           25          [SchemeNorm] = { "#bbbbbb", "#222222" },
           26 diff --git a/dmenu.c b/dmenu.c
           27 index 6b8f51b5..356d4cc9 100644
           28 --- a/dmenu.c
           29 +++ b/dmenu.c
           30 @@ -210,9 +210,33 @@ grabkeyboard(void)
           31          die("cannot grab keyboard");
           32  }
           33  
           34 +static void readstdin(FILE* stream);
           35 +
           36 +static void
           37 +refreshoptions(){
           38 +        int dynlen = strlen(dynamic);
           39 +        char* cmd= malloc(dynlen + strlen(text)+2);
           40 +        if(cmd == NULL)
           41 +                die("malloc:");
           42 +        sprintf(cmd,"%s %s",dynamic, text);
           43 +        FILE *stream = popen(cmd, "r");
           44 +        if(!stream)
           45 +                die("popen(%s):",cmd);
           46 +        readstdin(stream);
           47 +        int pc = pclose(stream);
           48 +        if(pc == -1)
           49 +                die("pclose:");
           50 +        free(cmd);
           51 +        curr = sel = items;
           52 +}
           53 +
           54  static void
           55  match(void)
           56  {
           57 +        if(dynamic && *dynamic){
           58 +                refreshoptions();
           59 +        }
           60 +
           61          static char **tokv = NULL;
           62          static int tokn = 0;
           63  
           64 @@ -234,7 +258,7 @@ match(void)
           65                  for (i = 0; i < tokc; i++)
           66                          if (!fstrstr(item->text, tokv[i]))
           67                                  break;
           68 -                if (i != tokc) /* not all tokens match */
           69 +                if (i != tokc && !(dynamic && *dynamic)) /* not all tokens match */
           70                          continue;
           71                  /* exact matches go first, then prefixes, then substrings */
           72                  if (!tokc || !fstrncmp(text, item->text, textsize))
           73 @@ -519,14 +543,14 @@ paste(void)
           74  }
           75  
           76  static void
           77 -readstdin(void)
           78 +readstdin(FILE* stream)
           79  {
           80          char buf[sizeof text], *p;
           81          size_t i, imax = 0, size = 0;
           82          unsigned int tmpmax = 0;
           83  
           84          /* read each line from stdin and add it to the item list */
           85 -        for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
           86 +        for (i = 0; fgets(buf, sizeof buf, stream); i++) {
           87                  if (i + 1 >= size / sizeof *items)
           88                          if (!(items = realloc(items, (size += BUFSIZ))))
           89                                  die("cannot realloc %u bytes:", size);
           90 @@ -544,7 +568,8 @@ readstdin(void)
           91          if (items)
           92                  items[i].text = NULL;
           93          inputw = items ? TEXTW(items[imax].text) : 0;
           94 -        lines = MIN(lines, i);
           95 +        if (!dynamic || !*dynamic)
           96 +                lines = MIN(lines, i);
           97  }
           98  
           99  static void
          100 @@ -683,7 +708,7 @@ static void
          101  usage(void)
          102  {
          103          fputs("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
          104 -              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n", stderr);
          105 +              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]\n" "[-dy command]\n", stderr);
          106          exit(1);
          107  }
          108  
          109 @@ -726,6 +751,8 @@ main(int argc, char *argv[])
          110                          colors[SchemeSel][ColFg] = argv[++i];
          111                  else if (!strcmp(argv[i], "-w"))   /* embedding window id */
          112                          embed = argv[++i];
          113 +                else if (!strcmp(argv[i], "-dy"))  /* dynamic command to run */
          114 +                        dynamic = argv[++i];
          115                  else
          116                          usage();
          117  
          118 @@ -754,9 +781,11 @@ main(int argc, char *argv[])
          119  
          120          if (fast && !isatty(0)) {
          121                  grabkeyboard();
          122 -                readstdin();
          123 +                if(!(dynamic && *dynamic))
          124 +                        readstdin(stdin);
          125          } else {
          126 -                readstdin();
          127 +                if(!(dynamic && *dynamic))
          128 +                        readstdin(stdin);
          129                  grabkeyboard();
          130          }
          131          setup();
          132 -- 
          133 2.26.2
          134