commit 5c92f82b2cfa18c2c4d2495c21e58e11784070d6
Author: elbachir-one <[email protected]>
Date:   Sun Jun 16 21:44:05 2024 +0100

    Center dmenu and allow height adjustment for better customization

diff --git 
a/tools.suckless.org/dmenu/patches/center/dmenu-center-20240616-36c3d68.diff 
b/tools.suckless.org/dmenu/patches/center/dmenu-center-20240616-36c3d68.diff
new file mode 100644
index 00000000..e248fed7
--- /dev/null
+++ b/tools.suckless.org/dmenu/patches/center/dmenu-center-20240616-36c3d68.diff
@@ -0,0 +1,119 @@
+From 36c3d68f185f47cbb754569775b7888728be4711 Mon Sep 17 00:00:00 2001
+From: elbachir-one <[email protected]>
+Date: Sun, 16 Jun 2024 21:28:41 +0100
+Subject: [PATCH] Adding an option to change the height as well
+
+---
+ config.def.h |  3 +++
+ dmenu.1      |  3 +++
+ dmenu.c      | 38 ++++++++++++++++++++++++++++++++------
+ 3 files changed, 38 insertions(+), 6 deletions(-)
+
+diff --git a/config.def.h b/config.def.h
+index 1edb647..832896f 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -2,6 +2,9 @@
+ /* 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 
*/
++static const float menu_height_ratio = 4.0f;  /* This is the ratio used in 
the original calculation */
+ /* -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 40f93e0..32d6a9d 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -95,6 +95,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)
+ {
+@@ -636,6 +645,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))) {
+@@ -662,9 +672,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) / 
menu_height_ratio);
++              } 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
+@@ -672,9 +689,16 @@ 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 = mw / 3; /* input width: ~33% of monitor width */
+@@ -734,6 +758,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.45.2
+
diff --git a/tools.suckless.org/dmenu/patches/center/index.md 
b/tools.suckless.org/dmenu/patches/center/index.md
index 2d1d9b99..7918ac7d 100644
--- a/tools.suckless.org/dmenu/patches/center/index.md
+++ b/tools.suckless.org/dmenu/patches/center/index.md
@@ -14,13 +14,18 @@ works globally.
 
 With `dmenu-center-20200111-8cd37e1.diff`, you can use _-c_ to center dmenu.
 
+With `dmenu-center-20240616-36c3d68.diff`, you can not only center dmenu
+but also adjust its height.
+
 Download
 --------
 * [dmenu-center-4.8.diff](dmenu-center-4.8.diff)
 * [dmenu-center-20200111-8cd37e1.diff](dmenu-center-20200111-8cd37e1.diff)
 * [dmenu-center-5.2.diff](dmenu-center-5.2.diff)
+* [dmenu-center-20240616-36c3d68.diff](dmenu-center-20240616-36c3d68.diff)
 
 Authors
 -------
 * Ed van Bruggen <[email protected]>
 * Nihal Jere <[email protected]> (20200111)
+* El Bachir Kassimi <[email protected]> (20240616)


Reply via email to