<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dmenu.git/dmenu.c, branch master</title>
<subtitle>dynamic menu
</subtitle>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/'/>
<entry>
<title>add -of and -ob arguments for outline colors options for multi-selection</title>
<updated>2026-01-30T10:09:51+00:00</updated>
<author>
<name>Julien Addé</name>
<email>juadde+suckless@gmail.com</email>
</author>
<published>2026-01-28T14:57:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=7175c4880bac3d2a2d4a6262b59193f0a38e2fdb'/>
<id>7175c4880bac3d2a2d4a6262b59193f0a38e2fdb</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>drw.c: drw_scm_free: call free inside</title>
<updated>2025-09-29T16:47:16+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2025-09-29T16:47:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=8b48986f4c730725367e2865e5ea24931855018f'/>
<id>8b48986f4c730725367e2865e5ea24931855018f</id>
<content type='text'>
Because drw_scm_create() allocates it.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Because drw_scm_create() allocates it.
</pre>
</div>
</content>
</entry>
<entry>
<title>cleanup schemes and colors</title>
<updated>2025-09-27T10:10:37+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2025-09-27T10:10:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=77f96d704bd16b04fe731da815a4e76c4e62decb'/>
<id>77f96d704bd16b04fe731da815a4e76c4e62decb</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>XUngrabKeyboard() instead of XUngrabKey()</title>
<updated>2025-03-17T20:01:05+00:00</updated>
<author>
<name>Adam Purkrt</name>
<email>adam@purkrt.cz</email>
</author>
<published>2025-03-15T18:53:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=b1e217b29aab8936e9831961943676acd9cdcdd8'/>
<id>b1e217b29aab8936e9831961943676acd9cdcdd8</id>
<content type='text'>
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.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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.
</pre>
</div>
</content>
</entry>
<entry>
<title>remove extra newline</title>
<updated>2024-10-30T12:03:25+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2024-10-30T12:03:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=86f0b5119eaa39943013d009967432ffd9d18365'/>
<id>86f0b5119eaa39943013d009967432ffd9d18365</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>drw: minor improvement to the nomatches cache</title>
<updated>2023-07-07T13:03:57+00:00</updated>
<author>
<name>NRK</name>
<email>nrk@disroot.org</email>
</author>
<published>2023-07-07T11:00:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=7ab0cb5ef0e19352fc5d64ae0d57a5cf4540acbf'/>
<id>7ab0cb5ef0e19352fc5d64ae0d57a5cf4540acbf</id>
<content type='text'>
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.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix BadMatch error when embedding on some windows</title>
<updated>2023-04-06T18:28:56+00:00</updated>
<author>
<name>Lucas de Sena</name>
<email>lucas@seninha.org</email>
</author>
<published>2023-04-05T20:11:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=0fe460dbd469a1d5b6a7140d0e1801935e4a923b'/>
<id>0fe460dbd469a1d5b6a7140d0e1801935e4a923b</id>
<content type='text'>
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&amp;m=168072150814664&amp;w=2
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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&amp;m=168072150814664&amp;w=2
</pre>
</div>
</content>
</entry>
<entry>
<title>readstdin: reduce memory-usage by duplicating the line from getline()</title>
<updated>2023-03-08T20:28:51+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2023-03-08T20:20:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=dfbbf7f6e1b22ccf9e5a45d77ee10995577fb4fc'/>
<id>dfbbf7f6e1b22ccf9e5a45d77ee10995577fb4fc</id>
<content type='text'>
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.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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.
</pre>
</div>
</content>
</entry>
<entry>
<title>readstdin: allocate amount of items</title>
<updated>2022-10-31T10:52:30+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2022-10-31T10:52:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=ba1a347dcaba055f824161007dfee60db3ea785b'/>
<id>ba1a347dcaba055f824161007dfee60db3ea785b</id>
<content type='text'>
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)).
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
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)).
</pre>
</div>
</content>
</entry>
<entry>
<title>readstdin: add a comment</title>
<updated>2022-10-31T10:46:10+00:00</updated>
<author>
<name>Hiltjo Posthuma</name>
<email>hiltjo@codemadness.org</email>
</author>
<published>2022-10-31T10:43:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.kartoffeltoaster.de/dmenu.git/commit/?id=bcbc1ef5c4cf4875a4d66e7dc0919da88a6096a5'/>
<id>bcbc1ef5c4cf4875a4d66e7dc0919da88a6096a5</id>
<content type='text'>
Maybe too obvious / redundant, but OK.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Maybe too obvious / redundant, but OK.
</pre>
</div>
</content>
</entry>
</feed>
