aboutsummaryrefslogtreecommitdiff
# 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)** ```bash # 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)** ```bash # 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** ```bash # Install dependencies via Homebrew brew install cmake lua pkg-config # Install Xcode Command Line Tools xcode-select --install ``` ## Installation ### **Quick Start (Linux/macOS)** ```bash # 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** ```bash git clone https://github.com/srdusr/srdwm.git cd srdwm ``` 2. **Create build directory** ```bash mkdir build cd build ``` 3. **Configure and build** ```bash cmake -S . -B build cmake --build build -j$(nproc) ``` 4. **Install** ```bash sudo cmake --install build --prefix /usr/local ``` ### **Platform-Specific Installation** #### **Linux** ```bash # Install to system sudo cmake --install build --prefix /usr/local # Or install to user directory make install DESTDIR=$HOME/.local ``` #### **Windows** ```cmd # 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** ```bash # Build and install make -j$(sysctl -n hw.ncpu) sudo make install ``` ## Configuration ### **Basic Configuration** Create your configuration file at `~/.config/srdwm/init.lua`: ```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** ```lua -- 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** ```lua -- 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** ```lua -- 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** ```lua -- 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** ```bash # X11 srdwm --platform x11 # Wayland srdwm --platform wayland ``` #### **Windows** ```cmd # Start from command line srdwm.exe # Or add to startup ``` #### **macOS** ```bash # 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** ```bash # 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** ```bash # 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** ```bash # 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 - [API Documentation](docs/api.md) - [Configuration Guide](docs/configuration.md) - [Platform Implementation](docs/platforms.md) - [Contributing Guide](CONTRIBUTING.md) ## 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: ```bash 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 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: ```powershell 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](CONTRIBUTING.md) for details. ### **Development Setup** ```bash # 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 - **Issues**: [GitHub Issues](https://github.com/srdusr/srdwm/issues) - **Discussions**: [GitHub Discussions](https://github.com/srdusr/srdwm/discussions) - **Wiki**: [GitHub Wiki](https://github.com/srdusr/srdwm/wiki) ## License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.