This is a heavily modified version of dwm based on the original suckless.org dwm. It includes numerous patches and customizations for a productive, user-friendly desktop on Arch Linux with Xorg.
- Polybar integration (replaces dwm built-in bar)
- Window swallowing — terminals absorb child GUI windows
- EWMH compliance — proper desktop/tag reporting for external tools
- Pertag — independent layouts, master counts, and sizing per tag
- Cfact — per-window sizing in tiled layouts
- Movestack — reorder windows in the stack with keybinds
- Systray — built-in system tray (disabled by default when using Polybar)
- Fullscreen — actual and fake fullscreen toggle (3-state)
- Window icons — title bar icons via
_NET_WM_ICON - Cursor warp — cursor follows focus across windows/monitors
- Noborder — auto-remove borders when only one window is visible
- Multi-monitor — Xinerama support with per-monitor Polybar bars
Use Linutil for automated setup:
curl -fsSL https://christitus.com/linux | sh
Select dwm, rofi, bash prompt, and ghostty using the v key, then press Enter.
Build dependencies (required to compile):
sudo pacman -S --needed base-devel libx11 libxft libxinerama imlib2 libxcb xcb-util freetype2 fontconfigXorg:
sudo pacman -S --needed xorg-server xorg-xinit xorg-xrandr xorg-xsetroot xorg-xsetRuntime dependencies (desktop experience):
sudo pacman -S --needed rofi picom dunst feh flameshot dex mate-polkit alsa-utils noto-fonts-emoji ttf-meslo-nerdTerminal emulator (at least one):
# Pick one — ghostty is the default in config.h
sudo pacman -S ghostty # or: alacritty, kittyPolybar (status bar):
sudo pacman -S polybargit clone https://github.com/ChrisTitusTech/dwm-titus.git
cd dwm-titus
cp config.def.h config.h # Create your personal config
make
sudo make installPolybar icon fonts (MaterialIcons, Feather) are bundled in polybar/fonts/:
mkdir -p ~/.local/share/fonts
cp -r polybar/fonts/* ~/.local/share/fonts/
fc-cache -fvAn install script is provided that handles all of the above:
./install.shOption A — Display Manager (SDDM, GDM, LightDM): Log out, select dwm from the session menu, and log back in.
Option B — startx:
The installer places .xinitrc in your home directory. Start with:
startxThe .xinitrc disables screen blanking/DPMS (prevents NVIDIA GPU issues on wake), launches Polybar, and starts dwm.
Press SUPER + / inside dwm for an interactive keybind viewer (via rofi).
See docs/src/keybinds.md for the full reference.
| Keybind | Action |
|---|---|
| SUPER + X | Open terminal |
| SUPER + R | Launch rofi (app launcher) |
| SUPER + Q | Close window |
| SUPER + J / K | Focus next / previous window |
| SUPER + H / L | Resize master area |
| SUPER + 1-9 | Switch to tag (workspace) |
| SUPER + Shift + 1-9 | Move window to tag |
| SUPER + T | Tile layout |
| SUPER + F | Floating layout |
| SUPER + M | Fullscreen |
| SUPER + Space | Toggle floating |
| SUPER + Shift + Q | Quit dwm |
| SUPER + Ctrl + Q | Power menu |
dwm is configured by editing config.h and recompiling:
$EDITOR config.h
make && sudo make installNote:
config.def.his the clean default template.config.his your personal customization. Ifconfig.hdoesn't exist,makewill create it fromconfig.def.hautomatically.
Key things to customize in config.h:
refresh_rate— match your monitor (default: 60, set to 120 for high-refresh)fonts[]— font family and sizecolors[]— color scheme (Nord theme by default in config.h)autostart[]— programs launched on startuprules[]— per-application window rules (floating, tags, terminal detection)keys[]— all keybindingsMODKEY— modifier key (Mod4Mask= Super,Mod1Mask= Alt)
Black screen / dwm doesn't start:
- Verify Xorg is installed:
pacman -Q xorg-server xorg-xinit - Check
.xinitrcexists and ends withexec dwm - Try
startxfrom a TTY to see error output
No status bar / Polybar missing:
- Install polybar:
sudo pacman -S polybar - Check fonts are installed:
fc-list | grep -i meslo - Verify polybar config:
ls ~/.config/polybar/
Missing icons in Polybar:
- Install icon fonts:
cp -r polybar/fonts/* ~/.local/share/fonts/ && fc-cache -fv
Terminal doesn't open (SUPER+X):
- Install a terminal emulator (ghostty, alacritty, kitty, or st)
- Or edit
config.h→termcmd[]to use your preferred terminal
Multi-monitor issues:
- Polybar auto-detects monitors via
xrandr - Primary monitor gets systray + EWMH tags; secondary monitors get a simpler bar
- If tags don't switch correctly across monitors, check
debug_ewmh.sh
Dependency check:
bash scripts/check-deps.sh| Path | Purpose |
|---|---|
config.def.h |
Default configuration template |
config.h |
Your personal configuration (edit this) |
dwm.c |
Main window manager source |
Makefile |
Build and install system |
.xinitrc |
Startup script for startx |
dwm.desktop |
Session entry for display managers |
install.sh |
Automated installer (Arch Linux) |
polybar/ |
Polybar config, themes, and fonts |
config/ |
Terminal, rofi, and app configurations |
scripts/ |
Helper scripts (keybinds viewer, dep checker, etc.) |
docs/src/keybinds.md |
Full keybinding reference |
docs/ROADMAP.md |
Project roadmap and planned features |
