dmenu is an efficient dynamic menu for X.
dmenu-rs is a 1:1 port of dmenu rewritten in Rust. It looks, feels, and
runs pixel-for-pixel exactly the same.
It also has plugin support for easy modification.
The master branch is a stable, feature complete product. It it not unmaintained; it's finished.
There is a small and ever-shrinking chance that this will be updated or overhauled in the distant future. It is much more likely that I will write a spiritual successor from scratch, but that won't happen until at least 2023.
This project started with dmenu-calc
.
Initially, I wanted much more function than what is provided by bc
. However, I
found the bottleneck to be a lack of functionality and modability in dmenu(1)
itself. So, the choice I had was to either mod dmenu(1)
or rewrite it. Because
dmenu source is horrendously annoying to read, I decided to rewrite it in a
language which lends itself to writing code that is easier to modify. There are
other languages for this, but I like Rust.
As mentioned earlier, dmenu-rs
runs exactly the same as dmenu
. However, there
are some significant performance enhancements under the hood. The most impactful
is memory usage: dmenu-rs
uses 21.65% less memory[1], while managing it much
more safely without any performance impacts. The other large improvement is
plugin support; read below.
dmenu-rs leverages rust crates overrider
and proc_use
to provide an easy to
write and powerful plugin system. The end-result are plugins which are dead-simple
to enable.
For a list of available plugins and more info on
enabling plugins, run make plugins
.
For more info on developing plugins, read the plugin guide.
- Xlib header files
- Cargo / rustc
- A working C compiler
Edit config.mk to match your local setup (dmenu is installed into the /usr/local namespace by default).
Afterwards enter the following command to build dmenu:
make
Then, to install (if necessary as root):
make install
dmenu-rs is available from the following sources:
If you'd like for this to be available on another distro, raise an issue or submit a pull request with a README change pointing to the released package.
See the man page for details. For a quick test, run:
make test
[1]: According to valgrind(1)