https://github.com/wegel/vwl
A simple but powerful tiling window manager for Wayland.
https://github.com/wegel/vwl
dwl dwm tiling-window-manager tiling-wm wayland wlroots
Last synced: 8 months ago
JSON representation
A simple but powerful tiling window manager for Wayland.
- Host: GitHub
- URL: https://github.com/wegel/vwl
- Owner: wegel
- License: other
- Created: 2025-09-18T03:42:39.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-10-08T14:19:38.000Z (9 months ago)
- Last Synced: 2025-10-08T16:21:51.875Z (9 months ago)
- Topics: dwl, dwm, tiling-window-manager, tiling-wm, wayland, wlroots
- Language: C
- Homepage:
- Size: 463 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README
- License: LICENSE
Awesome Lists containing this project
README
vwl
===
wlroots-based Wayland compositor with virtual outputs and physical cursor continuity.
Originally forked from dwl.
LOC: 5275 total, 2770 vwl.c
FEATURES
--------
- virtual outputs (split physical monitors into independent workspaces)
- physical cursor continuity (smooth cursor movement across monitor gaps)
- master/stack tiling
- tabbed layout
- fullscreen modes (virtual/monitor)
- per-workspace layout state
- floating windows
- XWayland support
KEYBINDS
--------
mod = logo key
mod+return spawn terminal
mod+d spawn menu
mod+q kill client
mod+j/k focus next/prev
mod+h/l adjust master width
mod+m zoom (swap master)
mod+f toggle fullscreen (virtual->monitor->off)
mod+t toggle tabbed layout
mod+space cycle layout
mod+shift+space toggle floating
mod+shift+e quit compositor
mod+comma focus monitor left
mod+period focus monitor right
mod+shift+> move client to monitor left/right
mod+0-9 view workspace 0-9
mod+shift+0-9 move client to workspace 0-9
mod+ctrl+shift+h/j/k/l move workspace to virtual output
BUILDING
--------
make
RUNNING
-------
./vwl
DEPENDENCIES
------------
wlroots 0.19, wayland-server, xkbcommon, libinput, pixman
optional: xcb, xcb-icccm (for XWayland)
CONFIGURATION
-------------
Edit config.def.h and recompile.
Key settings:
- physical cursor gap jumps: enable_physical_cursor_gap_jumps
- virtual output rules: vorules[]
- monitor rules: monrules[]
- keyboard/trackpad settings
VIRTUAL OUTPUTS
---------------
Split physical monitors into named regions. Each region gets its own workspace.
Move workspaces between regions with mod+ctrl+shift+hjkl.
static const VirtualOutputRule vorules[] = {
/* monitor name x y w h mfact nmaster lt[0] lt[1] */
{ "DP-1", "left", 0, 0, 960, 1080, 0.55f, 1, &layouts[0], &layouts[1] },
{ "DP-1", "right", 960, 0, 960, 1080, 0.55f, 1, &layouts[0], &layouts[1] },
};
w/h of 0 = expand to monitor's remaining space.
mfact = master area factor (0.0-1.0).
nmaster = number of master windows.
lt[0]/lt[1] = primary/secondary layout functions.
FULLSCREEN MODES
----------------
- Virtual fullscreen: fills virtual output region
- Monitor fullscreen: fills entire physical monitor
Toggle with mod+f cycles through: off -> virtual -> monitor -> off
PHYSICAL CURSOR CONTINUITY
---------------------------
Seamless cursor tracking across monitor gaps. Set physical dimensions in monrules[].
static const MonitorRule monrules[] = {
/* name scale transform x y phys{} */
{ "DP-1", 1.0f, WL_OUTPUT_TRANSFORM_NORMAL, 0, 0, {
.width_mm = 520, /* physical width in mm */
.height_mm = 320, /* physical height in mm */
.x_mm = 0, /* physical X position */
.y_mm = 0, /* physical Y position */
.size_is_set = 1, /* use explicit size */
.origin_is_set = 1, /* use explicit origin */
}},
{ NULL, 1, WL_OUTPUT_TRANSFORM_NORMAL, -1, -1, {} }, /* fallback */
};
x/y = pixel position (-1,-1 = auto).
scale = HiDPI factor.
transform = rotation (NORMAL/90/180/270/FLIPPED_*).
phys{} = real-world dimensions for cursor math.
STATUS
------
Work in progress, used daily by the dev.