[dev] [xuv] X11 user daemon to automatically run commands triggered by user specified events

0 views
Skip to first unread message

NRK

unread,
Mar 1, 2026, 1:14:29 PM (10 days ago) Mar 1
to d...@suckless.org
Hi all,

I wanted to share the following tool which I have been using myself for the
past couple weeks:

https://codeberg.org/NRK/xuv

It's a X11 daemon that automatically runs commands triggered by events
specified by the user's configuration.
For example, to automatically kill compositor when a window enters fullscreen:

[CompositorOff]
event = ActiveFS
cmd = pkill SomeCompositor

And then to enable it back on:

[CompositorOn]
event = ActiveFSLeave
cmd = SomeCompositor

Events can be further filtered by the window name, class and instance.
The following events are currently supported:

* Window becoming active/losing active.
* Window being focused/losing focus.
* Window being created/destroyed.
* Window being mapped/unmapped.
* Window entering/leaving fullscreen mode.

More events can be added based on use-cases/feature-requests.

Detailed documentation can be found in the manpages.

Suggestions/feedback/bug-reports welcome.

- NRK

Ricardson

unread,
Mar 1, 2026, 5:12:43 PM (10 days ago) Mar 1
to d...@suckless.org
Hi NRK,
Thanks for sharing xuv.

One practical use case with dwm is Firefox requesting EWMH fullscreen _NET_WM_STATE_FULLSCREEN, which hides the tags. This can be handled with:

[FirefoxBlockWMFullscreen]
event = ActiveFS
class = firefox
cmd = wmctrl -r :ACTIVE: -b remove,fullscreen

This prevents WM level fullscreen while still allowing F11 style browser fullscreen.

xuv feels like a nice complement to dwm and the general suckless workflow since it keeps the window manager simple while allowing event driven behavior externally.

Also a small question regarding the repository layout. install.mk and the manpages are currently under etc/. From a packaging perspective I usually expect etc/ to contain only runtime configuration examples, with build logic and documentation separated. Was this intentional to mirror the installation layout?

----
Kind regards,
r1w1s1

NRK

unread,
Mar 2, 2026, 7:52:59 AM (10 days ago) Mar 2
to dev mail list
On Sun, Mar 01, 2026 at 06:35:37PM -0300, Ricardson wrote:
> One practical use case with dwm is Firefox requesting EWMH fullscreen
> _NET_WM_STATE_FULLSCREEN, which hides the tags.

For this I personally use the fake-fullscreen patch maintained by
bakkeby [0]. This is also why the "ActiveFS" event in xuv has a bunch of
other conditions rather than just `_NET_WM_STATE_FULLSCREEN` [1].

This may have issue with multimonitor setups, so I'm open towards adding
a more relaxed fullscreen event that depends only on
`_NET_WM_STATE_FULLSCREEN`. But since I don't use multimonitor setups, I
won't add it until someone asks for it who can test and provide
feedback.

[0]: https://github.com/bakkeby/patches/blob/master/dwm/dwm-fullscreen-compilation-6.3.diff
[1]: https://codeberg.org/NRK/xuv/src/commit/ecf1f367ca7a498d71669b4cb0fe3f53368eb4e1/xuv.c#L1296-L1306

> Also a small question regarding the repository layout. install.mk and
> the manpages are currently under etc/. From a packaging perspective I
> usually expect etc/ to contain only runtime configuration examples,
> with build logic and documentation separated. Was this intentional to
> mirror the installation layout?

The `etc` dir in the repository doesn't have anything to do with the
typical unix `/etc` dir. It's just a dir to dump random files into. You
could also name it `misc` or similar.

- NRK

Reply all
Reply to author
Forward
0 new messages