* fix: ship the Ubisoft launcher service as an add-on pack, not inside the APK
* fix: treat the Ubisoft service as a packed tree, stage it when its pack lands
* fix: serialize staging of the Ubisoft service
* feat(ubisoft): sign in to Ubisoft Connect and list the owned library
* feat(ubisoft): download games natively through Demux and Ubisoft's CDN
* fix(ubisoft): show the owned games on the store page
* fix(ctl): reach the agent bridge by broadcast when the shell has no content command
* feat(ubisoft): run Ubisoft games in one prefix with Ubisoft Connect installed and the game registered
* feat(ubisoft): launch games through a native stand-in for Ubisoft Connect's local service
* feat(ubisoft): document the launcher pipes, log why owned games have no download, drop the installer after extraction
* feat(ubisoft): Steam-owned Ubisoft games install through Steam, and the launch session carries the game's application id
* feat(ubisoft): answer Denuvo activations through Ubisoft's activation service and log unanswered pipe traffic
* feat(ubisoft): report installed chunks to the game and skip add-ons the account does not own
* fix(ubisoft): the overlay stays off, Ubisoft's install steps pick Windows components, and shared-prefix games keep their own settings
* fix(ubisoft): write the manifest's registry values, and pick the game's exe over Ubisoft's installer stubs
* fix(ubisoft): stream download slices, guard the launch hook, and keep per-game components in the shared prefix
* fix(ubisoft): direct launches in the shared prefix keep their own game id
* ci(ubisoft): build the launcher service after the prepared components are verified
* fix(ubisoft): verify reused files, drop syncs from a signed-out account, and clear activation requests before launch
* fix(ubisoft): fetch again a reused file whose slices cannot be checked
* docs: research and plan for EA and Ubisoft stores
* feat(ea): EA store with sign-in, library, native downloads, updates and launch without the EA app
* perf(ea): fetch large archive records as parallel ranges
* fix(ea): register game display names
* fix(ea): license legacy EA Core games and harden the LSX endpoint
* fix(ea): run legacy Origin SDK games with a stand-in Origin process
* fix(ea): trust only the prepared game on LSX and stop stale library syncs
* fix(ea): close LSX sessions on stop and drop clients that never hand-shake
* fix(ea): require every hashed field before licensing or caching a probe
* fix(ea): trust one LSX session per launch
* fix(ea): serialize the library cache write with sign-out and rerun a skipped sync
* fix(ea): hand off library sync requests under one lock
* fix(ea): clear the sign-in before invalidating the library
* fix(ea): serialize sign-out with token refresh and with the library cache
* fix(ea): LSX trusts only verified peers, new launch closes old sessions, exit stops its own game
* fix(ea): LSX hides profile and presence from unverified peers
* fix(ea): LSX handshake has a fixed deadline and untrusted sessions yield their slot
* fix(ea): LSX never registers a client after its listener was stopped
* fix(ea): LSX evicts each untrusted session at most once
* fix(ea): LSX admission and eviction share one lock and keep the cap
* fix(ea): LSX trust promotion excludes eviction
* fix(ea): LSX launch generation guards restarts and drops results after shutdown
* fix(ea): LSX publishes launch state under the admission lock and tags accepts by generation
* fix(ea): LSX restarts rebind its listener and promotion checks the launch generation
* fix(ea): record why EA refuses a game licence in the store log
* chore(ea): log owned offers and the full licence refusal
* chore(ea): log the account's entitlements when no game licence is granted
* chore(ea): log legacy entitlements when no game licence is granted
* chore(ea): log only the refused game's own entitlements
* fix(ea): skip trial launchers flagged 1 and license games whose LSX peer Android cannot name
* fix(input): injected Back is a right-click only while an external mouse is attached
* input: order imports
* fix(input): reject built-in devices for injected Back
* fix(input): log matched mouse for injected Back
* fix(input): ignore mice that name themselves virtual for injected Back
* fix(proton-run): find Proton tools in Steam libraries
* fix(proton-run): register the wrapper for an installed Valve Proton depot
Valve's ARM64 Proton depots are not compatibility tools, and running
them directly bypasses the DroidDeck wrapper. Register the wrapper from
the depot when a store app is launched before Steam has started, instead
of scanning steamapps/common.
* test(proton): install complete tool fixtures in the auto-update tests
* fix(proton-run): skip incomplete Proton depots and keep listing tools when the wrapper cannot be written
* fix(proton-run): pick a runnable depot and rebuild a wrapper whose launcher is missing
* test(proton-run): remove redundant depot fixture write
* fix(proton-run): rebuild a wrapper whose manifest is missing
* test(proton-run): cover runnable depot selection
* fix(session): wait for Steam readiness before launch
* fix(session): keep the launch fallback when Steam readiness or the interstitial is unavailable
* fix(session): cap the Steam readiness wait by elapsed time and bound each check
* fix(session): keep waiting for Steam readiness through focus changes and never pass a zero timeout
* fix(input): fakeinput no longer aborts programs whose allocator calls a hooked function at startup
* fix(ctl): screenshot finds display ids that the device name carries inline
* fix(input): fakeinput registers its fork handlers before other threads see its config
* fix(input): Auto relative mouse stays off for direct touch without a mouse
* fix(input): re-check relative mouse when an input device changes
* fix(input): reapply relative mouse after agent readiness
* fix(input): only the current session clears the agent-ready hook and readiness resets relative mouse retries
* fix(dual-screen): drop the Dashboard notifications page and its notification listener
* test(session): freeze the clock in the memory-pressure policy harness
* fix(session): stop re-compressing game memory every 30 s when the game reads it straight back
On devices with 13 GB or less, the low-memory page-out skipped its
read-back backoff whenever memory was nearly exhausted. When the game
was actively using what was compressed, it read it straight back, so
the session pushed and re-read gigabytes every 30 seconds, pinning all
cores and freezing the game for 5-10 s each time. The read-back check
now applies on that path too: an effective page-out still repeats every
30 s, an ineffective one backs off as on the normal path.
* zRAM: keep the read-back backoff on the nearly-out-of-memory path
* zRAM: retry a skipped page-out after 30 s when nearly out of memory
* fix(steam): reconcile tool dependencies by supported platform
* fix(steam): refresh tool metadata and clear stale GE mappings
* fix(steam): clear any Proton mapping from Linux-only tools
* fix(steam): watch folders the client creates after the helper starts
* Watch each missing directory level as it appears
* Make the watcher level test wait on inotify readiness
* fix(gog): owned games the library listing leaves out stay owned
Since the GOG library is read from account/getFilteredProducts, a game
that listing does not return (one hidden in GOG Galaxy, for example)
dropped out of the library, and with it out of the GOG tab, which shows
owned games and the shelves. 0.5.0 read every owned id from
user/data/games and showed them.
The sync now takes the union of the listing and user/data/games. The
listing still names most games at once, and an owned id it lacks is
fetched like any other.
* fix(gog): the GOG tab's search reaches GOG's catalog
GogStoreCatalog.search was never wired to the backend, so searching the
GOG tab only filtered the owned library and the featured shelves; a game
that is neither could not be found. GogBackend now answers search from
GOG's catalog, like the other stores.
* fix(gog): keep cached owned games when the account list is unavailable
* fix(gog): install scripts' support files reach the prefix
A goggame-<id>.script can copy files into the prefix with supportData
actions: default INI files, Plugins.txt and other settings that mods such
as one-click editions need. Only setRegistry actions were applied, so
those games started without their configuration and ran as the base game.
droiddeck-store-launch now applies supportData after the registry, once
per script revision: copies from {app} and {supportDir} into {userdocs}
and {localappdata}, matching paths without regard to case. Links are
copied as links, paths outside those folders are refused, and existing
files are replaced only when the action asks for it.
* Keep GOG support data copies inside the game and prefix folders
* Copy linked GOG support sources as links and keep a player's own links
The session's TU_DEBUG=sysmem is meant for the Steam client and
Chromium-based apps. Flatpak and Snap apps inherited it, so emulators
and other programs installed that way rendered through system memory.
droiddeck-game-env now holds the Chromium check next to game_gpu, and a
small droiddeck-game-gpu wrapper applies both to any program. The
AppImage, Flatpak and Snap launchers use it, so the rule lives in one
place.
The session sets TU_DEBUG=sysmem for the Steam client's interface and hands
games their own value in DROIDDECK_GAME_TU_DEBUG, which droiddeck-game-env
applies to Steam launches (#1188). droiddeck-appimage-run never did, so
emulators and other AppImage programs rendered every pass through system
memory instead of Turnip's per render pass choice.
Apply the game value in droiddeck-appimage-run the same way: an empty
value unsets TU_DEBUG, any other value replaces it. Chromium-based apps,
like the Steam client's own interface, keep the session's setting.
fix(proton): a Valve Proton picked for a game in Steam stays on the ARM64 build made from it
Steam lists Valve's own Proton Experimental and Proton 11.0 next to the
DroidDeck tools. They are not runnable here, so a per-game pick of one was
replaced with the default. That used to be Proton Experimental ARM64, so the
pick looked kept; since an installed DroidDeck-Proton became the default, the
game is moved to DroidDeck-Proton instead.
When Steam records one of those tools for a title the sync already knows
(a title it mapped or one with a recorded pick), the title now gets the
DroidDeck tool built from the same Valve depot, stops following the default
and the choice is mirrored into the app's per-game setting. The same applies
to Steam's default. Titles nobody picked anything for still follow the
default, and Valve tools with no ARM64 build still fall back to it.
Mesa 26.0.8, which the Ubuntu runtime builds, carries the backport of
"zink: create views for samplers lazily", which dropped the depth/stencil
aspect check in init_sampler_view(). On drivers with
needs_zs_shader_swizzle (Imagination) every colour view with a constant-1
alpha, such as RGBX/BGRX textures, then got the red-only depth swizzle
view, so Steam's interface and games showed red as R=G=B.
Carry Icenowy Zheng's upstream fix d55418dae7 (Mesa MR 41923), which
restores the aspect check. It applies on top of patch 0004.
* ci: run approved fork PR compile jobs on the disposable fork runner
* ci: ignore fork runner heartbeats from the future
* ci: target the fork runner by its own label
* Read the fork runner heartbeat from a public gist
* Fall back to an anonymous read of the fork runner heartbeat
* docs: DroidDeck 0.7.0 release notes
* docs: add 0.7.0 release note media
* docs: drop the 30 second summary from the 0.7.0 notes
* docs: add the dual-screen Dashboard shots to the 0.7.0 notes
* docs: show the Dashboard as one stacked dual-screen image
* docs: add the swap screens GIF to the 0.7.0 notes
* docs: swap in the new Syncthing screenshot
* docs: add the HUD dock GIF to the 0.7.0 notes
* docs: add the Game Jolt screenshot to the 0.7.0 notes
* docs: show the full screen in the HUD dock GIF
* docs: merge the GPU bullets, add the no proprietary components line, put images above their bullets
* docs: add the 0.7.0 APK download button to the release notes
* docs: add the first-time contributors to the 0.7.0 notes
* docs: add KeegantheVeganat0r as a first-time contributor
* docs: add the shared Steam libraries screenshot to the 0.7.0 notes
* docs: rewrite the shared Steam libraries bullet and move it up
* docs: add the Mali support photo to the 0.7.0 notes
* docs: center 0.7.0 release media
* docs: credit The412Banner for Mali support in 0.7.0 notes
* docs: add the KDE desktop GIF to the 0.7.0 notes
* docs: add the desktop and swapped game clips to the 0.7.0 notes
* docs: use the Duo photo for the swapped screens
* docs: replace the swap screens GIF with the Duo recording
* docs: drop the swap screens GIF
* docs: keep a blank line before each release image
* docs: tweak 0.7.0 release notes
* docs: move smaller 0.7.0 items to improvements
* docs: fold the bottom-screen HUD into the Strip HUD bullet
* docs: pair the swap screens and KDE desktop media
* docs: move Game Jolt and Syncthing up in 0.7.0 features
* docs: put the swap screens and KDE desktop cluster after Mali in 0.7.0 features
* docs: reword shared Steam libraries and reorder KDE desktop bullet
* docs: add recent merged PRs to the 0.7.0 notes
* docs: auto component updates follow DroidDeck-Proton only
* docs: add input profiles, low-RAM memory, driver Auto and other recent changes to the 0.7.0 notes
* docs: add the second-screen layout editor to the 0.7.0 controller profiles notes
* docs: refresh the 0.7.0 pull request and contributor counts, mention controller profiles in the summary
* docs: 0.7.0 notes add the latest fixes and the DroidDeck-Proton, DD-Turnip and component changes
Adds the user-visible pull requests merged after the last refresh (Library
sort, runtime pack update, desktop app launches, GitHub AppImage variant,
DroidDeck-Proton default, component auto-update cleanup, UBWC and FEX preset
settings, controller navigation) and a section for what shipped in
DroidDeck-Proton 11-11.10 to 11-12.3, DD-Turnip 0.4.0 and DroidDeck-Components
since 0.6.9.
---------
Co-authored-by: maxjivi05 <maxjividen@gmail.com>