1
0
Fork
You've already forked rowm
0
just for me to have fun, please use dwm/spectrwm instead
  • Zig 98.3%
  • Makefile 1.7%
Romain Bertrand 0f9a8960f1
All checks were successful
CI / lint (push) Successful in 21s
CI / build (push) Successful in 1m5s
CI / test (push) Successful in 39s
Merge pull request 'feat: implement window size hints during tiling' ( #11 ) from feature/window-size-hints into main
Reviewed-on: #11 
2026年01月09日 12:05:29 +01:00
.gitea/workflows ci: add missing libxrandr to ci env 2026年01月03日 10:33:55 +01:00
docs chore: rename to rowm 2026年01月05日 08:52:28 +01:00
src feat: implement window size hints during tiling 2026年01月09日 11:47:27 +01:00
test tests: fix unit tests 2026年01月04日 20:20:54 +01:00
.editorconfig tools: indent=4 in more file types 2026年01月03日 10:34:24 +01:00
.gitignore config: use the .def.zig for config 2025年12月30日 18:47:21 +01:00
build.zig chore: rename to rowm 2026年01月05日 08:52:28 +01:00
LICENSE docs: add MIT license 2025年12月30日 17:32:47 +01:00
Makefile chore: rename to rowm 2026年01月05日 08:52:28 +01:00
README.md feat: implement window size hints during tiling 2026年01月09日 11:47:27 +01:00
ROADMAP.md feat: implement window size hints during tiling 2026年01月09日 11:47:27 +01:00
rowm.desktop chore: rename to rowm 2026年01月05日 08:52:28 +01:00
test_root.zig tests: move tests outside of code 2026年01月02日 18:56:30 +01:00
zlint.json lint: don't try to lint the zig installation dir 2025年12月30日 11:54:53 +01:00

rowm

CI License: MIT Zig

⚠️ 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.zig to 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 tags array (e.g., "web", "code", "media" instead of "1"-"9")
  • Keybindings: Modify the keys array
  • 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)

  1. Expand EWMH atom support - Add _NET_CLIENT_LIST, _NET_WM_STRUT for better taskbar/panel compatibility (window type support now implemented)
  2. External status text - Support reading status from ~/.dwmstatus file or environment variable (simpler than dwmblocks)

Enhancement (Nice to Have)

  1. Improve layout algorithms - Fix grid layout rounding, optimize monocle to avoid unmapping, add equal-area layout
  2. Configuration improvements - Support per-workspace layout preferences, remember window positions
  3. Better test coverage - Add integration tests for layouts, multi-monitor scenarios, and EWMH compliance
  4. Per-window quirks - Auto-float specific applications (inspired by spectrwm)
  5. Runtime configuration - Load settings from file without recompiling

License

MIT License - see LICENSE file for details

Acknowledgments