Skip to content

srdusr/srdwm

Repository files navigation

SRDWM - Cross-Platform Window Manager

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.

Features

Cross-Platform Support

  • 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

Smart Window Placement

  • 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

Window Management

  • 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

Lua Configuration

  • Scriptable configuration with full Lua API
  • Real-time configuration reloading
  • Platform-specific keybindings and settings
  • Theme and decoration customization

Requirements

Linux (X11)

# 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

Linux (Wayland)

# 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

Windows

  • Visual Studio 2019 or later with C++17 support
  • CMake 3.16 or later
  • Lua 5.4 or later

macOS

# Install dependencies via Homebrew
brew install cmake lua pkg-config

# Install Xcode Command Line Tools
xcode-select --install

Installation

Quick Start (Linux/macOS)

# 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

Building from Source

  1. Clone the repository
git clone https://github.com/srdusr/srdwm.git
cd srdwm
  1. Create build directory
mkdir build
cd build
  1. Configure and build
cmake -S . -B build
cmake --build build -j$(nproc)
  1. Install
sudo cmake --install build --prefix /usr/local

Platform-Specific Installation

Linux

# Install to system
sudo cmake --install build --prefix /usr/local

# Or install to user directory
make install DESTDIR=$HOME/.local

Windows

# Build with Visual Studio
cmake -G "Visual Studio 16 2019" -A x64 ..
cmake --build . --config Release

# Install
cmake --install . --prefix "C:\Program Files\SRDWM"

macOS

# Build and install
make -j$(sysctl -n hw.ncpu)
sudo make install

Configuration

Basic Configuration

Create 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!")

Platform-Specific Configuration

Linux X11

-- 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

Linux Wayland

-- 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

-- 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

-- 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

Usage

Starting SRDWM

Linux

# X11
srdwm --platform x11

# Wayland
srdwm --platform wayland

Windows

# Start from command line
srdwm.exe

# Or add to startup

macOS

# Start from command line
srdwm

# Or add to login items

Keybindings

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

Layouts

  • Tiling: Traditional tiling layout
  • Dynamic: Smart placement with Windows 11-style algorithms
  • Floating: Free-form window placement

Testing

Running Tests

# Build tests
cd build
make

# Run all tests
ctest

# Run specific tests
./tests/test_smart_placement
./tests/test_platform_factory
./tests/test_lua_manager

Platform-Specific Tests

# Linux X11
./tests/test_x11_platform

# Linux Wayland
./tests/test_wayland_platform

# Windows
./tests/test_windows_platform

# macOS
./tests/test_macos_platform

One-command dependency installers

# 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.sh

For 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.

Documentation

Installed binary and desktop sessions

  • The installed binary is named srdwm (a compatibility symlink SRDWM is 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
  • If your display manager (GDM/SDDM/LightDM) doesn’t show them, ensure it reads sessions from /usr/local/share/*sessions or 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/local

Using SRDWM from another CMake project

After 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/local if 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).

Contributing

We welcome contributions! Please see CONTRIBUTING.md for details.

Development Setup

# 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

Acknowledgments

  • Hyprland for Wayland compositor inspiration
  • DWM for X11 window management concepts
  • i3 for tiling layout ideas
  • Windows 11 for smart placement algorithms

Support

License

This project is licensed under the MIT License - see the LICENSE file for details.

About

Cross-platform Window Manager

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published