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.
2.1 KiB
Dashboard windows
dashboard.windows.*, module dashboard-windows (options).
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/-maxon window frames;min-distance/max-distanceon grab nodes:grab-scalefor world windows,grab-transformfor the theater screen and the dashboard (the keyboard'sgrab-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).