Xinqi Bao's Git

patch: center
authorXinqi Bao <[email protected]>
Tue, 5 Apr 2022 09:32:36 +0000 (17:32 +0800)
committerXinqi Bao <[email protected]>
Tue, 5 Apr 2022 09:32:36 +0000 (17:32 +0800)
config.def.h
dmenu.1
dmenu.c
patches/dmenu-center-20200111-8cd37e1.diff [new file with mode: 0644]

index 1edb647..295b348 100644 (file)
@@ -2,6 +2,8 @@
 /* Default settings; can be overriden by command line. */
 
 static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
+static int centered = 1;                    /* -c option; centers dmenu on screen */
+static int min_width = 500;                    /* minimum width when centered */
 /* -fn option overrides fonts[0]; default X11 font or font set */
 static const char *fonts[] = {
        "monospace:size=10"
@@ -14,7 +16,7 @@ static const char *colors[SchemeLast][2] = {
        [SchemeOut] = { "#000000", "#00ffff" },
 };
 /* -l option; if nonzero, dmenu uses vertical list with given number of lines */
-static unsigned int lines      = 0;
+static unsigned int lines      = 10;
 
 /*
  * Characters not considered part of a word while deleting words
diff --git a/dmenu.1 b/dmenu.1
index 323f93c..c036baa 100644 (file)
--- a/dmenu.1
+++ b/dmenu.1
@@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL.
 .B \-b
 dmenu appears at the bottom of the screen.
 .TP
+.B \-c
+dmenu appears centered on the screen.
+.TP
 .B \-f
 dmenu grabs the keyboard before reading stdin if not reading from a tty. This
 is faster, but will lock up X until stdin reaches end\-of\-file.
diff --git a/dmenu.c b/dmenu.c
index 839f6cc..35ce141 100644 (file)
--- a/dmenu.c
+++ b/dmenu.c
@@ -96,6 +96,15 @@ calcoffsets(void)
                        break;
 }
 
+static int
+max_textw(void)
+{
+       int len = 0;
+       for (struct item *item = items; item && item->text; item++)
+               len = MAX(TEXTW(item->text), len);
+       return len;
+}
+
 static void
 cleanup(void)
 {
@@ -633,6 +642,7 @@ setup(void)
        bh = drw->fonts->h + 2;
        lines = MAX(lines, 0);
        mh = (lines + 1) * bh;
+       promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
 #ifdef XINERAMA
        i = 0;
        if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
@@ -659,9 +669,16 @@ setup(void)
                                if (INTERSECT(x, y, 1, 1, info[i]) != 0)
                                        break;
 
-               x = info[i].x_org;
-               y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
-               mw = info[i].width;
+               if (centered) {
+                       mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width);
+                       x = info[i].x_org + ((info[i].width  - mw) / 2);
+                       y = info[i].y_org + ((info[i].height - mh) / 2);
+               } else {
+                       x = info[i].x_org;
+                       y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
+                       mw = info[i].width;
+               }
+
                XFree(info);
        } else
 #endif
@@ -669,11 +686,17 @@ setup(void)
                if (!XGetWindowAttributes(dpy, parentwin, &wa))
                        die("could not get embedding window attributes: 0x%lx",
                            parentwin);
-               x = 0;
-               y = topbar ? 0 : wa.height - mh;
-               mw = wa.width;
+
+               if (centered) {
+                       mw = MIN(MAX(max_textw() + promptw, min_width), wa.width);
+                       x = (wa.width  - mw) / 2;
+                       y = (wa.height - mh) / 2;
+               } else {
+                       x = 0;
+                       y = topbar ? 0 : wa.height - mh;
+                       mw = wa.width;
+               }
        }
-       promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
        for (item = items; item && item->text; ++item) {
                if ((tmp = textw_clamp(item->text, mw/3)) > inputw) {
                        if ((inputw = tmp) == mw/3)
@@ -736,6 +759,8 @@ main(int argc, char *argv[])
                        topbar = 0;
                else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
                        fast = 1;
+               else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */
+                       centered = 1;
                else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
                        fstrncmp = strncasecmp;
                        fstrstr = cistrstr;
diff --git a/patches/dmenu-center-20200111-8cd37e1.diff b/patches/dmenu-center-20200111-8cd37e1.diff
new file mode 100644 (file)
index 0000000..af249a6
--- /dev/null
@@ -0,0 +1,120 @@
+From 8cd37e1ab9e7cb025224aeb3543f1a5be8bceb93 Mon Sep 17 00:00:00 2001
+From: Nihal Jere <[email protected]>
+Date: Sat, 11 Jan 2020 21:16:08 -0600
+Subject: [PATCH] center patch now has adjustable minimum width
+
+---
+ config.def.h |  2 ++
+ dmenu.1      |  3 +++
+ dmenu.c      | 39 ++++++++++++++++++++++++++++++++-------
+ 3 files changed, 37 insertions(+), 7 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 1edb647..88ef264 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -2,6 +2,8 @@
+ /* Default settings; can be overriden by command line. */
+ static int topbar = 1;                      /* -b  option; if 0, dmenu appears at bottom     */
++static int centered = 0;                    /* -c option; centers dmenu on screen */
++static int min_width = 500;                    /* minimum width when centered */
+ /* -fn option overrides fonts[0]; default X11 font or font set */
+ static const char *fonts[] = {
+       "monospace:size=10"
+diff --git a/dmenu.1 b/dmenu.1
+index 323f93c..c036baa 100644
+--- a/dmenu.1
++++ b/dmenu.1
+@@ -40,6 +40,9 @@ which lists programs in the user's $PATH and runs the result in their $SHELL.
+ .B \-b
+ dmenu appears at the bottom of the screen.
+ .TP
++.B \-c
++dmenu appears centered on the screen.
++.TP
+ .B \-f
+ dmenu grabs the keyboard before reading stdin if not reading from a tty. This
+ is faster, but will lock up X until stdin reaches end\-of\-file.
+diff --git a/dmenu.c b/dmenu.c
+index 65f25ce..041c7f8 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -89,6 +89,15 @@ calcoffsets(void)
+                       break;
+ }
++static int
++max_textw(void)
++{
++      int len = 0;
++      for (struct item *item = items; item && item->text; item++)
++              len = MAX(TEXTW(item->text), len);
++      return len;
++}
++
+ static void
+ cleanup(void)
+ {
+@@ -611,6 +620,7 @@ setup(void)
+       bh = drw->fonts->h + 2;
+       lines = MAX(lines, 0);
+       mh = (lines + 1) * bh;
++      promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
+ #ifdef XINERAMA
+       i = 0;
+       if (parentwin == root && (info = XineramaQueryScreens(dpy, &n))) {
+@@ -637,9 +647,16 @@ setup(void)
+                               if (INTERSECT(x, y, 1, 1, info[i]))
+                                       break;
+-              x = info[i].x_org;
+-              y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
+-              mw = info[i].width;
++              if (centered) {
++                      mw = MIN(MAX(max_textw() + promptw, min_width), info[i].width);
++                      x = info[i].x_org + ((info[i].width  - mw) / 2);
++                      y = info[i].y_org + ((info[i].height - mh) / 2);
++              } else {
++                      x = info[i].x_org;
++                      y = info[i].y_org + (topbar ? 0 : info[i].height - mh);
++                      mw = info[i].width;
++              }
++
+               XFree(info);
+       } else
+ #endif
+@@ -647,11 +664,17 @@ setup(void)
+               if (!XGetWindowAttributes(dpy, parentwin, &wa))
+                       die("could not get embedding window attributes: 0x%lx",
+                           parentwin);
+-              x = 0;
+-              y = topbar ? 0 : wa.height - mh;
+-              mw = wa.width;
++
++              if (centered) {
++                      mw = MIN(MAX(max_textw() + promptw, min_width), wa.width);
++                      x = (wa.width  - mw) / 2;
++                      y = (wa.height - mh) / 2;
++              } else {
++                      x = 0;
++                      y = topbar ? 0 : wa.height - mh;
++                      mw = wa.width;
++              }
+       }
+-      promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
+       inputw = MIN(inputw, mw/3);
+       match();
+@@ -709,6 +732,8 @@ main(int argc, char *argv[])
+                       topbar = 0;
+               else if (!strcmp(argv[i], "-f"))   /* grabs keyboard before reading stdin */
+                       fast = 1;
++              else if (!strcmp(argv[i], "-c"))   /* centers dmenu on screen */
++                      centered = 1;
+               else if (!strcmp(argv[i], "-i")) { /* case-insensitive item matching */
+                       fstrncmp = strncasecmp;
+                       fstrstr = cistrstr;
+-- 
+2.24.1
+