Features & Shortcuts

Every action the daemon can perform, its default chord, and the setting that changes it, because here the settings are per feature.

Written for Wira Desk 0.3.0

There is no separate “customize” section in these docs, and that is not an omission. Settings has five panes (General, Shortcuts, Mouse, VM & Exceptions, About), and every control in them belongs to one feature. So each feature below carries its own settings, at the point where you would want them.

Window cycling

Win+` walks the windows of the foreground application and nothing else: Chrome window 1 → Chrome window 2 → … Alt+Tab piles every app’s windows together; this does the job Alt+Tab does not.

A tap stays on the monitor and the virtual desktop you are on, so a window parked on another screen never surprises you by taking focus.

Tap, or hold

Tap and you move to the next window on this monitor immediately. Hold the shortcut and a visual switcher overlay opens, composing live thumbnails of the app’s windows from every monitor on this virtual desktop, so you can pick rather than count.

SettingWhereDefault
Primary chordShortcuts → SwitchingWin+`
Fallback chordShortcuts → SwitchingAlt+`
Enable Visual Switcher OverlayGeneralOn
Hold Delay ThresholdGeneral300 ms (range 100 to 500)
The fallback chord exists for the machine where the first one collides with something you already use. Both are remappable and both can be switched off independently. Note that PowerToys’ own Window Hopper ships on Alt+` too, off by default, but worth knowing if you run both.

Snapping

Three families, all on the Ctrl+Alt tier that Windows leaves alone. No zone editor to draw first, and no second tray app to keep running.

Halves

Ctrl+Alt+←/→/↑/↓ snaps to 50% of the work area against that edge. Fixed, and always exactly half.

Thirds

Ctrl+Alt+1/2/3 snaps to the left, middle, or right third. This is the FancyZones case for anyone who wants thirds and nothing else.

Your own percentage, per edge

Ctrl+Alt+Shift+←/→/↑/↓ does the same at a percentage you choose, and each of the four edges carries its own number. A 60% left and a 40% right are two different settings, not one split, so an editor on the left at 60 pairs with a browser on the right at 40 without either being “the remainder”.

SettingWhereDefault
Percentage: left / rightShortcuts → Snap to custom, on the row itself67 each
Percentage: top / bottomShortcuts → Snap to custom, on the row itselfTop 33, bottom 67
Every chord aboveShortcuts, grouped by what it snaps toSee the table
The Shortcuts pane is grouped by what an action snaps to (Switching, Snap to half, Snap to third, Snap to custom, Resize, move & arrange), and a row never repeats its group’s name. Under Snap to custom a row simply reads “Snap to left edge”.

Move & arrange

ActionDefaultWhat it does
MaximizeCtrl+Alt+EnterFull screen on the monitor the window is on.
Move to next monitorCtrl+Alt+Shift+EnterKeeps the window’s relative size and position on the new screen.
Overlapping stackCtrl+Alt+Shift+SThree windows at a width you set, deliberately overlapping, for a small monitor where you still want a third window visible.

The stack’s width percentage sits on the Overlapping Stack row itself, beside that action’s chord and its on/off switch. There is no Layout pane any more: a setting that belongs to one action now lives with that action.

If you have bound two actions to the same chord, Maximize now sits behind every snap variant in the order that resolves the collision. On the shipped defaults nothing collides, so most installs see no difference.

Switching one off

Every remappable shortcut has its own enable/disable control. Turning one off drops its chord from the keyboard hook entirely, so the key combination reaches whatever app is focused unchanged, exactly as if Wira Desk were not installed. The stored chord itself is untouched, so turning the action back on needs no re-entry.

Mouse navigation

Vendor suites exist to remap buttons the mouse is already reporting. Wira Desk reads them straight off the standard Win32 input stream, WM_XBUTTONDOWN and WM_MOUSEHWHEEL, so there is no driver, no configuration app, and no dependence on a single manufacturer.

Four inputs, and out of the box all four run Windows’ own actions: the ones your thumb already expects.

InputDefaultWhere
Enable Mouse NavigationOnMouse pane
Thumb button 1 (Back)Previous virtual desktopMouse pane
Thumb button 2 (Forward)Next virtual desktopMouse pane
Tilt wheel leftShow desktopMouse pane
Tilt wheel rightTask ViewMouse pane

The twenty actions you can bind instead

Any of these can take a button’s place:

  • Desktops and shell: next virtual desktop, previous virtual desktop, Task View, show desktop.
  • Switching: cycle forward.
  • Snap to half: left, right, top, bottom.
  • Snap to third: left, center, right.
  • Snap to custom: left, right, top, bottom.
  • Arrange: maximize, overlapping stack, move to next monitor.
  • Passthrough: hands the button back to Windows untouched.
A tilt wheel bounces. Two filters sit in front of it (a 150 ms gate between accepted ticks, then a 400 ms quiet period), so one flick is one command rather than three.

VM & Remote Desktop exceptions

Inside a virtual machine or a remote session, a global shortcut is usually the wrong thing: the chord you press is meant for the guest, not the host. The VM & Exceptions pane lists the windows that receive raw, unintercepted keystrokes.

Shipped defaults

Passthrough executablesmstsc.exe · vmconnect.exe · vmware.exe · VirtualBoxVM.exe · MobaXterm.exe
Passthrough window classesVMwareUnityWindow

Process names and window classes are configured independently, because some clients are best matched one way and some the other: a Unity-mode VMware window is a class, not a process name.

The config file

Everything above is stored in one file: %APPDATA%\WiraDesk\config.toml. It is written atomically through a .tmp swap, so an interrupted save cannot leave half a file.

[general]
auto_start = false
check_updates = true

[switcher]
shortcut = "win+backtick"
shortcut_enabled = true
fallback_shortcut = "alt+backtick"
fallback_shortcut_enabled = true
visual_enabled = true
visual_hold_delay_ms = 300

[snapping]
snap_half_left = "ctrl+alt+left"
snap_half_left_enabled = true
snap_percent_left = "ctrl+alt+shift+left"
percent_left = 67
snap_third_left = "ctrl+alt+1"
snap_maximize = "ctrl+alt+enter"

[layout]
stack_width_percent = 50
stack_shortcut = "ctrl+alt+shift+s"
move_next_monitor_shortcut = "ctrl+alt+shift+enter"

[vm_bypass]
bypass_processes = ["mstsc.exe", "vmconnect.exe", "vmware.exe", "VirtualBoxVM.exe", "MobaXterm.exe"]
bypass_classes = ["VMwareUnityWindow"]

[mouse]
enabled = true
thumb_back = "prev_virtual_desktop"
thumb_forward = "next_virtual_desktop"
tilt_left = "show_desktop"
tilt_right = "task_view"

You can edit it by hand. Reload is all-or-nothing: an unreadable, malformed, or invalid file leaves the previous configuration in force and emits one warning to the log rather than starting up half-configured. Every field carries a default, so a partial file still loads and simply gains the values it is missing.

No configuration value ever becomes a path or a command line. The fields are typed, and that is the boundary that keeps a hostile write to this file from turning into execution. See Security → Design notes.

Two other things in Settings

Spatial Preservation LockGeneral pane. Keeps a window’s place across monitor changes rather than letting Windows re-flow it.
Show Unresponsive WindowsGeneral pane. Includes windows that are not answering in the cycling ring instead of hiding them, because you probably want to reach the frozen one.