Commit Graph
36 Commits
Author SHA1 Message Date
Pierre Kisters 4e14863277 VR keyboard: 6 suggestions by default 2026-09-28 04:47:23 +02:00
Pierre Kisters 365c9212f2 VR keyboard: suggestions above the keyboard by default 2026-09-28 04:47:10 +02:00
Pierre Kisters f79d87b41b VR keyboard: text buffer default 128 characters 2026-09-28 04:46:26 +02:00
Pierre Kisters b455dfb5ea README, template: VR keyboard swipe and suggestions 2026-09-28 04:42:13 +02:00
Pierre Kisters 7cfe78aed0 VR keyboard: Fn key on layouts without AltGr
US, Dvorak, Colemak, Bulgarian, Chinese, Japanese and Korean have no AltGr
key, so AltGr + Delete and the AltGr arrows were unreachable. They get
Steam's own AltGr toggle key, labelled Fn, right of the space bar like
German AltGr.
2026-09-28 04:18:09 +02:00
Pierre Kisters b987e822d0 VR keyboard: small Entf hint on the Delete key without AltGr
The key that becomes Delete on AltGr shows a small hint (the arrow hints'
7 px) on the baseline of Steam's AltGr hints, while the layout has such a
free key.
2026-09-28 04:07:56 +02:00
Pierre Kisters a3b05b7474 VR keyboard: AltGr + the key left of Backspace = Delete
While AltGr is active, the key left of Backspace (German ´/`, empty on
AltGr) becomes Delete, labelled like Steam's Delete key (Entf; Del when
longer), sent by the helper; repeats while held like Backspace.
2026-09-28 03:55:38 +02:00
Pierre Kisters ba4354de9e README, template: new option names, table of renamed options 2026-09-28 03:36:38 +02:00
Pierre Kisters 36fcb207bd steam-close-button: keep Steam hidden after X until shown explicitly
Closing Steam with X now marks it hidden (state steamHidden). Before,
bar-only ended as soon as any window became active, so closing a docked
window afterwards let stock SteamVR fall back to Steam.

While hidden, the stock fallbacks go to the most recently active other
docked window with a tab, else bar-only:
- autoSwitchOverlayIfNeeded with no active frame;
- the dashboard mailbox's dashboard_overlay_destroyed handler (stock:
  switchToHomeOverlay -> Steam);
- show/switch requests for Steam with reason "theater frame destroyed"
  (key removed) or "SetDockLocation" (echo of X docking Steam: dropped).
Steam becoming the active frame (tab click, Steam menu pick,
SwitchToDashboardOverlay) ends hidden.

The hidden state replaces the rule that swallowed the first
ShowOverlay(main) from Steam after each dashboard open in bar-only (Steam
doesn't send one there; its only effect was eating a real Steam menu
pick). Version 7; state of versions 5/6 is taken over (bar-only implies
hidden), their fields are left for a rollback. Signatures: mailbox and
dashboard handler anchors, the ShowOverlay ones dropped.
2026-09-28 02:46:31 +02:00
Pierre Kisters 817190facd window-curvature: no bar flicker during a drag
The bar panel is no longer padded during a bar drag (its new size and the
compensated origin reached the compositor at different times, so the bar
flickered). SteamVR keeps sending the pressed bar's coordinates past its
edge, so the drag simply uses them. `barDragRoom` is removed.
2026-09-28 02:39:13 +02:00
Pierre Kisters 2feb3d405d window-curvature: drag detents, muted hover haptics, longer drag per step
- Snap points are detents in drag distance (snapPixels, default 24): the
  value holds at the point, then continues, so no value is skipped.
  `snap` is removed in favour of `snapPixels`.
- The dashboard's own hover haptics are muted during a drag, so only the
  value's ticks and detents are felt.
- Longer drag per step by default: 120 px per 1.0 in the menu, 60 on the
  bar button (step stays 0.05).
2026-09-28 01:48:15 +02:00
Pierre Kisters 772681a771 README: keyboardVariant examples 2026-09-28 00:53:17 +02:00
Pierre Kisters 4bb0fdd863 README: concise
Keep what users and patch authors need; implementation details live in
the patch headers. Options table tightened, every row and default kept.
2026-09-27 23:57:12 +02:00
Pierre Kisters 551c6efa38 Add Apache License 2.0 2026-09-27 23:48:48 +02:00
Pierre Kisters b579cb89e8 Docs: steamvrDebugger is automatic; LAN forwards come from Developer Mode
Explain the steamvrDebugger default in plain words, and replace the
"mask the port forwards" advice: SteamOS only enables them with Steam's
Developer Mode, which none of the patches need.
2026-09-27 23:35:11 +02:00
Pierre Kisters dfcb244596 README: contents, UI patches as a top-level section, showAllApps
- A short contents list; the intro names all features.
- "UI patches" (with finders/signatures and after-a-Steam-update) is its
  own section before "Fixes in detail" instead of sitting between the
  keyboard patch and the launcher menu; anchors are unchanged.
- The usage example says how it relates to template/ and uses the
  template's stateVersion.
- Developer Mode notes (usage, hidden apps) mention launcherMenu.showAllApps;
  the launcher section no longer says the patches use no webpack module;
  window curvature points to the window control bar for the bar button.
2026-09-27 23:29:09 +02:00
Pierre Kisters 990ee78fe7 Add frame-controls: move window controls between bar and ⋯ menu by long press
steamFrame.dashboard.frameControls: a long press (longPressMs, default
1.5 s; a ring shows the progress from half of it) on a control under a
dashboard window or on a More Options (three-dot) menu row opens a popup
with "Show in bar", which moves that control between the window's bottom
bar and the menu, for all windows. Placement is keyed by the control's
action icon, kept in the page and its localStorage (survives SteamVR
restarts); inBar / inMenu set defaults. floatInTheater gives theater
windows the Float control back.

The popup is a scene-graph panel of its own, attached to the pressed
button's (or the menu's) anchor like SteamVR's tooltips and menu, so the
bar and menu panels don't change; the menu's focus auto-close is held back
while its popup is open. Coordinates with window-curvature through its
sfui-curv-* contract. Lookups by signature ("frame-controls" in
lib/signatures.json, check-only anchors for the rest).
2026-09-27 22:58:32 +02:00
Pierre Kisters 9993cbd4ab window-curvature: wheel on the bar button, haptics 2026-09-27 22:19:55 +02:00
Pierre Kisters 5eb1d07d01 launcher-menu: showAllApps lists all programs without Developer Mode
Without Steam's Developer Mode the "+" menu hides konsole, systemsettings,
dolphin, plasma-discover, vlc and a few more by executable name. The patch
empties only that list's iterator, leaving the setting itself untouched.
2026-09-27 21:56:48 +02:00
Pierre Kisters bce51eb598 Add window-curvature: adjustable curvature per dashboard window
steamFrame.dashboard.windowCurvature: the "Toggle Curvature" row of a
window's More Options menu becomes a control (click: curved -> flat,
flat -> stock; drag up/down with the laser: curvature relative to
SteamVR's stock curve, snapping to 0 and 1). The patch moves each frame's
curvature-origin node to stock distance / value in outgoing scene graphs;
per-window values live in the systemui page. Lookups by signature
("window-curvature" in signatures.json, incl. check-only anchors).

Shared method hooks (lib/hooks.js, passed by mkPatch as 4th argument):
one SendMessage wrapper for dashboard-windows (now VERSION 3) and
window-curvature instead of a chain of per-patch wrappers; legacy
wrappers on top are unwound.
2026-09-27 21:30:25 +02:00
Pierre Kisters 8d7094916b launcher-menu: detect missing icon fallbacks on switch (iconFallbacks.enable/extra) 2026-09-27 21:16:51 +02:00
Pierre Kisters 01645ffcf6 Add steam-close-button: X on the dashboard's Steam window
steamFrame.dashboard.steamCloseButton.enable (default false) gives the
SteamVR dashboard's main Steam window a close button: it docks the window
back into the dashboard, then switches to the previously active window or,
with none, leaves just the dashboard bar. Bar-only survives dashboard
reopens and patch restarts (state in window.__sfuiSteamCloseState, taken
over from the earlier personal version 4 of this patch); the stock
"no active frame -> show Steam" paths are suppressed while it lasts.

MobX, the dock-location enum and the closing component class are found by
signature; check-only signatures cover the dashboard internals it uses.
2026-09-27 20:55:39 +02:00
Pierre Kisters 681533027d launcher-menu: grid of tiles and hicolor icon fallbacks
launcherMenu.grid = { enable; columns; maxRows; } restyles the "+" menu's
programs section as a grid of tiles (icon, name below): Steam's own items
stay in place, maxRows limits the visible rows, and Steam's scroll fade is
recomputed so it only shows where there is more to scroll. The pinned
Desktop row is slim and centred in tile mode.

launcherMenu.iconFallbacks (default utilities-terminal, preferences-system)
installs hicolor copies of Breeze app icons, since Steam resolves program
icons only in hicolor; Konsole and KDE System Settings had none.

The checker gains checkOnly "stylesheet" signatures (matched against the
bundle's CSS files) to cover the scroll fade's gradient; launcher-menu-grid
signatures cover the section keys and the ScrollFade classes.
2026-09-27 20:52:15 +02:00
Pierre Kisters b05f03c6d4 README: note the raw install.sh URL as fallback for the short link 2026-09-27 20:21:41 +02:00
Pierre Kisters 0c7622ab64 Use the short install link steam-frame-nix.lhns.de
It redirects to install.sh on main; README keeps the raw GitHub URL as a
fallback.
2026-09-27 20:21:31 +02:00
Pierre Kisters 9f5538003f Add dashboard-windows (resize/grab-distance limits) and steamvr-debugger
dashboard-windows: steamFrame.dashboard.windowMaxScale and
windowDistance.{world,theater,dashboard}.{min,max}, one runtime patch of the
SteamVR dashboard (systemui, 127.0.0.1:8087) that rewrites
frame-resize-scale-max and grab min/max-distance in the scene graph sent to
vrcompositor, then asks for one resend so changes apply immediately.
Registered only when an option is set. The mailbox class and the
scene-graph scheduler are found by signature (mkPatch, "dashboard-windows"
in lib/signatures.json, bundle vrwebui-systemui), so
scripts/check-signatures.mjs checks them offline too.

steamvr-debugger: steamFrame.steamvrDebugger.enable, defaulting to true when
a UI patch uses port 8087; merges VRWebHelper.DebuggerEnabled into
steamvr.vrsettings before every SteamVR start, and reverts it (only if it
set it) when turned off.
2026-09-27 20:09:47 +02:00
Pierre Kisters 6a8924f219 UI patches: find Steam internals by signature, offline checker
Runtime patches no longer use webpack module ids or minified export
names, which change with every Steam UI build:

- modules/lib/finders.js: finder library (getWebpackRequire,
  findModule/findExport by source text and shape, resolveAll with a
  per-page cache, findFiberUp/findFiberDown/findInReactTree), installed
  once per page as window.__sfuiFind.
- modules/lib/signatures.json: the signatures, per patch, shared by the
  patches and the checker. lib/default.nix mkPatch wraps a patch
  `(find, sigs, opts) => ...` with the library, its signatures and
  options; exposed as steamFrame.uiPatches.lib.
- Keyboard patch (VERSION 10): layouts module, current/enabled layout
  getters, arrow keys, VR keyboard status and VirtualKeyboardManager are
  found by signature; if one doesn't match it reports which and leaves
  Steam untouched. unpatch.js uses references the patch remembered.
  The helper logs inject results when they change.
- launcher-menu launch/pinned-desktop use the library's fiber helpers;
  launch no longer depends on the bar popup's window name.
- scripts/check-signatures.mjs (+ webpack-modules.mjs): extracts module
  factories from the installed bundles without a browser and checks
  every signature (found / ambiguous / missing, with module ids and
  export names). README: "Finders and signatures", "After a Steam update".
2026-09-27 20:04:15 +02:00
Pierre Kisters dd6f3602aa launcher-menu: closeOnLaunch and launchDebounce options
Stock, clicking a program in the VR dashboard's "+" menu only calls
SteamClient.Apps.LaunchNonSteamApp; the menu stays open until the
program's window appears, so users click again and launch it twice.

New launch/ patch (SharedJSContext) wraps LaunchNonSteamApp, whose only
caller is this menu: closeOnLaunch closes the menu through the "+" bar
button's own popup handle right after a launch; launchDebounce ignores
repeated launches of the same command line within N seconds (logged to
the steam-ui-patches journal). Both opt-in, like the other launcherMenu
options.
2026-09-27 19:45:09 +02:00
Pierre Kisters 24d6504f30 Add steam-ui-patches (generic Steam UI runtime patches) and launcher-menu
steamFrame.uiPatches.patches registers JS patches that the
steam-ui-patches user service keeps injected into Steam's (or SteamVR's)
web UI over the local CEF DevTools ports and reverts when it stops.

steamFrame.launcherMenu uses it for the VR "+" menu: sort = true sorts
the programs by name; pinDesktop = "top" / "bottom" pins Desktop above or
below the scrolling list.
2026-09-27 19:36:12 +02:00
Pierre Kisters f7eadb9ac1 Keyboard patch: Enter types Return in app windows despite stale Steam search focus
Steam's VirtualKeyboardManager keeps the props of the last focused Steam text
field (m_ActiveElementProps) after leaving the dashboard. With a search box
there, the VR keyboard for a gamescope window showed "Search" on Enter and
its onEnterKeyPress returned "VKClose", hiding the keyboard instead of
sending Return. While the keyboard serves something other than this Steam
UI, ignore those props and the dismiss-on-Enter flag.
2026-09-27 19:20:21 +02:00
Pierre Kisters d04c81e0bf install.sh: review fixes
- status lists every Home Manager user service instead of a hardcoded
  docker.service (that's not a steam-frame-nix module)
- unique backup suffix per run (Home Manager aborts if *.backup exists)
- uninstall only force-kills processes still running from /nix/store
- drop fallbacks this installer never needs: old `nix show-config` /
  `nix store ping`, the legacy per-user HM profile path, a PATH fallback,
  grep-parsing the receipt without jq, `--flake=value`
2026-09-27 15:45:31 +02:00
Pierre Kisters 83afad34c8 README: plain-language session section, keyboard AltGr/Shift notes 2026-09-27 15:38:35 +02:00
Pierre Kisters 5e7d631e50 Add install.sh and a Home Manager flake template
install.sh installs Nix (nix-installer, steam-deck planner, flakes
enabled) and activates a Home Manager configuration, creating one from
the new flake template if there is none; uninstall stops Home Manager's
user services, runs home-manager uninstall and removes Nix and per-user
leftovers; status shows the current state. Works piped from curl.
2026-09-27 15:36:37 +02:00
Pierre Kisters d60931ed72 Rename vrKeyboard to steamKeyboardPatch; clipboard-sync on by default
- steamFrame.vrKeyboard -> steamFrame.steamKeyboardPatch (module, service
  and script names follow): it patches Steam's own on-screen keyboard
- clipboardSync.enable defaults to true: without it the nested desktop's
  clipboard is isolated
2026-09-27 15:24:52 +02:00
Pierre Kisters 4b2885a992 clipboard-sync: dedupe on switch; vr-keyboard: revert without reboot
- clipboard-sync: stop stale builds and duplicates, prefer the instance
  started in the nested desktop, only start a new one when switching from
  the nested desktop (an instance inherits the switching shell's session)
- vr-keyboard: the helper reverts the patch on SIGTERM (vrkbd-unpatch.js);
  disabling the module stops the service via the new
  steamFrame.userServices.stop, so the stock keyboard is back immediately
2026-09-27 15:17:08 +02:00
Pierre Kisters 2dc9ccb83e Home Manager modules for the Steam Frame
Portal fix, Steam-session keyboard layout, VR keyboard patch, hidden
apps, clipboard-sync and a Firefox Flatpak launcher, all under
steamFrame.*, plus the outer-session user-services mechanism.
2026-09-27 15:09:13 +02:00