dgm (Dynamic Group Manager) is an extremely fast, small, and dynamic window manager for X.
This is a personal fork of dwm 6.8 without tags. Windows are grouped
automatically: by their position in the window list into groups, which grow
as windows open in them, and by WM_CLASS into classes. Each monitor shows
the focused window's group in its layout, while the bar lists every window,
or only the group's when narrowed; a class filter narrows both to one class.
The point is to decide as little as possible yourself — mainly the order of
windows — and let the window manager do the rest, the way dwm's layouts
already automate arranging windows on screen.
dgm.1 describes the behavior and default keys, CLAUDE.md the design and
code, and config.def.h the bindings, which differ substantially from stock
dwm's.
In order to build dgm you need the Xlib header files.
Edit config.mk to match your local setup (dgm is installed into
the /usr/local namespace by default).
Afterwards enter the following command to build and install dgm (if necessary as root):
make clean installconfig.h is generated from config.def.h only if it doesn't already
exist, so after editing config.def.h run rm config.h (or make clean)
before rebuilding, or your changes will be silently ignored.
make test # unit tests of the group bookkeeping, no X needed
make xtest # dgm itself under a headless Xvfb servermake xtest needs Xvfb, xdotool, xprop, xwininfo and st (see tests/run.sh).
Add the following line to your .xinitrc to start dgm using startx:
exec dgmIn order to connect dgm to a specific display, make sure that
the DISPLAY environment variable is set correctly, e.g.:
DISPLAY=foo.bar:1 exec dgm(This will start dgm on display :1 of the host foo.bar.)
In order to display status info in the bar, you can do something
like this in your .xinitrc:
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
do
sleep 1
done &
exec dgmThe configuration of dgm is done by creating a custom config.h
and (re)compiling the source code.