commit fc497bdafc0a692bd7f19018aee7a2b4cda1a0f1
Author: Ed van Bruggen <[email protected]>
Date:   Sat Mar 17 17:11:13 2018 -0700

    [dmenu] Add center patch

diff --git a/tools.suckless.org/dmenu/patches/center.md 
b/tools.suckless.org/dmenu/patches/center.md
new file mode 100644
index 00000000..39729547
--- /dev/null
+++ b/tools.suckless.org/dmenu/patches/center.md
@@ -0,0 +1,25 @@
+center
+======
+
+Description
+-----------
+
+This patch centers dmenu in the middle of the screen.
+
+Previously this has been achieved through the [xyw patch][1] and a bash script
+to calculate the centered x and y positions. However, this is a slow and overly
+complex way which is hard to integrate into programs which call dmenu directly,
+eg surf or tabbed. On the other hand, This small standalone patch is
+instantaneous and works globally.
+
+[1]: https://tools.suckless.org/dmenu/patches/xyw
+
+Download
+--------
+
+* [dmenu-center-4.8.diff](dmenu-center-4.8.diff)
+
+Authors
+-------
+
+* Ed van Bruggen <[email protected]>
diff --git a/tools.suckless.org/dmenu/patches/dmenu-center-4.8.diff 
b/tools.suckless.org/dmenu/patches/dmenu-center-4.8.diff
new file mode 100644
index 00000000..a970fcb5
--- /dev/null
+++ b/tools.suckless.org/dmenu/patches/dmenu-center-4.8.diff
@@ -0,0 +1,56 @@
+diff --git a/dmenu.c b/dmenu.c
+index 5e9c367..2268ea9 100644
+--- a/dmenu.c
++++ b/dmenu.c
+@@ -88,6 +88,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)
+ {
+@@ -598,6 +607,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))) {
+@@ -624,9 +634,9 @@ 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;
++              mw = MIN(MAX(max_textw() + promptw, 100), info[i].width);
++              x = info[i].x_org + ((info[i].width  - mw) / 2);
++              y = info[i].y_org + ((info[i].height - mh) / 2);
+               XFree(info);
+       } else
+ #endif
+@@ -634,11 +644,10 @@ 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;
++              mw = MIN(MAX(max_textw() + promptw, 100), wa.width);
++              x = (wa.width  - mw) / 2;
++              y = (wa.height - mh) / 2;
+       }
+-      promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
+       inputw = MIN(inputw, mw/3);
+       match();
+ 


Reply via email to