Commit Graph

246 Commits

Author SHA1 Message Date
Hiltjo Posthuma
dfbbf7f6e1 readstdin: reduce memory-usage by duplicating the line from getline()
Improves upon commit 32db2b1251

The getline() implementation often uses a more greedy way of allocating memory.
Using this buffer directly and forcing an allocation (by setting it to NULL)
would waste a bit of extra space, depending on the implementation of course.

Tested on musl libc and glibc.
The current glibc version allocates a minimum of 120 bytes per line.
For smaller lines musl libc seems less wasteful but still wastes a few bytes
per line.

On a dmenu_path listing on my system the memory usage was about 350kb (old) vs
30kb (new) on Void Linux glibc.

Side-note that getline() also reads NUL bytes in lines, while strdup() would
read until the NUL byte. Since dmenu reads text lines either is probably
fine(tm). Also rename junk to linesiz.
2023-03-08 21:28:51 +01:00
Hiltjo Posthuma
ba1a347dca readstdin: allocate amount of items
Keep track of the amount of items (not a total buffer size), allocate an array of
new items. For now change BUFSIZ bytes to 256 * sizeof(struct item)).
2022-10-31 11:52:30 +01:00
Hiltjo Posthuma
bcbc1ef5c4 readstdin: add a comment
Maybe too obvious / redundant, but OK.
2022-10-31 11:46:10 +01:00
NRK
689d9bfcf6 fix leak when getline fails
according to the getline(3) documentation, the calling code needs to
free the buffer even if getline fails.

dmenu currently doesn't do that which results in a small leak in case of
failure (e.g when piped /dev/null)

	$ ./dmenu < /dev/null
	==8201==ERROR: LeakSanitizer: detected memory leaks
	Direct leak of 120 byte(s) in 1 object(s) allocated from:
	    #0 0x7f6bf5785ef7 in malloc
	    #1 0x7f6bf538ec84 in __getdelim
	    #2 0x405d0c in readstdin dmenu.c:557

moving `line = NULL` inside the loop body wasn't strictly necessary, but
IMO it makes it more apparent that `line` is getting cleared to NULL
after each successful iteration.
2022-10-31 11:40:35 +01:00
Hiltjo Posthuma
e42c036634 dmenu: small XmbLookupString code improvements
* Increase the length of composed strings to the same limit as st (32 to 64 bytes).
* Initialize ksym to NoSymbol to be safe: currently this is not an issue though.
* Add comments to clarify the return values of XmbLookupString a bit.
2022-10-26 09:43:17 +02:00
Tom Schwindl
7ec32fe494 dmenu: use die() to print the usage message 2022-10-01 13:20:40 +02:00
Hiltjo Posthuma
1e8c5b68f4 fix a regression in the previous commit for tab complete
Reported by Santtu Lakkala <inz@inz.fi>, thanks!
2022-09-02 19:09:50 +02:00
NRK
528d39b011 tab-complete: figure out the size before copying
we already need to know the string length since `cursor` needs to be
adjusted.

so just calculate the length beforehand and use `memcpy` to copy exactly
as much as needed (as opposed to `strncpy` which always writes `n`
bytes).
2022-09-02 13:00:48 +02:00
NRK
32db2b1251 readstdin: use getline(3)
currently readstdin():
   - fgets() into a local buffer,
   - strchr() the buffer to eleminate the newline
   - stdups() the buffer into items

a simpler way is to just use getline(3), which will do the allocation
for us; eliminating the need for stdup()-ing.

additionally getline returns back the amount of bytes read, which
eliminates the need for strchr()-ing to find the newline.
2022-09-02 12:53:34 +02:00
Hiltjo Posthuma
fe5d5c6709 fix incorrect comment, math is hard 2022-04-30 13:19:33 +02:00
Hiltjo Posthuma
e1e1de7b3b inputw: improve correctness and startup performance, by NRK
Always use ~30% of the monitor width for the input in horizontal mode.

Patch adapted from NRK patches.
This also does not calculate inputw when using vertical mode anymore (because
the code is removed).
2022-04-29 20:18:02 +02:00
Hiltjo Posthuma
e73651f12a fix UB with the function iscntrl()
From commit 6818e07291 by NRK, thanks
2022-03-26 17:58:47 +01:00
Hiltjo Posthuma
31fa07b984 Revert "avoid redraw when there's no change"
This reverts commit 6818e07291.

This broke keys such as ^W to delete-backward-word
2022-03-26 17:57:50 +01:00
NRK
6818e07291 avoid redraw when there's no change
while i was timing the performance issue, i noticed that there was lots
of random redrawing going on.

turns out there were coming from here; if someone presses CTRL/ALT etc
without pressing anything else, nothing will be inserted, so nothing
will change. but the code will `break`, go down and do a needless redraw.

this patch changes it to simply return if the keypress iscntrl()

also avoid potential UB by casting *buf into an unsigned char.
2022-03-25 22:53:50 +01:00
NRK
b43ec0577f free all allocated items, use %zu for size_t
`items` itself is not checked for NULL as calling free on NULL is defined to be
a no-op.
2022-03-25 22:53:50 +01:00
NRK
77526f756e 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.
2022-03-25 22:49:07 +01:00
NRK
7269c5355d significantly improve performance on large strings
this replaces inefficient pattern of `MIN(TEXTW(..), n)` with
drw_fontset_getwidth_clamp() instead, which is far more efficient when
we only want up to a certain width.

dumping a decently sized (unicode) emoji file into dmenu, I see the
startup time drop significantly with this patch.

before -> after
360ms  -> 160ms

this should also noticeably improve input latency (responsiveness) given
that calcoffsets() and drawmenu() are pretty hot functions.
2022-03-25 22:49:07 +01:00
Hiltjo Posthuma
3a505cebe8 remove false-positive warning for int comparison as bool
Reported by Prathu Baronia <prathu.baronia@praton.me>, patch slightly changed.

Thanks!
2022-03-01 22:45:39 +01:00
Hiltjo Posthuma
c4b656e0da code-style: rm newline (oops) 2022-02-08 21:45:28 +01:00
Hiltjo Posthuma
3e39c526d2 revert using strcasestr and use a more optimized portable version
... compared to the old cistrstr().

Thanks for the feedback!
2022-02-08 19:38:23 +01:00
Hiltjo Posthuma
eb96af27f4 improve performance of case-insensitive matching 2022-02-07 00:21:12 +01:00
Hiltjo Posthuma
cd2133a5f6 add support for more keypad keys
The keypad Enter key was already supported. On some keyboard layouts like my
laptop the page-up and page-down key is more comfortable to use.
This adds a few lines but no complexity.
2021-08-09 18:39:25 +02:00
Hiltjo Posthuma
db6093f6ec revert IME support
dmenu will not handle IME support (st will, atleast for now).

revert parts of commit 377bd37e21
this commit also broke input focus.
2019-03-03 13:08:54 +01:00
Hiltjo Posthuma
a9b1de384a improve xopenim error message
die() already prints a newline.
2019-02-12 22:58:35 +01:00
Hiltjo Posthuma
f5036b90ef fix crash when XOpenIM returns NULL
for example when IME variables are set, but the program is not started (yet).
2019-02-12 19:10:43 +01:00
Quentin Rameau
153aaf88bf Close when the embedding window is destroyed 2019-02-04 19:49:34 +01:00
dok
11a65377da Use slow path if stdin is a tty
If stdin is a tty and dmenu is ran with the fast option then it's
impossible to close stdin because the keyboard is already grabbed.
2019-01-27 15:26:04 +01:00
Hiltjo Posthuma
851b73d178 code-style for pledge: check the return code -1, not < 0
this is the proper idiom
2018-05-25 13:07:17 +02:00
Hiltjo Posthuma
05c138f5b8 code-style for pledge(2)
feedback from Klemens, thanks
2018-05-25 13:03:25 +02:00
Hiltjo Posthuma
cd132c8d5b Pledge on OpenBSD 2018-05-25 12:04:22 +02:00
Quentin Rameau
0f76dd2fb8 Fix cursor drawn position with wide glyphs 2018-04-22 14:19:20 +02:00
Quentin Rameau
377bd37e21 Handle IME input
Thanks to nzl <uruabi@gmail.com> for the patch!
2018-04-22 14:09:05 +02:00
Hiltjo Posthuma
b6d2cc9aea Fix handling of input strings 2018-04-22 14:09:05 +02:00
Quentin Rameau
e2a280541e add key bindings for moving to the word start or end
Mod1+b/^Left and Mod1+f/^Right
2018-03-13 20:10:46 +01:00
Hiltjo Posthuma
889512811d Fix regression in 84a1bc5
Reported by Jochen Sprickerhof, thanks!

Applied patch with minor change (only initialize `i` for XINERAMA).
2018-01-04 23:45:49 +01:00
Vincent Carluer
84a1bc5d0d Instantiate j var outside #ifdef XINEMARA directive because it is used in loop outside directive 2018-01-04 18:14:41 +01:00
Hiltjo Posthuma
1cabeda550 fix a possible free of a uninitialize variable in paste() 2017-11-03 21:07:02 +01:00
Hiltjo Posthuma
41379f7c39 init colors using SchemeLast
this makes it slightly easier to add colors to schemes.
2017-11-03 21:05:29 +01:00
Omar Sandoval
64ab2801fb Set class name on menu window
WM_CLASS is a standard ICCCM property which is used to identify windows.
Window managers and compositors use it to allow per-application
configurable behavior.
2017-11-03 20:41:03 +01:00
Andrew Gregory
5cd66e2c6c Revert "fix input text matching"
This reverts commit 09d0a36e03.

Using strncmp with the length of the user input turns it into a prefix
match rather than an exact match as it's supposed to be.
2016-12-11 12:33:16 +01:00
Thomas Gardner
e90b88e12a Xinerama: correct variable declarations in preprocessor conditional 2016-11-25 14:21:40 +01:00
Quentin Rameau
a9a5c6cc2d add embedding support with -w option 2016-10-14 15:26:35 +02:00
Quentin Rameau
a97f550aa7 dmenu.1: group single options 2016-10-14 15:26:34 +02:00
Hiltjo Posthuma
026827fd65 die() consistency: always add newline 2016-08-12 14:39:30 +02:00
Hiltjo Posthuma
d14670b995 fix crash if negative monitor (< -1) was passed
for example: dmenu -m '-9001'
2016-07-26 23:13:06 +02:00
Hiltjo Posthuma
aa92cd68bd Revert "Print highlighted input text only on single match"
This reverts commit a4053bc4e4.

My bad, was working on the wrong branch and accidently pushed it...
*facepalm*
2016-07-26 23:02:34 +02:00
Quentin Rameau
a4053bc4e4 Print highlighted input text only on single match
When the input text fully matches a single item, do not draw the item
and highlight the input text to show that it matches an item in
opposition to regular input text not matching anything.
2016-07-26 18:29:42 +02:00
Quentin Rameau
657122f781 Partially revert 44c7de3: fix items text width offset calculation
Without this, we discard the item if it's longer than assigned width
instead of truncating it.
2016-07-25 19:57:31 +02:00
S. Gilles
76eb578304 fix: Do not crash on e.g. dmenu < /dev/null 2016-06-28 17:51:28 +02:00
Markus Teich
44c7de3dcf import new drw from libsl and minor fixes.
- extract drawitem function (code deduplication)
- fix bug where inputw was not correctly calculated from the widest item, but
  just from the one with the longest strlen() which is not the same. It's better
  now, but does not account for fallback fonts, since it would be too slow to
  calculate all the correct item widths on startup.
- minor code style fixes (indentation, useless line breaks)
2016-06-03 19:13:15 +02:00