uxwm is a small X11 window manager written in C.
It is a dwm-style manager with:
- one tiling layout
- one floating mode
- one monocle layout
- 9 tags
- a simple Xft status bar
- mouse move/resize for floating windows
- Xinerama multi-monitor support
This repo is the window manager itself, not a full desktop environment.
- tiling, floating, and monocle layouts
- master/stack resizing
- moving windows between tags and monitors
- fullscreen via EWMH and keybinding
- runtime gaps toggle
- root-window status text via
xsetroot - built-in clock when no external status text is set
- basic EWMH state for:
_NET_ACTIVE_WINDOW,_NET_WM_STATE_FULLSCREEN,_NET_CURRENT_DESKTOP,_NET_WM_DESKTOP,_NET_CLIENT_LIST,_NET_CLIENT_LIST_STACKING
- not Wayland
- not a compositor
- not a panel system
- not a dynamic plugin system
- not runtime-configurable without rebuild
Current rough edges:
- config is edited in
wm/config.hand requires rebuild - default keybindings assume a few external tools exist
- no dock/strut handling yet
- no restart/reload command yet
Arch:
sudo pacman -S base-devel libx11 libxinerama libxft fontconfig dmenuDebian / Ubuntu:
sudo apt install build-essential libx11-dev libxinerama-dev libxft-dev libfontconfig-dev suckless-toolsBuild:
make
sudo make installInstalled binaries:
uxwmux-sessionuxmenu_run
The shipped wm/config.h uses:
stdmenu_runfirefoxpamixerbrightnessctlscrot
If you do not use those tools, change wm/config.h.
Minimal:
echo 'exec uxwm' > ~/.xinitrc
startxWith the helper session script:
echo 'exec ux-session' > ~/.xinitrc
startxux-session optionally runs:
~/.config/uxwm/autostart~/.config/uxwm/status.sh
Create a sample autostart file with:
./setup.shXephyr :1 -screen 1280x720 &
DISPLAY=:1 uxwmSuper + Return: terminalSuper + p: launcherSuper + w: browserSuper + j / k: focus next / previousSuper + h / l: shrink / grow masterSuper + i / d: increase / decrease master countSuper + t / f / m: tile / floating / monocleSuper + Space: cycle layoutsSuper + g: toggle gapsSuper + Shift + Space: toggle floatingSuper + Shift + f: toggle fullscreenSuper + Shift + Return: move focused window to masterSuper + 1..9: view tagSuper + Shift + 1..9: send window to tagSuper + Tab: previous tag viewSuper + , / .: focus previous / next monitorSuper + Shift + c: close focused windowSuper + Shift + q: quit
Mouse:
Super + Button1: move windowSuper + Button2: toggle floatingSuper + Button3: resize window
More detail: docs/KEYBINDINGS.md
Edit wm/config.h, then rebuild:
make clean
make
sudo make installImportant defaults:
unsigned int borderpx = 2;
unsigned int gappx = 10;
unsigned int snap = 32;
const float mfact = 0.55;
const int nmaster = 1;If you want external status text:
xsetroot -name " vol: 80% Tue Mar 23 14:23 "If root window name is empty, uxwm shows its own clock.
wm/
├── uxwm.c main
├── x11.c event loop and X11 lifecycle
├── wm.c client management and bar logic
├── input.c keybindings and mouse actions
├── layout.c tile and monocle
├── drw.c/h drawing helpers
├── util.c/h small utilities
└── config.h config
MIT