sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit fc497bdafc0a692bd7f19018aee7a2b4cda1a0f1
parent b772d2a180cef8653af4f9cc303dd69b93f02a81
Author: Ed van Bruggen <edvb@uw.edu>
Date:   Sat, 17 Mar 2018 17:11:13 -0700

[dmenu] Add center patch

Diffstat:
Atools.suckless.org/dmenu/patches/center.md | 25+++++++++++++++++++++++++
Atools.suckless.org/dmenu/patches/dmenu-center-4.8.diff | 56++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 81 insertions(+), 0 deletions(-)

diff --git a/tools.suckless.org/dmenu/patches/center.md 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 <edvb@uw.edu> diff --git a/tools.suckless.org/dmenu/patches/dmenu-center-4.8.diff 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(); +