SRDWM is a modern, cross-platform window manager that provides a unified window management experience across Linux (X11/Wayland), Windows, and macOS. It features smart window placement, togglable decorations, and easy switching between tiling and floating layouts.
- Linux X11: Full server-side decoration control with frame windows
- Linux Wayland: Modern wlroots compositor with zxdg-decoration protocol
- Windows: Native DWM border integration with global hooks
- macOS: Platform-constrained but functional with overlay windows
- Windows 11-style grid placement with optimal cell sizing
- Cascade placement for overlapping windows
- Snap-to-edge functionality
- Overlap detection and free space finding algorithms
- Togglable decorations with custom border colors and widths
- Easy tiling/floating toggle with per-window state management
- Multiple layout engines: Tiling, Dynamic, and Floating modes
- Smart placement integration for floating windows
- Scriptable configuration with full Lua API
- Real-time configuration reloading
- Platform-specific keybindings and settings
- Theme and decoration customization
# Ubuntu/Debian
sudo apt install build-essential cmake pkg-config liblua5.4-dev \
libx11-dev libxrandr-dev libxinerama-dev libxcb-dev \
libxcb-keysyms1-dev libxcb-icccm4-dev
# Fedora
sudo dnf install gcc-c++ cmake pkgconfig lua-devel \
libX11-devel libXrandr-devel libXinerama-devel libxcb-devel \
libxcb-keysyms-devel libxcb-icccm-devel
# Arch Linux
sudo pacman -S base-devel cmake pkgconf lua \
libx11 libxrandr libxinerama libxcb \
xcb-util xcb-util-keysyms xcb-util-wm# Ubuntu/Debian
sudo apt install build-essential cmake pkg-config liblua5.4-dev \
libwayland-dev wayland-protocols libwlroots-dev
# Fedora
sudo dnf install gcc-c++ cmake pkgconfig lua-devel \
wayland-devel wayland-protocols-devel wlroots-devel
# Arch Linux
sudo pacman -S base-devel cmake pkgconf lua \
wayland wayland-protocols wlroots- Visual Studio 2019 or later with C++17 support
- CMake 3.16 or later
- Lua 5.4 or later
# Install dependencies via Homebrew
brew install cmake lua pkg-config
# Install Xcode Command Line Tools
xcode-select --install# Clone and bootstrap (deps + build + test + install)
git clone https://github.com/srdusr/srdwm.git
cd srdwm
bash scripts/bootstrap.sh --all
# X11-only build
# bash scripts/bootstrap.sh --all --no-wayland
# Real Wayland backend (requires wlroots deps)
# bash scripts/bootstrap.sh --all --real-wayland- Clone the repository
git clone https://github.com/srdusr/srdwm.git
cd srdwm- Create build directory
mkdir build
cd build- Configure and build
cmake -S . -B build
cmake --build build -j$(nproc)- Install
sudo cmake --install build --prefix /usr/local# Install to system
sudo cmake --install build --prefix /usr/local
# Or install to user directory
make install DESTDIR=$HOME/.local# Build with Visual Studio
cmake -G "Visual Studio 16 2019" -A x64 ..
cmake --build . --config Release
# Install
cmake --install . --prefix "C:\Program Files\SRDWM"# Build and install
make -j$(sysctl -n hw.ncpu)
sudo make installCreate your configuration file at ~/.config/srdwm/init.lua:
-- Basic SRDWM configuration
print("Loading SRDWM configuration...")
-- Global settings
srd.set("general.decorations_enabled", true)
srd.set("general.border_width", 3)
srd.set("general.border_color", "#2e3440")
-- Layout settings
srd.set("general.default_layout", "dynamic")
srd.set("general.smart_placement", true)
-- Keybindings
srd.bind("Mod4+Return", function()
-- Open terminal
srd.spawn("alacritty")
end)
srd.bind("Mod4+q", function()
-- Close focused window
srd.window.close()
end)
srd.bind("Mod4+f", function()
-- Toggle floating
local window = srd.window.focused()
if window then
srd.window.toggle_floating(window.id)
end
end)
-- Layout switching
srd.bind("Mod4+1", function() srd.layout.set("tiling") end)
srd.bind("Mod4+2", function() srd.layout.set("dynamic") end)
srd.bind("Mod4+3", function() srd.layout.set("floating") end)
print("Configuration loaded successfully!")-- X11-specific settings
if srd.get_platform() == "x11" then
srd.set("general.border_width", 3)
srd.set("general.decorations_enabled", true)
-- X11-specific keybindings
srd.bind("Mod4+x", function()
local window = srd.window.focused()
if window then
srd.window.set_decorations(window.id, not srd.window.get_decorations(window.id))
end
end)
end-- Wayland-specific settings
if srd.get_platform() == "wayland" then
srd.set("general.border_width", 2)
srd.set("general.decorations_enabled", true)
-- Wayland-specific keybindings
srd.bind("Mod4+w", function()
local window = srd.window.focused()
if window then
srd.window.set_decorations(window.id, not srd.window.get_decorations(window.id))
end
end)
end-- Windows-specific settings
if srd.get_platform() == "windows" then
srd.set("general.border_width", 2)
srd.set("general.decorations_enabled", true)
-- Windows-specific keybindings
srd.bind("Mod4+d", function()
local window = srd.window.focused()
if window then
srd.window.set_border_color(window.id, 255, 0, 0) -- Red border
end
end)
end-- macOS-specific settings
if srd.get_platform() == "macos" then
srd.set("general.border_width", 1)
srd.set("general.decorations_enabled", false) -- Limited support
-- macOS-specific keybindings
srd.bind("Mod4+m", function()
print("macOS: Overlay window toggle requested")
end)
end# X11
srdwm --platform x11
# Wayland
srdwm --platform wayland# Start from command line
srdwm.exe
# Or add to startup# Start from command line
srdwm
# Or add to login items| Key | Action |
|---|---|
Mod4+Return |
Open terminal |
Mod4+q |
Close focused window |
Mod4+f |
Toggle floating |
Mod4+1/2/3 |
Switch layouts (tiling/dynamic/floating) |
Mod4+b/n/r |
Change border colors (green/blue/red) |
Mod4+0 |
Reset decorations |
Mod4+s |
Smart placement info |
- Tiling: Traditional tiling layout
- Dynamic: Smart placement with Windows 11-style algorithms
- Floating: Free-form window placement
# Build tests
cd build
make
# Run all tests
ctest
# Run specific tests
./tests/test_smart_placement
./tests/test_platform_factory
./tests/test_lua_manager# Linux X11
./tests/test_x11_platform
# Linux Wayland
./tests/test_wayland_platform
# Windows
./tests/test_windows_platform
# macOS
./tests/test_macos_platform# Ubuntu/Debian
bash scripts/install_deps_ubuntu.sh
# Fedora
bash scripts/install_deps_fedora.sh
# Arch Linux
bash scripts/install_deps_arch.sh
# openSUSE
bash scripts/install_deps_opensuse.sh
# Alpine Linux
bash scripts/install_deps_alpine.sh
# macOS (Homebrew)
bash scripts/install_deps_macos.shFor full package lists per platform see DEPENDENCIES.md.
Wayland is enabled by default with a stub backend for compatibility. Switch to the real wlroots backend with -DUSE_WAYLAND_STUB=OFF (or --real-wayland in scripts/bootstrap.sh) once dependencies are installed.
- The installed binary is named
srdwm(a compatibility symlinkSRDWMis also created in the same directory). - Desktop session files are installed so you can pick SRDWM at login:
- X11 session:
/usr/local/share/xsessions/srdwm.desktop - Wayland session:
/usr/local/share/wayland-sessions/srdwm-wayland.desktop
- X11 session:
- If your display manager (GDM/SDDM/LightDM) doesn’t show them, ensure it reads sessions from
/usr/local/share/*sessionsor adjust your install prefix.
Install options (CMake variables):
-DSRDWM_INSTALL_X11_SESSION=ON|OFF— install X11 session file (default ON)-DSRDWM_INSTALL_WAYLAND_SESSION=ON|OFF— install Wayland session file (default ON)
Example:
cmake -S . -B build -DSRDWM_INSTALL_WAYLAND_SESSION=OFF
cmake --build build -j
sudo cmake --install build --prefix /usr/localAfter installing SRDWM (e.g., sudo cmake --install build --prefix /usr/local on Linux/macOS), you can consume it in another CMake project via find_package and link to the exported target.
Minimal example CMakeLists.txt:
cmake_minimum_required(VERSION 3.20)
project(MyApp LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(SRDWM REQUIRED) # provides SRDWM::SRDWM and pulls Lua automatically
add_executable(my_app main.cc)
target_link_libraries(my_app PRIVATE SRDWM::SRDWM)Notes:
- On Linux/macOS, ensure the install prefix (default
/usr/local) is in CMake’s package search path. You can hint it via-DCMAKE_PREFIX_PATH=/usr/localif needed. - On Windows with vcpkg, pass your toolchain file when configuring your consumer project:
cmake -S . -B build -G Ninja -DCMAKE_TOOLCHAIN_FILE="C:/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake"
- The exported package config internally requires Lua (handled by the SRDWM package config).
We welcome contributions! Please see CONTRIBUTING.md for details.
# Clone with submodules
git clone --recursive https://github.com/srdusr/srdwm.git
cd srdwm
# Install development dependencies
sudo apt install build-essential cmake pkg-config liblua5.3-dev \
libx11-dev libxrandr-dev libxinerama-dev libxcb-dev \
libxcb-keysyms1-dev libxcb-icccm4-dev libwayland-dev \
wayland-protocols libwlroots-dev libgtest-dev
# Build with tests
mkdir build && cd build
cmake -DBUILD_TESTS=ON ..
make -j$(nproc)
# Run tests
ctest- Hyprland for Wayland compositor inspiration
- DWM for X11 window management concepts
- i3 for tiling layout ideas
- Windows 11 for smart placement algorithms
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Wiki: GitHub Wiki
This project is licensed under the MIT License - see the LICENSE file for details.