dmenu-noinputlinesbelowpromptfullwidth-5.2.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dmenu-noinputlinesbelowpromptfullwidth-5.2.diff (5287B)
       ---
            1 diff -up dmenu/config.def.h dmenu-noinputlinesbelowpromptfullwidth/config.def.h
            2 --- dmenu/config.def.h        2024-03-03 12:59:00.545293913 -0600
            3 +++ dmenu-noinputlinesbelowpromptfullwidth/config.def.h        2024-03-03 12:50:07.883388742 -0600
            4 @@ -2,6 +2,7 @@
            5  /* Default settings; can be overriden by command line. */
            6  
            7  static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
            8 +static int draw_input = 1;                  /* -noi option; if 0, the input will not be drawn by default */
            9  /* -fn option overrides fonts[0]; default X11 font or font set */
           10  static const char *fonts[] = {
           11          "monospace:size=10"
           12 diff -up dmenu/dmenu.c dmenu-noinputlinesbelowpromptfullwidth/dmenu.c
           13 --- dmenu/dmenu.c        2024-03-03 12:59:00.545293913 -0600
           14 +++ dmenu-noinputlinesbelowpromptfullwidth/dmenu.c        2024-03-03 15:06:12.469545907 -0600
           15 @@ -147,30 +147,32 @@ drawmenu(void)
           16  {
           17          unsigned int curpos;
           18          struct item *item;
           19 -        int x = 0, y = 0, w;
           20 +        int x = 0, y = 0, w = 0;
           21  
           22          drw_setscheme(drw, scheme[SchemeNorm]);
           23          drw_rect(drw, 0, 0, mw, mh, 1, 1);
           24  
           25          if (prompt && *prompt) {
           26                  drw_setscheme(drw, scheme[SchemeSel]);
           27 -                x = drw_text(drw, x, 0, promptw, bh, lrpad / 2, prompt, 0);
           28 +                x = drw_text(drw, x, 0, !draw_input ? mw : promptw, bh, lrpad / 2, prompt, 0);
           29          }
           30 -        /* draw input field */
           31 -        w = (lines > 0 || !matches) ? mw - x : inputw;
           32 -        drw_setscheme(drw, scheme[SchemeNorm]);
           33 -        drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
           34  
           35 -        curpos = TEXTW(text) - TEXTW(&text[cursor]);
           36 -        if ((curpos += lrpad / 2 - 1) < w) {
           37 +        if (draw_input) {
           38 +                w = (lines > 0 || !matches) ? mw - x : inputw;
           39                  drw_setscheme(drw, scheme[SchemeNorm]);
           40 -                drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
           41 +                drw_text(drw, x, 0, w, bh, lrpad / 2, text, 0);
           42 +
           43 +                curpos = TEXTW(text) - TEXTW(&text[cursor]);
           44 +                if ((curpos += lrpad / 2 - 1) < w) {
           45 +                        drw_setscheme(drw, scheme[SchemeNorm]);
           46 +                        drw_rect(drw, x + curpos, 2, 2, bh - 4, 1, 0);
           47 +                }
           48          }
           49  
           50          if (lines > 0) {
           51                  /* draw vertical list */
           52                  for (item = curr; item != next; item = item->right)
           53 -                        drawitem(item, x, y += bh, mw - x);
           54 +                        drawitem(item, (!draw_input && prompt && *prompt) ? x - mw : x - promptw, y += bh, mw);
           55          } else if (matches) {
           56                  /* draw horizontal list */
           57                  x += inputw;
           58 @@ -178,8 +180,8 @@ drawmenu(void)
           59                  if (curr->left) {
           60                          drw_setscheme(drw, scheme[SchemeNorm]);
           61                          drw_text(drw, x, 0, w, bh, lrpad / 2, "<", 0);
           62 +                        x += w;
           63                  }
           64 -                x += w;
           65                  for (item = curr; item != next; item = item->right)
           66                          x = drawitem(item, x, 0, textw_clamp(item->text, mw - x - TEXTW(">")));
           67                  if (next) {
           68 @@ -358,16 +360,19 @@ keypress(XKeyEvent *ev)
           69                  case XK_p: ksym = XK_Up;        break;
           70  
           71                  case XK_k: /* delete right */
           72 -                        text[cursor] = '\0';
           73 -                        match();
           74 +                        if (draw_input) {
           75 +                                text[cursor] = '\0';
           76 +                                match();
           77 +                        }
           78                          break;
           79                  case XK_u: /* delete left */
           80 -                        insert(NULL, 0 - cursor);
           81 +                        if (draw_input)
           82 +                                insert(NULL, 0 - cursor);
           83                          break;
           84                  case XK_w: /* delete word */
           85 -                        while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]))
           86 +                        while (cursor > 0 && strchr(worddelimiters, text[nextrune(-1)]) && draw_input)
           87                                  insert(NULL, nextrune(-1) - cursor);
           88 -                        while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
           89 +                        while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]) && draw_input)
           90                                  insert(NULL, nextrune(-1) - cursor);
           91                          break;
           92                  case XK_y: /* paste selection */
           93 @@ -414,23 +419,23 @@ keypress(XKeyEvent *ev)
           94          switch(ksym) {
           95          default:
           96  insert:
           97 -                if (!iscntrl((unsigned char)*buf))
           98 +                if (!iscntrl((unsigned char)*buf) && draw_input)
           99                          insert(buf, len);
          100                  break;
          101          case XK_Delete:
          102          case XK_KP_Delete:
          103 -                if (text[cursor] == '\0')
          104 +                if (text[cursor] == '\0' || !draw_input)
          105                          return;
          106                  cursor = nextrune(+1);
          107                  /* fallthrough */
          108          case XK_BackSpace:
          109 -                if (cursor == 0)
          110 +                if (cursor == 0 || !draw_input)
          111                          return;
          112                  insert(NULL, nextrune(-1) - cursor);
          113                  break;
          114          case XK_End:
          115          case XK_KP_End:
          116 -                if (text[cursor] != '\0') {
          117 +                if (text[cursor] != '\0' && draw_input) {
          118                          cursor = strlen(text);
          119                          break;
          120                  }
          121 @@ -514,7 +519,7 @@ insert:
          122                  }
          123                  break;
          124          case XK_Tab:
          125 -                if (!sel)
          126 +                if (!sel || !draw_input)
          127                          return;
          128                  cursor = strnlen(sel->text, sizeof text - 1);
          129                  memcpy(text, sel->text, cursor);
          130 @@ -677,7 +682,7 @@ setup(void)
          131                  mw = wa.width;
          132          }
          133          promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
          134 -        inputw = mw / 3; /* input width: ~33% of monitor width */
          135 +        inputw = !draw_input ? 0 : mw / 3; /* input width: ~33% of monitor width */
          136          match();
          137  
          138          /* create menu window */
          139 @@ -715,7 +720,7 @@ setup(void)
          140  static void
          141  usage(void)
          142  {
          143 -        die("usage: dmenu [-bfiv] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
          144 +        die("usage: dmenu [-bfiv] [-noi] [-l lines] [-p prompt] [-fn font] [-m monitor]\n"
          145              "             [-nb color] [-nf color] [-sb color] [-sf color] [-w windowid]");
          146  }
          147  
          148 @@ -734,6 +739,8 @@ main(int argc, char *argv[])
          149                          topbar = 0;
          150                  else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
          151                          fast = 1;
          152 +                else if (!strcmp(argv[i], "-noi")) /* no input field. intended to be used with a prompt */
          153 +                        draw_input = 0;
          154                  else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
          155                          fstrncmp = strncasecmp;
          156                          fstrstr = cistrstr;