fwm/docs/keybindings

Keybindings and actions

Nothing here is hard-coded. Every entry in the default table below is an ordinary [binds] line you can change, and every drag verb is an ordinary [mouse] line. Super+Shift+? shows the live list on screen.

Contents: defaults · actions · modes · mouse · gestures · the desktop strip · the launcher

Default bindings

These are also the built-ins fwm falls back on when [binds] is missing or unusable, so they work on a machine with no config at all.

Windows

Bind Action Does
Super+Return terminal $TERMINAL, else the first emulator installed
Super+Space launcher the application launcher
Super+Q killclient close the focused window
Super+D fake_fullscreen fill the work area, keep the tray and the gaps
Super+F real_fullscreen true fullscreen, tray hidden
Super+P pin_window freeze it: physics stops moving it
Super+N toggle_nocollide other windows pass through it
Super+R spin_window hand its rotation to the simulation (experimental)
Super+W group_toggle tab this window together with the focused group
Super+Tab / Super+Shift+Tab group_next / group_prev walk the tabs
Super+Shift+W group_add add the focused window to the group

Layout

Bind Action Does
Super+T toggle_tiling BSP tiling on this desktop, on/off
Super+Alt+Space toggle_floating floating mode on this desktop
Super+S toggle_split flip the next BSP split direction
Super+←→↑↓ `tile_focus:l r
Super+Shift+←→↑↓ `tile_move:l r

Desktops and camera

Bind Action Does
Super+10 view:0view:9 jump to a desktop
Super+Shift+10 move_to:0move_to:9 send the focused window there
Super+Ctrl+← / Super+Ctrl+→ view:prev / view:next one desktop over; wraps round the ring at either end
Super+H / Super+L move_camera:-50 / move_camera:50 pan the camera (hold to repeat)
Super+A expo the desktop strip

Everything else

Bind Action Does
Super+G cycle_gravity walk gravity_steps
Super+Shift+C calm_all stop every window dead
Super+J toggle_tray hide/show the status strip
Super+Shift+P wallpaper_picker pick a wallpaper
Print screenshot copy the monitor under the pointer
Super+Shift+S screenshot_region drag a rectangle out and copy that
Super+Shift+R reload_config reload the config file
Super+Shift+? show_hints the key hints overlay
Super+Shift+Escape EXIT leave the session

Actions

Any of these can be bound in [binds], in a [mode.*], in [mouse], in [gestures], or run from a script with fwmctl dispatch <action>. An unknown action is reported when the config loads rather than doing nothing when pressed.

Windows

Action Does
killclient close the focused window
pin_window toggle pinned: physics never moves it
toggle_nocollide toggle pass-through for this window
toggle_nocollide_all …for every window at once
spin_window give the focused window a spin (experimental)
spin_all …every window
calm_all zero every velocity
fake_fullscreen fill the work area, keep the tray. Sits exactly where a single tile would: same monitor work area, same [tiling] gaps_out.
real_fullscreen true fullscreen
group_toggle, group_next, group_prev, group_add tab groups

Layout and desktops

Action Does
toggle_tiling tiling on this desktop
toggle_tiling_all …on every desktop
toggle_floating floating mode on this desktop
toggle_floating_all …on every desktop
toggle_split flip the next BSP split
`tile_focus:l r
`tile_move:l r
view:<0-9> show that desktop
move_to:<0-9> send the focused window there
`move_to_view:next prev`
move_camera:<px> pan by that many px (negative = left); holdable
expo the desktop strip
toggle_wrap close the strip into a ring, or open it

World

Action Does
cycle_gravity walk [physics] gravity_steps
toggle_sun shadows on or off outright
sun_mode swap the clock for your hand and back; taking hold leaves the sun where it stood
sun_azimuth:<deg> turn the light. +15 / -15 step, a bare number points it there
sun_elevation:<deg> raise or lower it, same two forms. Below the horizon is night

Interface

Action Does
launcher the application launcher
terminal a terminal
toggle_tray hide/show the status strip
modes_menu open the modes menu (same as clicking the tray pill)
show_hints the key hints overlay
show_errors the config-problem panel (same as clicking the ⚠ pill)
wallpaper_picker the wallpaper picker
screenshot the whole monitor under the pointer, as a PNG on the clipboard
screenshot_region dim the screen, drag a rectangle out, copy that; Escape cancels
reload_config reload config.toml, discarding every fwmctl set

Monitors

Action Does
output_off turn off the monitor under the cursor (never the last lit one)
toggle_internal_output the laptop panel on/off — for docking
outputs_on turn every monitor back on

Escapes

Action Does
spawn:<command> run it through a shell, so spawn:$BROWSER --new-window works
mode:<name> switch keymaps; mode:default returns to the root map
global:<app_id>:<name> hand the key to an external shell — see below
EXIT end the session

Giving a key to an external shell

A Wayland client cannot see a key it is not focused for, so an outside launcher can never answer Super+Space by itself: the compositor has to hand the press over. global: is that handover, over hyprland-global-shortcuts-v1, which Quickshell exposes as its GlobalShortcut type.

The client registers a named action and says nothing about keys — which keys reach it stays fwm’s decision:

GlobalShortcut { appid: "quickshell"; name: "launcher"; onPressed: /* ... */ }
[binds]
"super+space" = "global:quickshell:launcher"   # instead of "launcher"

Binding the key away from launcher is what makes this replace fwm’s own launcher rather than sit beside it. Nothing has registered the name yet — the shell is not running — and the key does nothing but say so in the log.

Modes (submaps)

A second keymap you step into, so single keys can mean something. While a mode is active it owns the keyboard: its binds fire, Escape leaves, and every other key does nothing rather than reaching the application underneath — which is what makes a bare g safe to bind.

[mode.physics]
enter  = "super+o"
"g"    = "cycle_gravity"
"c"    = "calm_all"
"r"    = "spin_all"

One-shot by default: the first action drops you back. sticky = true keeps the mode open until Escape, for something you mean to repeat. The tray shows the mode’s name while it is active. Up to 8 modes.

Mouse drags

[mouse]
"super+left"       = "move"
"super+shift+left" = "move_nocollide"
"super+right"      = "resize"
"super+ctrl+left"  = "twist"

Buttons are left, right, middle, side, extra; modifiers are matched exactly. The five verbs are the ones only a drag can express, and what they mean depends on the desktop’s mode:

Verb Physics / floating Tiling
move drag, and let go while moving to throw pull the tile out of the layout and put it down anywhere, including on another desktop
move_nocollide drag it through everything swap two tiles
resize resize from the nearest corner resize the tile from its nearest corner, moving the layout dividers
swap swap two tiles
twist turn it about its centre; let go spinning and it keeps spinning

Anything else in the value is an ordinary action, fired once on press. A bind with no modifier eats that button from every client — allowed, but know that you did it.

Gestures

[gestures]
sensitivity    = 1.0
natural        = true
"swipe3+left"  = "pan_desktop"
"swipe3+right" = "pan_desktop"
"swipe3+up"    = "launcher"
"swipe4+left"  = "move_to_view:prev"

swipe<2..5>+left|right|up|down and pinch<2..5>+in|out, with the same action vocabulary plus pan_desktop — which only makes sense as a gesture: it hands the camera to your fingers and pans live, settling on a desktop when they lift. Bind it to both horizontal directions; it is one gesture.

A finger count with nothing bound is passed through untouched, so pinch-to-zoom in a browser still works.

Keys inside the desktop strip

expo (Super+A) takes the keyboard while it is up:

Key Does
z step out to the wider view — the desktops become cards on a ring
x close the strip into a ring, or open it back into a line
move one desktop along
lift the camera over the ring (far view only)
PgUp PgDn closer / further (far view only)
Return enter the desktop you are looking at
Escape leave the strip

Windows can be dragged between cards with the mouse, and clicking a card enters that desktop.

Keys inside the launcher

Type to filter, / (or Tab / Shift+Tab) to move, Return to run, Backspace to erase, Escape to close. The launcher owns the keyboard while it is open, for the same reason the strip does.