Introduction
Introduction Statistics Contact Development Disclaimer Help
inputw: improve correctness and startup performance - dmenu - my customized ver…
git clone git://git.codemadness.org/dmenu
Log
Files
Refs
README
LICENSE
---
commit 77526f756e23e362081ac807521f901f2e5cd5e6
parent 7269c5355d257dd2ad2c53f15dc9c1cf6796aea5
Author: NRK <[email protected]>
Date: Thu, 24 Mar 2022 00:37:55 +0600
inputw: improve correctness and startup performance
a massive amount of time inside readstdin() is spent trying to get the
max input width and then put it into inputw, only for it to get clamped
down to mw/3 inside setup().
it makes more sense to calculate inputw inside setup() once we have mw
available. similar to the last patch, i see noticeable startup
performance improvement:
before -> after
160ms -> 60ms
additionally this will take fallback fonts into account compared to the
previous version, so it's not only more performant but also more correct.
Diffstat:
M dmenu.c | 19 +++++++++----------
1 file changed, 9 insertions(+), 10 deletions(-)
---
diff --git a/dmenu.c b/dmenu.c
@@ -547,8 +547,7 @@ static void
readstdin(void)
{
char buf[sizeof text], *p;
- size_t i, imax = 0, size = 0;
- unsigned int tmpmax = 0;
+ size_t i, size = 0;
/* read each line from stdin and add it to the item list */
for (i = 0; fgets(buf, sizeof buf, stdin); i++) {
@@ -560,15 +559,9 @@ readstdin(void)
if (!(items[i].text = strdup(buf)))
die("cannot strdup %u bytes:", strlen(buf) + 1);
items[i].out = 0;
- drw_font_getexts(drw->fonts, buf, strlen(buf), &tmpmax, NULL);
- if (tmpmax > inputw) {
- inputw = tmpmax;
- imax = i;
- }
}
if (items)
items[i].text = NULL;
- inputw = items ? TEXTW(items[imax].text) : 0;
lines = MIN(lines, i);
}
@@ -614,12 +607,13 @@ static void
setup(void)
{
int x, y, i, j;
- unsigned int du;
+ unsigned int du, tmp;
XSetWindowAttributes swa;
XIM xim;
Window w, dw, *dws;
XWindowAttributes wa;
XClassHint ch = {"dmenu", "dmenu"};
+ struct item *item;
#ifdef XINERAMA
XineramaScreenInfo *info;
Window pw;
@@ -677,7 +671,12 @@ setup(void)
mw = wa.width;
}
promptw = (prompt && *prompt) ? TEXTW(prompt) - lrpad / 4 : 0;
- inputw = MIN(inputw, mw/3);
+ for (item = items; item && item->text; ++item) {
+ if ((tmp = textw_clamp(item->text, mw/3)) > inputw) {
+ if ((inputw = tmp) == mw/3)
+ break;
+ }
+ }
match();
/* create menu window */
You are viewing proxied material from codemadness.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.