Files
lhns--steam-frame-nix/modules/lib/signatures.json
T
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

445 lines
20 KiB
JSON

{
"bundles": {
"steamui": {
"description": "Steam client UI (SharedJSContext and its popups, e.g. the VR keyboard and dashboard bar)",
"chunkGlobal": "webpackChunksteamui",
"dir": "~/.local/share/Steam/steamui",
"html": "index.html",
"exclude": "^localization/",
"styles": "css"
},
"vrwebui-systemui": {
"description": "SteamVR dashboard (vrwebhelper page systemui)",
"chunkGlobal": "webpackChunkvrwebui",
"dir": "/opt/steamvr/resources/webinterface/dashboard",
"html": "systemui.html"
}
},
"patches": {
"steam-keyboard-patch": {
"bundle": "steamui",
"modules": {
"layouts": {
"module": { "includes": ["name:\"qwerty\"", "rgLayout:", "GetKeyboardLayoutSettings"] },
"exports": {
"currentLayout": {
"type": "function", "length": 0,
"includes": ["GetKeyboardLayoutSettings", "currentLayout"],
"excludes": ["selectedLayouts", "SetKeyboardLayout"]
},
"enabledLayouts": {
"type": "function", "length": 0,
"includes": ["GetKeyboardLayoutSettings", "selectedLayouts"],
"excludes": ["useState", "SetKeyboardLayout", "SetValidKeyboardLayouts"]
},
"arrowLeft": { "type": "object", "props": { "key": "ArrowLeft" } },
"arrowUp": { "type": "object", "props": { "key": "ArrowUp" } },
"arrowDown": { "type": "object", "props": { "key": "ArrowDown" } },
"arrowRight": { "type": "object", "props": { "key": "ArrowRight" } }
},
"expects": ["Half", "rgLayout:", "leftActionButton"]
},
"vrStatus": {
"module": { "includes": ["get VRKeyboardStatus()"] },
"exports": {
"holder": { "type": "object", "getters": ["VRKeyboardStatus"] }
},
"expects": ["bIsOpen:", "sOverlayKey", "unAppID"]
},
"keyboardManager": {
"module": { "includes": ["SendClientPasteCommand(){", "HandleVirtualKeyDown(", "GetEnterKeyLabel("] },
"exports": {
"VirtualKeyboardManager": {
"type": "class",
"protoMethods": ["HandleVirtualKeyDown", "GetEnterKeyLabel", "SendClientPasteCommand"]
}
},
"expects": ["m_ActiveElementProps", "m_bDismissOnEnter", "m_Instance", "GetVROverlayKey()",
"MainRunningAppID", "ControllerKeyboardSendText"]
},
"keyboardComponent": {
"checkOnly": true,
"module": { "includes": ["TypeKeyInternal(", "toggleStates", "standardLayout"] },
"expects": ["\"data-key\"", "\"data-key-row\"", "HandleVirtualKeyDown"]
},
"popupManager": {
"checkOnly": true,
"module": { "includes": ["g_PopupManager", "GetPopups()"] }
}
}
},
"launcher-menu-order": {
"bundle": "steamui",
"modules": {
"programList": {
"checkOnly": true,
"module": { "includes": ["ScanForInstalledNonSteamApps("] }
}
}
},
"launcher-menu-launch": {
"bundle": "steamui",
"modules": {
"dashboardBar": {
"checkOnly": true,
"module": { "includes": ["allowLaunchProgram", "refBarPopopHandle", "#VRDashboard_LaunchNonSteamApp"] },
"expects": ["LaunchNonSteamApp(", "\"VRDashboardBarSmallButton\"", "BPopupOpen()", "closePopup()"]
}
}
},
"launcher-menu-pinned-desktop": {
"bundle": "steamui",
"modules": {
"dashboardBar": {
"checkOnly": true,
"module": { "includes": ["allowLaunchProgram", "refBarPopopHandle", "#VRDashboard_LaunchNonSteamApp"] },
"expects": ["header:", "strExePath", "rctContents"]
},
"popupNames": {
"checkOnly": true,
"module": { "includes": ["\"valve.steam.gamepadui.barpopup\""] }
}
}
},
"launcher-menu-grid": {
"bundle": "steamui",
"modules": {
"dashboardBar": {
"checkOnly": true,
"module": { "includes": ["allowLaunchProgram", "refBarPopopHandle", "#VRDashboard_LaunchNonSteamApp"] },
"expects": ["key:\"programs\"", "key:\"windows\"", "header:"]
},
"popupNames": {
"checkOnly": true,
"module": { "includes": ["\"valve.steam.gamepadui.barpopup\""] }
},
"scrollFade": {
"checkOnly": true,
"module": { "includes": ["ScrollFade", "ScrolledToTop", "ScrolledToBottom", "strClassNamesForScrollable"] },
"expects": ["scrollTop<=1", "clientHeight+1"]
},
"scrollFadeClasses": {
"checkOnly": true,
"module": { "includes": ["ScrollFade:\"", "ScrolledToTop:\"", "ScrolledToBottom:\""] }
},
"scrollFadeStyle": {
"checkOnly": true,
"stylesheet": { "includes": [
"mask-image:linear-gradient(to bottom, transparent 0%, black var(--scroll-fade-size), black calc(100% - var(--scroll-fade-size)), transparent 100%)",
"--scroll-fade-size:"
] }
},
"scrollShadowStyle": {
"checkOnly": true,
"stylesheet": { "includes": [
"z-index:9001;height:0;box-shadow:0 0 40px 40px #0e141b;transition:opacity .15s ease-out;pointer-events:none"
] }
}
}
},
"launcher-menu-show-all": {
"bundle": "steamui",
"modules": {
"devModeApps": {
"module": { "includes": ["\"developer_mode_enabled\"", "\"firewall-config\"", "\"vrurlhandler\"", "\"Install Chromium\""] },
"exports": {
"devModeOnly": { "type": "object", "has": ["push"], "props": { "0": "firewall-config" } }
},
"expects": ["\"konsole\"", "\"systemsettings\"", "\"dolphin\"", "\"plasma-discover\""]
},
"launcherFilter": {
"checkOnly": true,
"module": {
"includes": ["allowLaunchProgram", "#VRDashboard_LaunchNonSteamApp", "strExePath.endsWith(\"/\"+"],
"regex": ["/\\|\\|[\\w$]+\\.push\\(\\.\\.\\.[\\w$]+\\.[\\w$]+\\),[\\w$]+\\.filter\\(/"]
},
"expects": ["strAppName==", "strExePath=="]
}
}
},
"dashboard-windows": {
"bundle": "vrwebui-systemui",
"modules": {
"mailbox": {
"module": { "includes": ["\"mailbox_send \"", "WebSocketSend(", "\"vrcompositor_systemlayer\""] },
"exports": {
"Mailbox": { "type": "class", "protoMethods": ["SendMessage", "SendMessageAndWaitForResponse", "RegisterHandler"] }
}
},
"sceneGraph": {
"module": { "includes": ["\"update_scene_graph\"", "NextSGID()", "scene_graph:"] },
"exports": {
"resend": { "type": "function", "length": 0, "includes": ["NextSGID()", "setTimeout"] }
},
"expects": ["\"vrcompositor_systemlayer\"", ".SendMessage("]
},
"windowFrame": {
"checkOnly": true,
"module": { "includes": ["\"frame-resize-scale-max\"", "\"frame-resize-scale-min\""] }
},
"grabScale": {
"checkOnly": true,
"module": { "includes": ["\"grab-scale\"", "\"min-distance\"", "\"max-distance\""] }
}
}
},
"steam-close-button": {
"bundle": "vrwebui-systemui",
"modules": {
"mobx": {
"module": { "includes": ["runInAction:()=>", "makeObservable:()=>", "reaction:()=>"] }
},
"dock": {
"module": { "includes": ["e[e.Dashboard=1]=\"Dashboard\",e[e.LeftHand=2]=\"LeftHand\""] },
"exports": {
"EDockLocation": { "type": "object", "props": { "Dashboard": 1, "LeftHand": 2, "RightHand": 3, "World": 4, "Theater": 5 } }
}
},
"closing": {
"module": { "includes": ["this.componentName=\"closing\"", "closeMethodPriority"] },
"exports": {
"Closing": { "type": "class", "includes": ["componentName=\"closing\"", "RequestClose()"] }
},
"expects": ["defaultComponentProps=", "null!=this.componentProps.onCloseRequested", "get showCloseButton()",
"m_bShowSpinner=!0"]
},
"frameComponent": {
"checkOnly": true,
"module": { "includes": ["this.defaultComponentProps", "FramePageComponent '"] },
"expects": ["get componentProps()", ".componentProps)", "[this.componentName]"]
},
"frame": {
"checkOnly": true,
"module": { "includes": ["e[e.Alive=2]=\"Alive\""] },
"expects": ["this.m_eState=", "this.closing=", "this.docking=", "this.tab=", "get isActiveDashboardFrame()",
"this.props="]
},
"frameStore": {
"checkOnly": true,
"module": { "includes": ["window.FrameStore="] },
"expects": ["GetFrame(e){"]
},
"dashboardStore": {
"checkOnly": true,
"module": { "includes": ["window.DashboardStore="] },
"expects": ["_setActiveFrame(e,t){", "\"_setActiveFrame\"", "get mainSteamFrame()", "m_unMainSteamFrameID",
"get activeFrameID()", "get activeFrame()", "get visibilityState()", "get isFullyVisible()"]
},
"dashboard": {
"checkOnly": true,
"module": { "includes": ["window.Dashboard=this", "autoSwitchOverlayIfNeeded(){"] },
"expects": ["onShowOverlayRequestFromSteam(e){",
"SetImplementation(\"ShowOverlay\",(e=>{this.onShowOverlayRequestFromSteam(e)}))",
"this.autoSwitchOverlayIfNeeded()", "switchToFrameInternal(e,t,r){", "\"hideDashboard\"",
"visibleInDashboardBar"]
},
"docking": {
"checkOnly": true,
"module": { "includes": ["get dockLocation()", "SetDockLocation(e"], "excludes": ["get associatedSummonOverlayKeys()"] }
},
"overlayKeys": {
"checkOnly": true,
"module": { "includes": ["\"valve.steam.gamepadui.main\"", "\"valve.steam.gamepadui.appoverlay\""] }
}
}
},
"window-curvature": {
"bundle": "vrwebui-systemui",
"modules": {
"mobx": {
"module": { "includes": ["runInAction:()=>", "makeObservable:()=>", "reaction:()=>"] }
},
"dock": {
"module": { "includes": ["e[e.Dashboard=1]=\"Dashboard\",e[e.LeftHand=2]=\"LeftHand\""] },
"exports": {
"EDockLocation": { "type": "object", "props": { "Dashboard": 1, "LeftHand": 2, "RightHand": 3, "World": 4, "Theater": 5 } }
}
},
"mailbox": {
"module": { "includes": ["\"mailbox_send \"", "WebSocketSend(", "\"vrcompositor_systemlayer\""] },
"exports": {
"Mailbox": { "type": "class", "protoMethods": ["SendMessage", "SendMessageAndWaitForResponse", "RegisterHandler"] }
}
},
"sceneGraph": {
"module": { "includes": ["\"update_scene_graph\"", "NextSGID()", "scene_graph:"] },
"exports": {
"resend": { "type": "function", "length": 0, "includes": ["NextSGID()", "setTimeout"] }
},
"expects": ["\"vrcompositor_systemlayer\"", ".SendMessage("]
},
"curvature": {
"module": { "includes": ["this.componentName=\"curvature\"", "ToggleCurvature(){"] },
"exports": {
"Curvature": { "type": "class", "includes": ["componentName=\"curvature\"", "m_bCurveOverride"] }
},
"expects": ["get curvatureTransformOriginID(){return`frame:${this.frame.frameID}:curvature-origin`}",
"ToggleCurvature(){this.m_bCurveOverride=!this.shouldCurve}", "get shouldCurve()",
"get curvatureOriginDistance(){return this.shouldCurve?", ".curvatureDistance:1e3}", "translation:{z:"]
},
"actions": {
"module": { "includes": ["window.dashboardActionStore="] },
"exports": {
"store": { "type": "object", "methods": ["GetAction", "BIsVRLinkRemoteAction"] }
},
"expects": ["get partialParams()", "get protoForSteam()", "m_PartialParams"]
},
"frameControlsClasses": {
"module": { "includes": ["FrameControlsContainer:\"", "AdditionalOptionsRow:\"", "AdditionalOptionsLabel:\""] },
"exports": {
"row": { "type": "string", "regex": ["_AdditionalOptionsRow_"] },
"label": { "type": "string", "regex": ["_AdditionalOptionsLabel_"] }
}
},
"frameControls": {
"checkOnly": true,
"module": { "includes": ["legacy-frame-controls-additional-options-", "controlAdditionalOptionsItems.filter("] },
"expects": ["id:`legacy-frame-controls-additional-options-${", "isControlAdditionalOptionsOpen",
".AdditionalOptionsRow,", ".AdditionalOptionsLabel},", "display_name", "invocation", "onClick:()=>{", "onMouseDown:",
"id:`legacy-frame-controls-${", "items_for_bottom_frame_controls", "control:e,", ".TopCenter,meters_per_pixel:"]
},
"curvatureAction": {
"checkOnly": true,
"module": { "includes": ["\"#ToggleCurvatureTooltip\""] },
"expects": ["icon:{enum:40},icon_active:{enum:39},invocation:2", ".curvature.ToggleCurvature()"]
},
"frame": {
"checkOnly": true,
"module": { "includes": ["e[e.Alive=2]=\"Alive\""] },
"expects": ["this.curvature=", "this.docking=", "get isControlAdditionalOptionsOpen()",
"get controlAdditionalOptionsItems()", "get associatedSummonOverlayKeys()",
"get protoForSteam()", "isCurrentlyVisible"]
},
"docking": {
"checkOnly": true,
"module": { "includes": ["get dockLocation()", "SetDockLocation(e"], "excludes": ["get associatedSummonOverlayKeys()"] },
"expects": ["get visualDockLocation()"]
},
"frameStore": {
"checkOnly": true,
"module": { "includes": ["window.FrameStore="] },
"expects": ["GetFrame(e){", "get frames()"]
},
"dashboardStore": {
"checkOnly": true,
"module": { "includes": ["window.DashboardStore="] },
"expects": ["get curvatureDistance()"]
},
"panel": {
"checkOnly": true,
"module": { "includes": ["properties[\"curvature-origin-id\"]"] },
"expects": ["properties.origin=", "properties.debug_name=this.props.debug_name", ".TopCenter:return{x:0,y:1}",
"this.m_Rect=this.getCurrentRootElement().getBoundingClientRect()", "new ResizeObserver("]
},
"sgApp": {
"checkOnly": true,
"module": { "includes": ["forceLayoutUpdate(){", "s_bPanelsAreDirty"] },
"expects": ["forceLayoutUpdate=this.forceLayoutUpdate", "updateLayoutValues()"]
},
"hapticEffects": {
"checkOnly": true,
"module": { "includes": ["e[e.Snap=3]=\"Snap\",e[e.Sliding=4]=\"Sliding\",e[e.SlidingEdge=5]=\"SlidingEdge\""] }
},
"hapticCall": {
"checkOnly": true,
"module": { "includes": ["TriggerOverlayHapticEffect(VRHTML.VROverlay.ThisOverlayHandle(),"] }
},
"sceneGraphNodes": {
"checkOnly": true,
"module": { "includes": ["case\"VSG-TRANSFORM\":", ".properties.translation="] }
}
}
},
"frame-controls": {
"bundle": "vrwebui-systemui",
"modules": {
"mobx": {
"module": { "includes": ["runInAction:()=>", "makeObservable:()=>", "reaction:()=>"] }
},
"frame": {
"module": { "includes": ["m_rgControlsItems_BottomFrameControls", "get protoForSteam()", "SetControlsItems("] },
"exports": {
"Frame": { "type": "class", "protoMethods": ["SetControlsItems", "SetControlAdditionalOptionsOpen", "CreateAction"] }
},
"expects": ["SetControlsItems(e,t,o){this.m_rgControlsItems_BottomFrameControls=e,this.m_rgControlsItems_TabHoverControls=t,this.m_rgControlsItems_AdditionalOptions=o}",
"get isControlAdditionalOptionsOpen(){return this.m_bControlAdditionalOptionsOpen&&this.m_rgControlsItems_AdditionalOptions.length>0}",
"BPanelHasFocus(this.panels.additionalOptionsPanelSGID)", "this.SetControlAdditionalOptionsOpen(!1)", "m_unControlAdditionalOptionsActionID"]
},
"actions": {
"module": { "includes": ["window.dashboardActionStore="] },
"exports": {
"store": { "type": "object", "methods": ["GetAction", "BIsVRLinkRemoteAction"] }
},
"expects": ["get protoForSteam()", "get isAlive()"]
},
"dock": {
"module": { "includes": ["e[e.Dashboard=1]=\"Dashboard\",e[e.LeftHand=2]=\"LeftHand\""] },
"exports": {
"EDockLocation": { "type": "object", "props": { "Dashboard": 1, "World": 4, "Theater": 5 } }
}
},
"inputFocus": {
"module": { "includes": ["BPanelHasFocus(e,t=!0)", "\"defocus_panel\""] },
"exports": {
"store": { "type": "object", "methods": ["BPanelHasFocus", "BPanelSubviewHasFocus", "RemoveInputFocus"] }
},
"expects": ["m_entryAtTopOfStack.m_unPanelSGID"]
},
"localize": {
"module": { "includes": ["LocalizeStringFromFallback(", "m_mapFallbackTokens"] },
"exports": {
"localize": { "type": "function", "includes": [".LocalizeString(e)", "$s/g"] }
},
"expects": ["[\"en\",\"english\"],[\"de\",\"german\"],[\"fr\",\"french\"]", "for(let t of navigator.languages)"]
},
"controls": {
"checkOnly": true,
"module": { "includes": ["\"#AdditionalOptionsTooltip\"", "\"#FloatInWorld\""] },
"expects": ["icon:{enum:38},invocation:2", "\"#FloatInWorld\"),icon:{enum:26},invocation:1", "\"#ReturnToDashboard\"),icon:{enum:27}",
"\"#ViewInTheater\"),icon:{enum:28}", "icon:{enum:\"left\"==t?29:30}", "icon:{enum:22},icon_active:{enum:24}",
"icon:{enum:40},icon_active:{enum:39}", "onlyVisibleIn:\"additional-options\"", "controlAdditionalOptionsItems.length>0",
"SetDockLocation(l.yWq.World)"]
},
"closeIcon": {
"checkOnly": true,
"module": { "includes": ["icon_close_black.png"] },
"expects": ["case 31:"]
},
"frameControls": {
"checkOnly": true,
"module": { "includes": ["legacy-frame-controls-additional-options-anchor-", "controlAdditionalOptionsItems.filter("] },
"expects": ["id:`legacy-frame-controls-${", "id:`legacy-frame-controls-additional-options-${", "parent_id:p,translation:{x:-34*",
"\"ButtonControl\"", "onClick:()=>{", "control:e,key:e.action_id", "const v={x:0,y:.15,z:.05}"]
},
"panel": {
"checkOnly": true,
"module": { "includes": ["getNodeType(){return\"panel\"}"] },
"expects": ["addEmbeddedPanelUVs(this)", "\"embedded-uv-index\"", "uv_min", "\"curvature-origin-id\"", "\"only-visible-with-laser\"",
"\"meters-per-pixel\"", "\"sort-depth-bias\""]
},
"panelAnchor": {
"checkOnly": true,
"module": { "includes": ["getNodeType(){return\"panel-anchor\"}"] },
"expects": ["\"anchor-u\"", "\"anchor-v\""]
},
"sgApp": {
"checkOnly": true,
"module": { "includes": ["window.SGApp=this", "addEmbeddedPanelUVs("] },
"expects": ["removeEmbeddedPanelUVs(", "updateAllPanelBounds(){", "m_fCurrentScale", "t.forceLayoutUpdate=this.forceLayoutUpdate",
"e.updateLayoutValues()", "getEmbeddedIndex()"]
},
"sceneGraphDom": {
"checkOnly": true,
"module": { "includes": ["\"update_scene_graph\"", "case\"VSG-TRANSFORM\""] },
"expects": [".buildNode;if(", "\"parent-id\"", "\"translation\""]
},
"docking": {
"checkOnly": true,
"module": { "includes": ["SetInTheater(e=!0){", "GetTrackedDeviceIndexForControllerRole"] },
"expects": ["SetDockLocation(e){", "SetJustFloatedFromDashboard("]
}
}
}
}
}