- Zig 98.3%
- Makefile 1.7%
rowm
⚠️ Personal Learning Project
This is a personal project I built for fun and to learn Zig.
While it works for my daily use, you should probably use the original dwm/spectrwm instead.
This project is more of a learning exercise and personal experiment than a production-ready alternative.
Features
- Multiple layouts: Three built-in layouts (tile, monocle, grid) with per-monitor selection
- Multi-monitor support: Full Xinerama support with focus-follows-mouse across monitors
- Status bar: Clickable workspaces, layout indicator, and window titles
- Customizable workspaces: Name workspaces ("web", "code", "media", etc.) instead of just numbers
- Keyboard-driven: Control everything with keyboard shortcuts
- Lightweight: Minimal resource usage
- Customizable: Edit
src/config.zigto configure keybindings, colors, workspaces, and behavior - Memory-safe: Written in Zig for better safety guarantees than C
Requirements
- Zig compiler (0.15.0 or newer)
- X11 development libraries: libX11, libXinerama, libXft, libfontconfig
sudo apt install libx11-dev libxinerama-dev libxft-dev libfontconfig-dev # debian
sudo pacman -S libx11 libxinerama libxft fontconfig # arch
Building / Testing / Installing
Please read the Makefile, everything is in there.
Configuration
Configuration is done in source code, for now.
On first build, src/config.zig will be automatically created from src/config.def.zig. This is the suckless pattern - you customize config.zig and it won't conflict with upstream updates.
Edit src/config.zig to customize:
- Workspace names: Change
pub const tagsarray (e.g., "web", "code", "media" instead of "1"-"9") - Keybindings: Modify the
keysarray - Colors: Change border and window colors
- Layout: Adjust master area factor, border width
- Terminal: Set your preferred terminal emulator
After editing, rebuild with make build.
Keybindings
See docs/keybindings.md for the complete list of default keybindings.
Current Status
This is a functional implementation with solid core features:
- ✅ Full window management (map, unmap, destroy, configure)
- ✅ Three layouts: tile (master/stack), monocle (maximized window only), grid
- ✅ Complete keyboard and mouse control
- ✅ Focus management with focus-follows-mouse
- ✅ Full Xinerama and RandR multi-monitor support with hotplug
- ✅ Status bar with clickable tags and layout cycling
- ✅ Per-monitor layout and tag selection
- ✅ Floating window support with mouse move/resize
- ✅ Tag system (9 workspaces per monitor, single-tag-per-window)
- ✅ Fullscreen support with Alt+F keybinding
- ⚠️ Basic EWMH support (atoms: WM_DELETE_WINDOW, WM_TAKE_FOCUS, _NET_WM_NAME, _NET_WM_WINDOW_TYPE)
Known Issues & Limitations
Limitations (by design)
- Single-tag-per-window: Windows can only be on one workspace at a time. A simplified design choice for clarity.
Minor Issues
- Grid layout rounding: With certain workspace dimensions, the grid layout may leave small gaps due to integer division.
- Monocle layout overhead: The layout unmaps/remaps windows on every redraw, which could cause visible flicker on slower systems.
Planned Improvements
To make this project "production-ready", the following features/fixes should be prioritized:
Important (Improves Compatibility)
- Expand EWMH atom support - Add
_NET_CLIENT_LIST,_NET_WM_STRUTfor better taskbar/panel compatibility (window type support now implemented) - External status text - Support reading status from
~/.dwmstatusfile or environment variable (simpler than dwmblocks)
Enhancement (Nice to Have)
- Improve layout algorithms - Fix grid layout rounding, optimize monocle to avoid unmapping, add equal-area layout
- Configuration improvements - Support per-workspace layout preferences, remember window positions
- Better test coverage - Add integration tests for layouts, multi-monitor scenarios, and EWMH compliance
- Per-window quirks - Auto-float specific applications (inspired by spectrwm)
- Runtime configuration - Load settings from file without recompiling
License
MIT License - see LICENSE file for details
Acknowledgments
- Original dwm by suckless.org
- spectrwm for additional inspiration
- Zig programming language