dmenu-center-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-center-5.2.diff (3133B)
       ---
            1 diff --git a/config.def.h b/config.def.h
            2 index 1edb647..88ef264 100644
            3 --- a/config.def.h
            4 +++ b/config.def.h
            5 @@ -2,6 +2,8 @@
            6  /* Default settings; can be overriden by command line. */
            7  
            8  static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
            9 +static int centered = 0;                    /* -c option; centers dmenu on screen */
           10 +static int min_width = 500;                    /* minimum width when centered */
           11  /* -fn option overrides fonts[0]; default X11 font or font set */
           12  static const char *fonts[] = {
           13          "monospace:size=10"
           14 diff --git a/dmenu.1 b/dmenu.1
           15 index 323f93c..c036baa 100644
           16 --- a/dmenu.1
           17 +++ b/dmenu.1
           18 @@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL.
           19  .B \-b
           20  dmenu appears at the bottom of the screen.
           21  .TP
           22 +.B \-c
           23 +dmenu appears centered on the screen.
           24 +.TP
           25  .B \-f
           26  dmenu grabs the keyboard before reading stdin if not reading from a tty. This
           27  is faster, but will lock up X until stdin reaches end\-of\-file.
           28 diff --git a/dmenu.c b/dmenu.c
           29 index 27b7a30..427fb04 100644
           30 --- a/dmenu.c
           31 +++ b/dmenu.c
           32 @@ -96,6 +96,15 @@ calcoffsets(void)
           33                          break;
           34  }
           35  
           36 +static int
           37 +max_textw(void)
           38 +{
           39 +        int len = 0;
           40 +        for (struct item *item = items; item && item->text; item++)
           41 +                len = MAX(TEXTW(item->text), len);
           42 +        return len;
           43 +}
           44 +
           45  static void
           46  cleanup(void)
           47  {
           48 @@ -636,6 +645,7 @@ setup(void)
           49          bh = drw->fonts->h + 2;
           50          lines = MAX(lines, 0);
           51          mh = (lines + 1) * bh;
           52 +        promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
           53  #ifdef XINERAMA
           54          i = 0;
           55          if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
           56 @@ -662,9 +672,16 @@ setup(void)
           57                                  if (INTERSECT(x, y, 1, 1, info[i]) != 0)
           58                                          break;
           59  
           60 -                x = info[i].x_org;
           61 -                y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
           62 -                mw = info[i].width;
           63 +                if (centered) {
           64 +                        mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width);
           65 +                        x = info[i].x_org + ((info[i].width  - mw) / 2);
           66 +                        y = info[i].y_org + ((info[i].height - mh) / 2);
           67 +                } else {
           68 +                        x = info[i].x_org;
           69 +                        y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
           70 +                        mw = info[i].width;
           71 +                }
           72 +
           73                  XFree(info);
           74          } else
           75  #endif
           76 @@ -672,9 +689,16 @@ setup(void)
           77                  if (!XGetWindowAttributes(dpy, parentwin, &wa))
           78                          die("could not get embedding window attributes: 0x%lx",
           79                              parentwin);
           80 -                x = 0;
           81 -                y = topbar ? 0 : wa.height - mh;
           82 -                mw = wa.width;
           83 +
           84 +                if (centered) {
           85 +                        mw = MIN(MAX(max_textw() + promptw, min_width), wa.width);
           86 +                        x = (wa.width  - mw) / 2;
           87 +                        y = (wa.height - mh) / 2;
           88 +                } else {
           89 +                        x = 0;
           90 +                        y = topbar ? 0 : wa.height - mh;
           91 +                        mw = wa.width;
           92 +                }
           93          }
           94          promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
           95          inputw = mw / 3; /* input width: ~33% of monitor width */
           96 @@ -733,6 +757,8 @@ main(int argc, char *argv[])
           97                          topbar = 0;
           98                  else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
           99                          fast = 1;
          100 +                else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */
          101 +                        centered = 1;
          102                  else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
          103                          fstrncmp = strncasecmp;
          104                          fstrstr = cistrstr;