Files
Pierre Kisters aa9ca183f1 docs: README as overview + options, one docs page per feature
README keeps intro, feature list linking docs/, install, two sessions,
usage, the complete options table, changes outside Nix, rollback,
uninstall. Each feature's details (problem, what you get, configuration,
limitations, how it works) move to its own page in docs/; docs/dashboard.md
is split per feature and docs/changes-outside-nix.md becomes
docs/cleanup.md.
2026-09-29 01:02:28 +02:00

2.1 KiB

Dashboard windows

dashboard.windows.*, module dashboard-windows (options).

A SteamVR dashboard patch.

Problem

SteamVR dashboard windows can only be enlarged to 2x, and grabbed windows pushed back only to 5 m (6 m in theater), too close for a big screen.

What you get

Higher limits (null keeps stock):

Option Stock
maxScale 2 (relative to the window's default size; the theater screen's default is 2.8x larger)
distance.world.{min,max} 0.25-5 m
distance.theater.{min,max} 1-6 m
distance.dashboard.{min,max} 0.3-4 m

Distances limit pulling in / pushing back a grabbed window (thumbstick or scroll while dragging). Changes apply immediately, and turning options off reverts on the next switch. The keyboard's range is not patched.

Configuration

steamFrame.dashboard.windows = {
  maxScale = 4.0;              # resize up to 4x (theater: 11.2x)
  distance.world.max = 10.0;   # push windows back up to 10 m
  distance.theater.max = 12.0;
};

Caveats

If SteamVR changes its stock grab distances, the distance options silently do nothing.

How it works

systemui sends its scene graph to vrcompositor via mailbox.SendMessage("vrcompositor_systemlayer", { type: "update_scene_graph", scene_graph }), and vrcompositor enforces the limits in it:

  • frame-resize-scale-min / -max on window frames;
  • min-distance / max-distance on grab nodes: grab-scale for world windows, grab-transform for the theater screen and the dashboard (the keyboard's grab-transform, 0.2 / 1 m, is left alone).

They are literals in the bundle, so the patch hooks SendMessage on the mailbox prototype (shared hooks, shared with window curvature) and edits outgoing scene graphs in place. Grab nodes are matched by type plus exact stock values, which is why a change of them makes the distance rewrite a no-op. A scene-graph resend applies new limits at once.

State: window.__sfuiDashboardWindows in the systemui page (counters in .hits).