Commit Briefs

8b48986f4c Hiltjo Posthuma

drw.c: drw_scm_free: call free inside (master)

Because drw_scm_create() allocates it.


77f96d704b Hiltjo Posthuma

cleanup schemes and colors


d893c63cdd Hiltjo Posthuma

bump version to 5.4 (tags/5.4)


b1e217b29a Hiltjo Posthuma

XUngrabKeyboard() instead of XUngrabKey()

XUngrabKey(), which is currently used in cleanup(), is not the right counterpart to XGrabKeyboard(), which is used in grabkeyboard(), called from main(). XUngrabKeyboard() is the function to use, as grabbing the whole keyboard is different to grabbing individual keys. With the current code the keyboard gets ungrabbed, as far as I can tell, only by the final XCloseDisplay() in cleanup(), as the XUngrabKey() there effectively does nothing.


86f0b5119e Hiltjo Posthuma

remove extra newline


dd3d348ae8 Hiltjo Posthuma

Avoid unsigned integer underflow in drw_text()

Patch by Raymond Cole <rc@wolog.xyz>, thanks.


545031a076 Hiltjo Posthuma

util.c: output function might override errno and thus affect perror()

Original patch by Raymond Cole with some modifications, thanks!



59936c7d97 Hiltjo Posthuma

render invalid utf8 sequences as U+FFFD

previously drw_text would do the width calculations as if invalid utf8 sequences were replaced with U+FFFD but would pass the invalid utf8 sequence to xft to render where xft would just cut it off at the first invalid byte. this change makes invalid utf8 render as U+FFFD and avoids sending invalid sequences to xft. the following can be used to check the behavior before and after the patch: $ printf "0\xef1234567\ntest" | dmenu Ref: https://lists.suckless.org/dev/2407/35646.html


51e32d49b5 Hiltjo Posthuma

overhaul utf8decode()

this changes the utf8decode function to: * report when an error occurs * report how many bytes to advance on error these will be useful in the next commit to render invalid utf8 sequences. the new implementation is also shorter and more direct.


7be720cc88 Hiltjo Posthuma

bump version to 5.3 (tags/5.3)


8df553e004 Hiltjo Posthuma

Makefile: remove the options target

The Makefile used to suppress output (by using @), so this target made sense at the time. But the Makefile should be simple and make debugging with less abstractions or fancy printing. The Makefile was made verbose and doesn't hide the build output, so remove this target. Prompted by a question on the mailing list about the options target.


7ab0cb5ef0 Hiltjo Posthuma

drw: minor improvement to the nomatches cache

1. use `unsigned int` to store the codepoints, this avoids waste on common case where `long` is 64bits. and POSIX guarantees `int` to be at least 32bits so there's no risk of truncation. 2. since switching to `unsigned int` cuts down the memory requirement by half, double the cache size from 64 to 128. 3. instead of a linear search, use a simple hash-table for O(1) lookups.


0fe460dbd4 Hiltjo Posthuma

fix BadMatch error when embedding on some windows

When embedded into another window, dmenu will fail with the BadMatch error if that window have not the same colormap/depth/visual as the root window. That happens because dmenu inherits the colormap/depth/visual from its parent, but draws on a pixmap created based on the root window using a GC created for the root window (see drw.c). A BadMatch will occur when copying the content of the pixmap into dmenu's window. A solution is to create dmenu's window inside root and then reparent it if embeded. See this mail[1] on ports@openbsd.org mailing list for context. [1]: https://marc.info/?l=openbsd-ports&m=168072150814664&w=2


dfbbf7f6e1 Hiltjo Posthuma

readstdin: reduce memory-usage by duplicating the line from getline()

Improves upon commit 32db2b125190d366be472ccb7cad833248696144 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.


ba1a347dca Hiltjo Posthuma

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)).


bcbc1ef5c4 Hiltjo Posthuma

readstdin: add a comment

Maybe too obvious / redundant, but OK.


689d9bfcf6 Hiltjo Posthuma

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.


e42c036634 Hiltjo Posthuma

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.


1d2b462acf Hiltjo Posthuma

bump version to 5.2 (tags/5.2)


7ec32fe494 Hiltjo Posthuma

dmenu: use die() to print the usage message


fce06f437d Hiltjo Posthuma

remove workaround for a crash with color emojis on some systems, now fixed in libXft 2.3.5

https://gitlab.freedesktop.org/xorg/lib/libxft/-/blob/libXft-2.3.5/NEWS


1e8c5b68f4 Hiltjo Posthuma

fix a regression in the previous commit for tab complete

Reported by Santtu Lakkala <inz@inz.fi>, thanks!


528d39b011 Hiltjo Posthuma

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).


32db2b1251 Hiltjo Posthuma

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.