Skip to content

wegel/vwl

Repository files navigation

vwl
===

wlroots-based Wayland compositor with virtual outputs and physical cursor continuity.
Originally forked from dwl.

LOC: 5248 total, 2744 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.

HOWTOS
------

§ startup script (~/.config/vwl/run):
	#!/bin/sh
	waybar &
	swayidle -w \
	  timeout 300 'swaylock -f' \
	  timeout 600 'wlopm --off \*' \
	  resume 'wlopm --on \*' \
	  before-sleep 'swaylock -f' &

§ Manual lock with swayidle (config.h):
	static const char *lockcmd[] = { "sh", "-c", "sleep 1 && killall -USR1 swayidle", NULL };
	/* ... */
	{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_L, spawn, {.v = lockcmd} },

SIGUSR1 triggers swayidle's lock timeout, ensuring wake-on-input works.

§ Screenshot (config.h):
	static const char *screenshotcmd[] = { "sh", "-c",
	  "grim -g \"$(slurp)\" ~/Pictures/Screenshots/$(date +'%Y-%m-%d_%H-%M-%S').png", NULL };
	static const char *screenshotclipboardcmd[] = { "sh", "-c",
	  "slurp | grim -g - - | wl-copy", NULL };
	/* ... */
	{ 0,     XKB_KEY_Print, spawn, {.v = screenshotcmd} },
	{ MODKEY, XKB_KEY_Print, spawn, {.v = screenshotclipboardcmd} },

STATUS
------
Work in progress, used daily by the dev.

About

A simple but powerful tiling window manager for Wayland.

Topics

Resources

License

Unknown, Unknown licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE.dwl

Stars

Watchers

Forks