- C 95.3%
- Roff 2.5%
- Makefile 2.2%
dwl — personal build
A personal configuration of dwl, a compact Wayland compositor based on wlroots, following the suckless philosophy.
Patches
Listed by size:
| Patch | Description |
|---|---|
bar-systray-0.7.patch |
System tray support for the bar — depends on bar patch and libdbus |
bar.patch |
Adds a status bar identical to dwm's — requires tllist, fcft and pixman |
pertag.patch |
Per-tag layout configuration |
minimalborders.patch |
Merges borders between adjacent tiled windows |
autostart.patch |
Executes commands from autostart[] in config.h on startup |
xwayland-handle-minimize.patch |
Proper minimize event handling for XWayland clients |
simpleborders-v0.7.patch |
Removes borders when only one window is on screen |
hide_vacant_tags.patch |
Hides empty tags from the bar |
rotate-clients.patch |
Rotate clients on the current monitor with keybindings |
alwayscenter.patch |
Floating windows open centered |
attachbottom.patch |
New clients attach at the bottom of the stack |
Dependencies
Build dependencies:
- wlroots 0.19
- wayland-protocols
- pixman
- fcft
- tllist
- libdbus
Runtime:
aslstatus— status bar feeduwsm— session managerfoot— terminal emulator (server mode)mew— application launcherwbg— wallpapermako— notification daemonkanshi— display configurationgrim+slurp— screenshotswl-copy— clipboardbrightnessctl— backlight controlwpctl(wireplumber/pipewire) — audio controlswaylock— screen lockerfirefox,discord,thunderbird,AyuGram,steam,qbittorrent— applications with tag rules
Building
make clean && make
sudo make install
Configuration is done in config.h. The build system creates it automatically from config.def.h on first run. To customize:
cp config.def.h config.h
# edit config.h
make clean && make
Running
With uwsm (recommended)
uwsm provides proper systemd session integration — environment propagation, graphical-session.target lifecycle, and clean shutdown.
1. Create the wrapper script at ~/.local/bin/dwl-aslstatus:
#!/bin/sh
aslstatus | dwl
chmod +x ~/.local/bin/dwl-aslstatus
The script exists solely to pipe aslstatus into dwl's stdin before the process starts. This cannot be done from the autostart array since dwl's stdin is fixed at launch time.
2. Create a session entry at /usr/local/share/wayland-sessions/dwl-aslstatus.desktop:
[Desktop Entry]
Name=dwl (aslstatus)
Comment=dwm for Wayland with aslstatus
Exec=dwl-aslstatus
Type=Application
Don't edit the dwl.desktop installed by make install — it will be
overwritten on reinstall. The separate file also lets you choose between
a bare dwl session and this one from the display manager login screen.
3. Choose your launch path:
TTY login — add to ~/.profile:
if uwsm check may-start; then
exec uwsm start dwl-aslstatus.desktop
fi
Display manager — simply select "dwl (aslstatus)" from the session list at login.
Session startup sequence
On launch, autostart[] in config.h runs after dwl initializes:
static const char *const autostart[] = {
"uwsm", "finalize", NULL, /* propagates WAYLAND_DISPLAY into systemd/dbus */
"wbg", "/path/to/wallpaper", NULL,
"mako", NULL,
"kanshi", NULL,
"foot", "--server", NULL, /* foot server for fast terminal spawning */
NULL
};
uwsm finalize must be first — it exports WAYLAND_DISPLAY into the activation environment, which is required for screen sharing and any app launched as a systemd service.
Key configuration
| Setting | Value |
|---|---|
| Modifier | Super (Logo) |
| Border width | 2px |
| Font | Hack 10 |
| Color scheme | Tokyo Night |
| Keyboard layout | Brazilian ABNT2 (br, abnt2) |
| Key repeat rate | 48/s, 430ms delay |
Keybindings
| Binding | Action |
|---|---|
Super + Return |
Terminal (footclient) |
Super + Space |
App menu (mew-run) |
Super + B |
Toggle bar |
Super + C |
Kill client |
Super + Shift + Q |
Quit dwl |
Super + [J/K] |
Focus next/previous |
Super + Shift + [J/K] |
Rotate clients |
Super + [H/L] |
Adjust master width |
Super + Shift + [I/D] |
Inc/dec master count |
Super + Shift + Return |
Promote to master |
Super + Tab |
Previous tag |
Super + Ctrl + [T/F/M] |
Tile / float / monocle layout |
Super + Ctrl + Space |
Previous layout |
Super + Shift + Space |
Toggle floating |
Super + Shift + F |
Toggle fullscreen |
Super + [,/.] |
Focus monitor left/right |
Super + Shift + [</> ] |
Move to monitor left/right |
Super + [1-9] |
Switch tag |
Super + 0 |
Show all tags |
Super + W |
Firefox |
Super + D |
Discord |
Super + T |
Telegram (AyuGram) |
Super + M |
Email (Thunderbird) |
Super + F |
File manager (lf) |
Super + S |
Spotify |
Super + G |
Steam |
Super + Q |
qBittorrent |
Super + Z |
Elecwhat |
Super + Shift + L |
Lock screen (swaylock) |
Super + Print |
Screenshot selection → clipboard + file |
Print |
Full screenshot → clipboard + file |
| Media keys | Volume and brightness via wpctl/brightnessctl |
Screenshots are saved to ~/pix/ss/ with a timestamp filename and copied to clipboard. Notifications are sent via mako.
License
Inherits licenses from dwl, dwm, tinywl, and sway. See LICENSE* files for details.