### I WON'T BE UPDATING THIS PROJECT FOR A MONTH OR SO DUE TO EXAMS ### ISSUES PR's ETC WELCOME, JUST DON'T EXPECT A SOLUTION FROM ME QUICKLY 🥀🥀

Minimal. Fast. Configurable. Tiling Window Manager for X11
Abhinav Prasai (2025)

--- ## Features - **Tiling & Floating**: Switch seamlessly between layouts. - **Workspaces**: 9 workspaces, fully integrated with your bar. - **Live Config Reload**: Change your config and reload instantly with a keybind. - **Easy Configuration**: Human-friendly `sxwmrc` file, no C required. - **Master-Stack Layout**: Productive, DWM-inspired workflow. - **Mouse Support**: Move, swap, resize, and focus windows with the mouse. - **Zero Dependencies**: Only `libX11` and `Xinerama` required. - **Lightweight**: Single C file, minimal headers, compiles in seconds. - **Bar Friendly**: Works great with [sxbar](https://github.com/uint23/sxbar). - **Xinerama Support**: Multi-monitor ready. - **Fast**: Designed for speed and low resource usage. --- ## Screenshots
--- ## Patch Notes
Click to expand #### v1.5 - Ready for Release - **NEW**: Using XCursor instead of cursor font && new logo. - **FIXED**: Proper bind resetting on refresh config. && Multi-arg binds now work due to new and improved spawn function - **CHANGE**: No longer using INIT_WORKSPACE macro, proper workspace handling. New sxwmrc #### v1.4 - **CHANGE**: Added motion throttle && master width general options #### v1.3 - **CHANGE**: ulong, u_char uint are gone #### v1.2 - **NEW**: Parser support - **FIXED**: Quit syntax && Freeing cursor on exit #### v1.1 - **NEW**: Xinerama support, swap windows with Mod + Shift + Drag - **FIXED**: New windows in `global_floating` mode spawn centered
--- ## Configuration (`~/.config/sxwmrc`) `sxwm` is configured via a simple text file located at `~/.config/sxwmrc`. Changes can be applied instantly by reloading the configuration (default keybind: `MOD + r`). The file uses a `key : value` format. Lines starting with `#` are ignored. ### General Options | Option | Type | Default | Description | | ----------------------- | ------- | --------- | --------------------------------------------------------------------------- | | `mod_key` | String | `super` | Sets the primary modifier key (`alt`, `super`, `ctrl`). | | `gaps` | Integer | `10` | Pixels between windows and screen edges. | | `border_width` | Integer | `1` | Thickness of window borders in pixels. | | `focused_border_colour` | Hex | `#c0cbff` | Border color for the currently focused window. | | `unfocused_border_colour`| Hex | `#555555` | Border color for unfocused windows. | | `swap_border_colour` | Hex | `#fff4c0` | Border color highlight when selecting a window to swap with (`MOD+Shift+Drag`).| | `master_width` | Integer | `60` | Percentage (%) of the screen width the master window should occupy. | | `resize_master_amount` | Integer | `1` | Percentage (%) to increase/decrease the master width when resizing. | | `snap_distance` | Integer | `5` | Pixels from screen edge before a floating window snaps to the edge. | | `motion_throttle` | Integer | `60` | Target updates per second for mouse drag operations (move/resize/swap). Set close to your monitor's refresh rate for smoother visuals. | ### Keybindings Keybindings associate key combinations with actions (either running external commands or internal `sxwm` functions). **Syntax:** ``` sh bind : [modifier + modifier + ... + key] : action ``` - **`bind`**: Keyword to define a keybinding. - **`[...]`**: Contains the key combination. - **Modifiers**: `mod` (uses the key set by `mod_key`), `shift`, `ctrl`, `alt`, `super`. Use `+` to combine multiple modifiers. - **`key`**: The final key name (e.g., `Return`, `q`, `1`, `equal`, `space`). Key names generally follow X11 keysym names but are case-insensitive in the config. - **`:`**: Separator. - **`action`**: - **Command**: An external command enclosed in double quotes (`"`). Arguments are separated by spaces (e.g., `"st -e vim"`). - **Function**: The name of an internal `sxwm` function (see list below). **Available Functions:** | Function Name | Action | | -------------------- | ----------------------------------------------------------- | | `close_window` | Closes the currently focused window. | | `decrease_gaps` | Decreases the gap size between windows. | | `focus_next` | Shifts focus to the next window in the stack/list. | | `focus_previous` | Shifts focus to the previous window in the stack/list. | | `increase_gaps` | Increases the gap size between windows. | | `master_next` | Moves the focused window down the master/stack order. | | `master_previous` | Moves the focused window up the master/stack order. | | `quit` | Exits `sxwm`. | | `reload_config` | Reloads the `sxwmrc` configuration file. | | `master_increase` | Increases the width allocated to the master area. | | `master_decrease` | Decreases the width allocated to the master area. | | `toggle_floating` | Toggles the floating state of the focused window. | | `global_floating` | Toggles the floating state for *all* windows on the current workspace. | | `fullscreen` | Toggles fullscreen mode for the focused window. | | `change_ws[1-9]` | Switches focus to the specified workspace (1-9). | | `moveto_ws[1-9]` | Moves the focused window to the specified workspace (1-9). | **Example Bindings:** ```yaml # Launch terminal with Mod + Enter bind : [mod + Return] : "st" # Close focused window with Mod + Shift + Q bind : [mod + shift + q] : close_window # Switch to workspace 3 with Mod + 3 bind : [mod + 3] : change_ws3 # Move focused window to workspace 5 with Mod + Shift + 5 bind : [mod + shift + 5] : moveto_ws5 ``` --- ## Default Keybindings ### Window Management | Combo | Action | | ---------------------------- | ------------------------- | | Mouse | Focus under cursor | | `MOD` + Left Mouse | Move window by mouse | | `MOD` + Right Mouse | Resize window by mouse | | `MOD` + `j` / `k` | Focus next / previous | | `MOD` + `Shift` + `j` / `k` | Move in master stack | | `MOD` + `Space` | Toggle floating | | `MOD` + `Shift` + `Space` | Toggle all floating | | `MOD` + `=` / `-` | Increase/Decrease gaps | | `MOD` + `f` | Fullscreen toggle | | `MOD` + `q` | Close focused window | | `MOD` + `1-9` | Switch workspace 1–9 | | `MOD` + `Shift` + `1-9` | Move window to WS 1–9 | ### Programs | Combo | Action | Program | | -------------------- | ---------- | ---------- | | `MOD` + `Return` | Terminal | `st` | | `MOD` + `b` | Browser | `firefox` | | `MOD` + `p` | Launcher | `dmenu_run`| --- ## Dependencies - `libX11` (Xorg client library) - `Xinerama` - GCC or Clang & Make --- ## Build & Install ### Arch Linux (AUR) ```sh yay -S sxwm ``` ### Build from Source ```sh git clone --depth=1 https://github.com/uint23/sxwm.git cd sxwm/ make sudo make clean install ``` ### Run Add to your `~/.xinitrc`: ```sh exec sxwm ``` --- ## Makefile Targets | Target | Description | | --------------------- | --------------------------------------------------- | | `make` / `make all` | Build the `sxwm` binary | | `make clean` | Remove object files and build artifacts | | `make install` | Install `sxwm` to `$(PREFIX)/bin` (default `/usr/local/bin`) | | `make uninstall` | Remove the installed binary | | `make clean install` | Clean and then install | > Override install directory with `PREFIX` or `DESTDIR`: > ```sh > make install PREFIX=$HOME/.local > ``` --- ## Thanks & Inspiration - [dwm](https://dwm.suckless.org) — Tiling & source code - [i3](https://i3wm.org) — Easy configuration - [sowm](https://github.com/dylanaraps/sowm) — README inspiration - [tinywm](http://incise.org/tinywm.html) — Minimal X11 WM ---

Contributions welcome! Open issues or submit PRs.