Modified center patch: increased speed when dealing with long emoji files - sit… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
commit 429b695d510ae3b941583c952c67986f690601c4 | |
parent 1e2d2122823de78b4aaf49c25310f30efe0c5896 | |
Author: leliel <[email protected]> | |
Date: Mon, 7 Apr 2025 01:50:38 +0000 | |
Modified center patch: increased speed when dealing with long emoji files | |
Diffstat: | |
A tools.suckless.org/dmenu/patches/c… | 135 +++++++++++++++++++++++++++… | |
M tools.suckless.org/dmenu/patches/c… | 2 ++ | |
2 files changed, 137 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/tools.suckless.org/dmenu/patches/center/dmenu-center-20250407-b1e2… | |
@@ -0,0 +1,135 @@ | |
+From 95a444534c230de79000348b0e12f8644aac8b15 Mon Sep 17 00:00:00 2001 | |
+From: leliel <[email protected]> | |
+Date: Mon, 7 Apr 2025 01:00:01 +0000 | |
+Subject: [PATCH] Increased speed for long files with emojis. | |
+ | |
+--- | |
+ config.def.h | 3 +++ | |
+ dmenu.1 | 3 +++ | |
+ dmenu.c | 40 ++++++++++++++++++++++++++++++++++------ | |
+ 3 files changed, 40 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 appear… | |
++static int centered = 1; /* -c option; centers dmenu on sc… | |
++static int min_width = 500; /* minimum width when centered… | |
++static const float menu_height_ratio = 4.0f; /* This is the ratio used in th… | |
+ /* -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… | |
+ .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 fd49549..ceb52c7 100644 | |
+--- a/dmenu.c | |
++++ b/dmenu.c | |
+@@ -29,6 +29,7 @@ enum { SchemeNorm, SchemeSel, SchemeOut, SchemeLast }; /* co… | |
+ | |
+ struct item { | |
+ char *text; | |
++ unsigned int width; | |
+ struct item *left, *right; | |
+ int out; | |
+ }; | |
+@@ -95,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(item->width, len); | |
++ return len; | |
++} | |
++ | |
+ static void | |
+ cleanup(void) | |
+ { | |
+@@ -563,6 +573,7 @@ readstdin(void) | |
+ line[len - 1] = '\0'; | |
+ if (!(items[i].text = strdup(line))) | |
+ die("strdup:"); | |
++ items[i].width = TEXTW(line); | |
+ | |
+ items[i].out = 0; | |
+ } | |
+@@ -636,6 +647,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 +674,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[… | |
++ x = info[i].x_org + ((info[i].width - mw) / 2); | |
++ y = info[i].y_org + ((info[i].height - mh) / menu_hei… | |
++ } 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 +691,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.wi… | |
++ 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 */ | |
+@@ -733,6 +759,8 @@ main(int argc, char *argv[]) | |
+ topbar = 0; | |
+ else if (!strcmp(argv[i], "-f")) /* grabs keyboard before r… | |
+ fast = 1; | |
++ else if (!strcmp(argv[i], "-c")) /* centers dmenu on screen… | |
++ centered = 1; | |
+ else if (!strcmp(argv[i], "-i")) { /* case-insensitive item m… | |
+ fstrncmp = strncasecmp; | |
+ fstrstr = cistrstr; | |
+-- | |
+2.49.0 | |
+ | |
diff --git a/tools.suckless.org/dmenu/patches/center/index.md b/tools.suckless.… | |
@@ -23,9 +23,11 @@ Download | |
* [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) | |
+* [dmenu-center-20250407-b1e217b.diff](dmenu-center-20250407-b1e217b.diff) | |
Authors | |
------- | |
* Ed van Bruggen <[email protected]> | |
* Nihal Jere <[email protected]> (20200111) | |
* El Bachir Kassimi <[email protected]> (20240616) | |
+* Leliel <[email protected]> (20250407) |