[wiki] [sites] Center dmenu and allow height adjustment for better customization || elbachir-one

From: <git_AT_suckless.org>
Date: Sun, 16 Jun 2024 22:44:41 +0200

commit 5c92f82b2cfa18c2c4d2495c21e58e11784070d6
Author: elbachir-one <bachiralfa_AT_gmail.com>
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
_AT_@ -0,0 +1,119 @@
+From 36c3d68f185f47cbb754569775b7888728be4711 Mon Sep 17 00:00:00 2001
+From: elbachir-one <bachiralfa_AT_gmail.com>
+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
+_AT_@ -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
+_AT_@ -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
+_AT_@ -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)
+ {
+_AT_@ -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))) {
+_AT_@ -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
+_AT_@ -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 */
+_AT_@ -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
_AT_@ -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 <edvb_AT_uw.edu>
 * Nihal Jere <nihal_AT_nihaljere.xyz> (20200111)
+* El Bachir Kassimi <bachiralfa_AT_gmail.com> (20240616)
Received on Sun Jun 16 2024 - 22:44:41 CEST

This archive was generated by hypermail 2.3.0 : Sun Jun 16 2024 - 22:48:53 CEST