Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ A Windows game launcher that finds installed games on its own (stores, external
## Commands
- Install frontend deps: `cd frontend && npm ci`
- Dev (app): `wails3 dev -port 9245` (or `task dev`)
- Dev (interface only, made-up games): `cd frontend && npm run dev:mock`
- Dev (interface only, made-up games): `cd frontend && npm run dev:mock` (`?layout=console|orbit`, `?games=N`, `?art=steam`, `?syncer=missing|old|off`, `?controller=ready|restart|missing`; `window.mockPad("down")` presses a controller button)
- Build: `wails3 build` → `bin/Seaglass.exe`
- Installer: `wails3 task installer VERSION=vX.Y.Z MAKENSIS=".../makensis.exe"`
- Regenerate bindings after changing exported service methods or their types: `wails3 generate bindings -f '-tags production' -clean=true -ts -i`
Expand Down
50 changes: 50 additions & 0 deletions THIRD_PARTY_NOTICES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@ Go standard library and runtime BS
golang.org/x/image v0.46.0 BSD-3-Clause Seaglass.exe
golang.org/x/net v0.56.0 BSD-3-Clause Seaglass.exe
golang.org/x/sys v0.48.0 BSD-3-Clause Seaglass.exe
HidHide (ported IOCTL definitions) MIT Seaglass.exe (internal/vpad)
Microsoft Edge WebView2 Runtime bootstrapper Microsoft redistributable Seaglass-setup.exe
NSIS (Nullsoft Scriptable Install System) Zlib Seaglass-setup.exe (installer)
SDL 3 3.4.16 Zlib Seaglass.exe (embedded SDL3.dll)
svelte 5.57.1 MIT Seaglass.exe (interface)
ViGEmClient (ported protocol definitions) MIT Seaglass.exe (internal/vpad)


========================================================================
Expand Down Expand Up @@ -568,6 +570,24 @@ Same license text as Go standard library and runtime above.
Same license text as Go standard library and runtime above.


========================================================================
HidHide (ported IOCTL definitions)
License: MIT
Included in: Seaglass.exe (internal/vpad)
HidHide's control IOCTL codes are ported to Go from https://github.com/nefarius/HidHide (Shared/HidHideIoctlContract.h).

MIT License

Copyright (c) 2020 Eric Korff de Gidts
Copyright (c) 2021-2024 Benjamin Höglinger-Stelzer

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


========================================================================
Microsoft Edge WebView2 Runtime bootstrapper
License: Microsoft redistributable
Expand Down Expand Up @@ -618,3 +638,33 @@ Permission is hereby granted, free of charge, to any person obtaining a copy of
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


========================================================================
ViGEmClient (ported protocol definitions)
License: MIT
Included in: Seaglass.exe (internal/vpad)
The ViGEmBus client protocol (IOCTL codes, XUSB report and request structures) is ported to Go from https://github.com/nefarius/ViGEmClient (include/ViGEm/km/BusShared.h, include/ViGEm/Common.h, src/ViGEmClient.cpp).

MIT License

Copyright (c) 2016-2023 Nefarius Software Solutions e.U. and Contributors
Copyright (c) 2018 Benjamin Höglinger-Stelzer

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
9 changes: 9 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,15 @@ The DualSense was found 25 to 300 s late after Seaglass started, and again after

- `pad.Manager` times `SDL_Init`, `SDL_Quit` and each `SDL_PollEvent` (SDL looks for new controllers inside it). A call over 5 s is logged with its duration and sets `State.Slow` until SDL next starts. The interface shows a note telling the person to reconnect the controller (`lib/padstate.ts`), and diagnostics flag it.

Seaglass also got its own Xbox controller, so Xbox-only games no longer need Steam to work with a DualSense. Steam Input worked badly for this, and Steam had to be installed, restarted and told about every game.

- **Seaglass's Xbox controller**: a virtual Xbox controller (ViGEmBus) that plays what the real controller does, with HidHide hiding the real one from the game. Settings → Xbox controller for games sets up both drivers: Seaglass downloads the official releases, checks them against hashes pinned in Seaglass and runs the installers (Windows asks for permission for each).
- **Steam stays**: Settings has a choice of what turns a PlayStation controller into an Xbox one in Auto, Seaglass (default) or Steam (`padTranslator`, per PC). Games set to Steam Input still use Steam.
- **New per-game mode, Xbox controller**: always starts with Seaglass's Xbox controller (`padMode` `xbox`). Without the drivers the game starts directly, and the launch says how to set them up.
- **The real controller is hidden only while the game runs** (`hidePadWhilePlaying`, on, per PC), so games that also read it directly don't see every press twice. HidHide's released versions (up to 1.5.230) only have the block list saved with its settings, so Seaglass writes each controller it adds there to `hidden-controllers.json` first. It takes exactly those off again when the game ends, when Seaglass starts or quits (so a crash is undone at the next start), and from **Unhide controller** in Settings. A HidHide with the per-process list (1.7, unreleased so far) is used instead when it's there.
- **Without ViGEmBus, Auto starts Xbox-only games directly** with a hint to set it up, instead of going through Steam Input, which worked badly. Steam can still be chosen in Settings or per game.
- ViGEmBus results are handled as ViGEmClient does: a report submit only fails on "access denied" (the live test against ViGEmBus 1.22 found the bus ends good submits with other errors).

## 1.10.0 (2026-10-03): controller and audit fixes

A DualSense stopped being detected, and the mouse wheel did nothing in big picture. No cause could be reproduced without the controller, but the controller layer had three ways to stay released: mode switches from two places at once reaching the SDL thread in the wrong order (after which `SetMode` ignored the fix-up), an SDL start that failed and was never tried again, and the controller coming back only after the steps after a game. `pad.Manager` now signals a mode change and the SDL thread reads the newest mode itself; failed starts are retried every 30 s; the controller is active again at `Finishing`. An `SDL_OpenGamepad` failure is logged with SDL's error, and diagnostics show the mode SDL is really in (`Manager.InMode`).
Expand Down
6 changes: 4 additions & 2 deletions docs/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ These need the maintainer's accounts or decisions; nothing else can do them.

- A Windows game launcher that finds games on its own: store installs and external copies (games installed outside a store launcher: standalone and DRM-free installers, Steam API emulators, plain folders), and adds art and metadata the way Playnite does for Steam games.
- Two modes: **Desktop** (mouse, layout D) and **Big picture** (controller). Big picture has three layouts, picked in Settings: **Deck (default)**, Console, Orbit.
- First-class DualSense: native input, glyphs, haptics, lightbar, and the PS button to summon the launcher. Games without DualSense support start through Steam Input automatically. Games that support it start directly.
- First-class DualSense: native input, glyphs, haptics, lightbar, and the PS button to summon the launcher. Games without DualSense support get an Xbox controller automatically: Seaglass's own bridge (ViGEmBus and HidHide) is built; Steam Input stays as a choice in Settings and per game. Games that support it start directly.
- Syncer integration: save status per game, sync before launch, back up after exit, conflicts, and each person's playtime, achievements and settings following them between PCs.
- Pretty, responsive, secure and light: the interface unloads while you play.

Expand Down Expand Up @@ -71,7 +71,9 @@ These need the maintainer's accounts or decisions; nothing else can do them.
| Risk | Mitigation |
|---|---|
| Wails v3 is a beta that ships every few days | Pinned version, deliberate upgrades, thin Wails-specific layer |
| Steam only picks up `shortcuts.vdf` changes after a restart | Batch changes, apply when Steam is closed or after asking; only games that need Steam Input |
| Steam only picks up `shortcuts.vdf` changes after a restart | Batch changes, apply when Steam is closed or after asking; only games that need Steam Input. Applies only to the Steam fallback now |
| ViGEmBus was archived in 2023, so its driver is frozen | Seaglass talks to it through a Bridge interface, so VIIPER over usbip-win2 can replace it |
| HidHide's per-process hiding needs 1.7, which has no release yet | Seaglass uses the saved block list of 1.5.230 with a ledger of what it added, undone at game end, start, quit and from Settings; switch the pin to 1.7 once it is released |
| DualSense shared between the launcher and a game (Bluetooth report mode) | Passive listener while playing, no output reports, can be turned off |
| Steam also claims the PS button | Setting explained in Controller settings; detect and warn |
| Overlay over exclusive full-screen games | Recommend borderless windowed; overlay is optional; no injection |
Expand Down
Loading
Loading