Repository navigation
Controller support without Steam (Seaglass #60) - #32
Merged
Merged
Conversation
…EmBus + HidHide) (#60) * docs: design for controller support without Steam * WIP: controller bridge without Steam (ViGEmBus + HidHide) Built: internal/vpad, pad Bridge mode, launch route and controller step, settings, UI, mock, bindings, docs. Checks pass locally (go test, -race, npm check/test, notices). Unfinished: wails3 build not run, mock UI not reviewed in both themes or at narrow width, live ViGEm test not run, HidHide v1.5.230 lacks the session block list (decision pending), main-session review of the diff, PR. * Controller bridge: handle ViGEmBus results like ViGEmClient Found with the live test on a real ViGEmBus 1.22: the bus ends a report submit with other errors while the report still arrives, so only access denied counts. Older buses without the wait-ready request still work, and the rumble loop only ends on unplug or Close. * Controller bridge: hide through HidHide's saved block list, Unhide in Settings No HidHide release has the per-process list yet, so Seaglass uses the saved block list. It notes what it adds in hidden-controllers.json first and takes exactly those off at game end, start, quit and from Unhide controller. Auto without ViGEmBus starts directly with the setup hint (no Steam fallback).
Brings Seaglass PR #60 (ViGEmBus virtual Xbox controller, HidHide hiding with a crash-safe ledger, driver setup from Settings) into the Store Edition. Conflicts were additive (imports, Core fields, settings normalize, tests). platform.RunInstaller now elevates through the edition's existing RunElevated instead of a second ShellExecuteEx wrapper.
TestAnnotatorReadsCompletionAndReleaseDateWithoutFetching swaps c.enrich.client while the chart goroutine from the first StoreHome may still read it; CI's race detector caught it on this PR.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Brings Seaglass's own Xbox controller bridge (ApolloF/Seaglass#60, merge commit 4cd5cfe) into the Store Edition as a merge, so Seaglass's history stays an ancestor of
mainand the daily sync keeps working.What comes in
hidden-controllers.json) cleared at game end, every start and quit, and from Unhide controller.docs/design/controller-without-steam.md), CHANGELOG, ROADMAP, THIRD_PARTY_NOTICES, bindings.Store Edition differences
Merge conflicts were all additive (imports in
api*.ts,types.ts,Corefields,settings.normalize,update_test.go).The edition already had
platform.RunElevated(elevate.go) for the store's installers. Seaglass's newinstaller.godeclared a secondSHELLEXECUTEINFOWwrapper, sorunElevatednow callsRunElevatedand maps a declined prompt to exit code 1602.Also fixed a pre-existing, timing-dependent data race in Store code that CI's race detector caught on this PR:
enrichState.refreshChart's goroutine now uses the client captured when it starts, soTestAnnotatorReadsCompletionAndReleaseDateWithoutFetchingswappingc.enrich.clientno longer races with it.Store policy finding
Decision: keep Seaglass's download-and-run setup unchanged. The Store Edition is not distributed through the Microsoft Store: it ships as a signed NSIS installer on GitHub Releases with its own signed update feed (
docs/store-edition.md,.github/workflows/build.yml). The "Store" in the name is the experimental game store, so Microsoft Store Policies don't apply to this build.For the record, if it were ever listed in the Microsoft Store (version 7.20, updated 2026-09-14, https://learn.microsoft.com/en-us/windows/apps/publish/store-policies), the setup would have to change:
In that case "Set up" would have to link to the official ViGEmBus/HidHide pages and only detect the drivers. That would be a separate packaging, not this build.
Checks (local)
Check command
go test ./internal/... && npm --prefix frontend run check && npm --prefix frontend test: passes. One run hit an unrelated Windows TempDir cleanup flake inTestAchievementsGetAndCache; the rerun was clean.npm run check: 0 errors. Vitest: 202 tests passed.go run ./tools/notices -check,wails3 build,go test ./...andgo test -race ./internal/...: all pass.Bindings regenerated with no diff.
Live
WL_REAL_VIGEM=1 go test -run RealViGEm ./internal/vpadon ViGEmBus 1.21.442: passed. The first attempt timed out reading the state back through XInput; the second passed in 0.17 s.CI
build/windows: passes.To test by hand