2182 Commits
Author SHA1 Message Date
kmnkv1 26c562c174 fix(stores): moving through the side menu no longer freezes the launcher (#2105) 2026-11-05 09:44:45 -05:00
Kurt Himebauch e1c2b0e340 ci: trust ASEbrahim for signed test builds (#2124) 2026-11-05 09:38:38 -05:00
MaxsTechReview d4fe440b49 docs: README install step links the current APK (#2122) 2026-11-05 08:43:24 -05:00
MaxsTechReview 4c23092c55 fix(components): repaired components reach prefixes that already have them (#2121)
fix(components): the library sweep refreshes the catalog when it is safe to

A game job reads the cached catalog, and the installed check compares against
the cached revision, so a repaired component never reached a prefix that
already had it. The sweep now fetches the catalog first when online and not on
a metered or constrained connection.
2026-11-05 08:43:21 -05:00
MaxsTechReview a309428a2a feat(battlenet): import, list and delete World of Warcraft addons (#2111)
World of Warcraft, Classic and Forever get an Addons tab in the Library. It imports addon zips into the right Interface/AddOns folder, lists the installed addons, and deletes one after a confirmation.
2026-11-05 02:04:03 -05:00
MaxsTechReview b9dbd006be fix(storage): Windows installs on a natively mounted card no longer ask for an administrator (#2100)
* fix(storage): Windows installs on a natively mounted card no longer ask for an administrator

Cards mounted directly as FAT, exFAT or NTFS were not treated as Android
storage, so wineserver reported an Anonymous owner and refused permission
changes. Its chmod on these volumes also no longer fails the request.

* fix(storage): keep NTFS owners and the chmod error
2026-11-05 00:47:38 -05:00
Kurt Himebauch a9d2d09e64 fix: restore single-screen session menu controls (#2110) 2026-11-04 22:15:03 -05:00
Kurt Himebauch 516e3862fa fix: refresh repaired components and render Ubisoft Connect (#2090)
* fix: refresh repaired components and render Ubisoft Connect

* fix: address component repair and Wine registry review

* fix: repair manually enabled components and check registry writes

* fix: serialize component repairs and use Proton runinprefix

* fix: report queued component repair failures

* fix: preserve newer component repair waits

* Make component queue transitions atomic

* Isolate component apply failures by game

* Preserve pending repair when catalog is stale

* Restore persisted component repair revisions

* Update pending requirements atomically

* Respect disabled pending components per game

* Keep queue key state atomic while worker waits

* Pass selected game to component repairs

* Preserve pending repair when component is absent

* Preserve pending revision on catalog failure

* Test legacy pending repair revision recovery

* Isolate fake worker Steam app info lookup

* Merge queued Steam app info lookups

* Persist launch component revisions before repair

* Gate launch on component repair discovery

* Expand and refresh launch repair discovery

* Include new automatic picks in launch requirements

* Log repair persistence failures and align repair keys

* Use runtime key for Battle.net component repairs

* Retain failed component reapplications for retry

* Harden pending repairs and launch preparation

* Isolate wait-cool sleep mocking

* Allow launches without catalog when no repair is pending

* Queue launch repairs even if persistence fails

* Block launch when repair state cannot persist

* Allow launch when no component repair is needed

* Persist selected repairs when catalog is offline

* Drain offline component repair in test
2026-11-04 21:54:00 -05:00
K11MCH1 1ee5e924b6 Merge remote-tracking branch 'upstream/main' into fix/gamescope-p20
# Conflicts:
#	tools/gamescope/release.env
2026-11-05 08:23:28 +09:00
MaxsTechReview ab92033b90 fix(desktop): Steam's own header moves and resizes its windows (#2097)
* fix(desktop): Steam's own header moves and resizes its windows

Steam never asks KWin to move or resize its windows, and its maximize
button can only maximize. Each normal Steam window now reports presses
on its header and edges, and KWin handles them natively. No extra title
bar is added and other apps are unchanged.

* fix(desktop): drag regions cover the elements inside them

* fix(desktop): find Steam's drag regions by position

The Friends window's drag region ignores pointer events, so a hit test
never finds it. The check now runs once a press moves, so plain clicks
cost nothing.
2026-11-04 17:47:00 -05:00
Kurt Himebauch d62f017bce Add session log management to setup diagnostics (#2099)
* feat: manage session logs in setup

* fix: address session log review feedback

* fix: honor device date and time settings
2026-11-04 16:05:56 -05:00
Delete228 68b0396dfe Merge upstream PC input and dual-screen updates 2026-11-05 00:00:34 +03:00
MaxsTechReview f005241549 fix(desktop): download language packs from the release that has them (#2096)
* fix(desktop): download language packs from the release that has them

The Ubuntu runtime's release has no language packs or index, so the
desktop stayed in English for every language.

* fix(desktop): reinstall language packs when their release changes
2026-11-04 15:09:30 -05:00
MaxsTechReview bba40cd69c fix(desktop): a game's window follows its own window mode (#2094)
* fix(desktop): a game's window follows its own window mode

Desktop games ran in a titled gamescope window whatever mode they asked for. gamescope now fills the desktop for a fullscreen or borderless game and matches the window size of a windowed one.

* Use the p30 gamescope test build

* fix(desktop): a windowed game too big for the desktop is maximised

* fix(desktop): a decorated game window stays a window

* Use the published gamescope p21
2026-11-04 14:59:39 -05:00
Kurt Himebauch f3d6efbcfa docs: update download badge to 0.6.9 2026-11-04 14:14:07 -05:00
MaxsTechReview f1c1ca59fe fix(battlenet): use the right artwork for each game (#2092)
* fix(battlenet): use the right artwork for each game

World of Warcraft: Forever took retail art and its logo from a loose name lookup, and only fetched its own art when the Store tab was opened. Shop pages also supplied trailer stills and seasonal promos.

Each game now has chosen Blizzard key art with the shop page as a fallback, installed games fetch their art without opening the store, and lookups by name must match exactly. Art found by the old lookup is fetched again once.

* fix(battlenet): keep cached art if the new art cannot be fetched

Classic's variants fetch through the shared title, and a failing chosen image falls back to the shop page.
2026-11-04 14:12:16 -05:00
5cf69732ef fix(input): make a hardware mouse and keyboard work like a PC (#2053)
* feat(gamescope): a three way switch for relative mouse motion

Games that confine the cursor and warp it back to read movement never
reach the nested hints rule, so their aim stays bounded by the screen.
The convar defaults to 0 and leaves that rule alone; 1 forces relative
motion for the focused game, 2 keeps the pointer absolute even when the
rule would apply.

(cherry picked from commit db3d7555e0)

* feat(input): the session carries a relative mouse mode per game

Reads the mode from the game's gesture config, hands it to gamescope as
gamescope_relative_mouse, and pushes a change to the running session
through gamescopectl.

(cherry picked from commit e350d88464)

* feat(drawer): the relative mouse switch is a three way choice

Auto leaves it to the game, on forces relative motion, off keeps the
pointer absolute. Named in all 32 locales so none of the three falls
back to English.

(cherry picked from commit e96a187e02)

* fix(input): follow the focused game's relative mouse mode

Switching to a game whose saved mode differs left the session on the
previous game's mode, since only the drawer state was refreshed. The
requests also ran on a thread per selection, so two quick picks could
reach gamescope out of order.

(cherry picked from commit 7ff8c5d568)

* fix(input): retry the relative mouse mode gamescope did not take

The drawer state moved before the request ran, so a failed request left
the two out of step and the next focus change skipped the resend.

(cherry picked from commit cf0f82d8cd)

* fix(input): the relative mouse mode tracks the latest choice

The guest agent answers ok when it handled the exec, so a failing
gamescopectl was recorded as applied. Reconcile the newest desired mode
on the worker thread after each request, and only mark applied when the
command really exited zero.

(cherry picked from commit 5f5e3bd52e)

* gamescope: a hidden cursor under any pointer constraint is relative

Games that hide the cursor and confine the pointer had no lock hint, so the
nested pointer stayed absolute and the camera froze.

* Treat a hardware mouse as a real mouse in sessions

A mouse now moves the guest pointer by relative motion for the whole session
through pointer capture, so it no longer stops at screen edges or reaches
system gestures. Its cursor stays visible in every touch mode, follows the
game showing or hiding it, and clicks no longer press on-screen controls.

* gamescope: use the mouse test release

* Direct touch turns the camera while a game holds the pointer

A swipe in direct touch now sends relative motion when a game has the pointer
locked, including when the lock starts during the swipe, as when a game
hides the cursor while a button is held.

* Address review findings on mouse and touch input

Keep touchpad taps on on-screen controls, cancel a pending long press during a
locked swipe, let the three-finger gesture cancel a locked swipe, refresh
capture when the output changes, and use the menu's key for the relative
mouse setting.

* Keep locked touches inside the game picture and free the mouse in touch editors

* End touch editor ownership when the editor goes away

* Bring the mouse cursor back when a touch editor closes

* Release a pointer lock at the game's pointer

* gamescope: use the pointer position test release

* Fit the X screen to a fullscreen window larger than it

* gamescope: use the X screen fit test release

* Return the X screen when no game window has focus

* gamescope: use the X screen return test release

* ci: avoid redundant gamescope builds

* fix: hardware mouse in Desktop and pointer warping games

KWin nested on the host only reads relative motion while its own pointer lock is on, so a program that locked the pointer in Desktop (Blender orbit and pan) stopped receiving motion. A captured hardware mouse now turns that lock on, and a real Right Ctrl no longer toggles it.

Gamescope follows a game's pointer warps instead of overriding them, and absolute motion also sends raw motion. Also retries relative mouse requests, tidies the unplug path, passes side buttons and fits a second oversized window correctly.

* chore: use the gamescope build with patch 0131

* fix: Desktop mouse lock keeps retrying after early attempts fail

* fix: hold the key that turns on the Desktop mouse lock

KWin ignores a press and release delivered together.

* fix: gamescope enters warp following sooner and keeps steady motion

* chore: use gamescope p26

* Capture system keys in a focused session and keep the first Desktop mouse motion in place

* Use the p27 gamescope build

* Update the system keys row test

* Recognise a captured mouse so the Desktop grab can start

* Keep touch warps out of relative motion

* Send Esc from keyboards that report it as Back

* Use the p28 gamescope build

* Release captured keys on pause, forward motion during a grab and wait for a pending screen fit

* Use the p29 gamescope build

* fix(input): keep held system keys consumed until they are released

Copy each captured key event, since the service owns the original only for the callback, and consume the physical release of a key already released to the guest.

Use the published gamescope p20.

* fix(input): capture a system key only from its first press

---------

Co-authored-by: kingokksa <kingokksa@qq.com>
Co-authored-by: maxjivi05 <6025299+maxjivi05@users.noreply.github.com>
2026-11-04 13:27:08 -05:00
Kurt Himebauch eed9edaa1c feat: consistent bottom screen bar and menu-first navigation in sessions (#2084) 2026-11-04 13:26:35 -05:00
MaxsTechReviewandmaxjivi05 940efdab3a Reduce DXVK render-path pacing stalls on Adreno 722 (#2066)
Co-authored-by: maxjivi05 <6025299+maxjivi05@users.noreply.github.com>
2026-11-04 12:44:26 -05:00
MaxsTechReviewandAlbert b7878d2841 fix(battlenet): keep games installed inside Battle.net's folder running (#2087)
fix(battlenet): keep games installed inside Battle.net's folder running

A game installed under C:\Program Files (x86)\Battle.net\ (for example
World of Warcraft: Forever in "Battle.net\World of Warcraft\_forever_")
was counted as part of Battle.net itself. Launched from DroidDeck, the
launch never saw a game, said "Battle.net closed before a game started",
stopped everything left in the prefix, game included, and exited 1.

Battle.net's own files are now only those directly in its folder, in its
Battle.net.<build> folders and under ProgramData\Battle.net.

Co-authored-by: Albert <alb.carreras@gmail.com>
2026-11-04 12:13:34 -05:00
Kurt Himebauch 430af5e22d feat: desktop and scrolling wall live wallpapers (#2012)
* feat: desktop and scrolling wall live wallpapers selectable from Android settings

* fix: render the wall wallpaper off the main thread and give it its own thumbnail

* fix: serialize wall wallpaper visibility and wait out in-flight draws on surface destroy

* fix: restart the wall loop on surface recreation and keep queued visibility changes

* fix: keep the wall loop alive across a failed canvas lock and finish redraws before returning

* fix: post the wall redraw asynchronously on surface change

* fix: redraw the desktop wallpaper logo from the real mark and show game covers on the wall

* chore: mount the git dir in build containers and seed new worktrees from the main checkout

* fix: decode wall covers as RGB_565 and seed worktree assets only into empty dirs

* feat: drop the desktop wallpaper and add frame rate and speed settings to the wall

* feat: wall settings over the live wallpaper with a match-screen rate, and drop the center vignette

* perf: pace the wall on vsync and draw it on a hardware canvas

* fix: stage worktree seed copies and publish them only after they succeed

* fix: point the wall settings link at the activity class so the picker shows the gear

* fix: dedupe wall covers by app and space repeats like the in-app wall, keep the frame loop alive across surface gaps

* fix: show the picker preview behind wall settings and drop the display-rate lookup

* fix: stop wall frame callbacks when the surface goes and only replace an empty seed destination

* fix: skip a seed when the destination reappears before the staged copy is moved in
2026-11-04 11:38:54 -05:00
Moroni Granja 0110dc3c0f fix: a GOG install launches the game, not its config tool (#1644)
Blood Omen ships dxconfig.exe beside kain.exe and the shortcut pointed at
the config tool: pickExe kept the first .exe the folder listing returned
when no title match was found. Read the game's play task from GOG's own
goggame-<id>.info manifest first - a primary game task, or a primary
launcher task for launcher games, and the product's manifest ahead of any
other goggame-*.info - then the product's temp_executable; without either,
rank the folder's exes so a word of the title wins, config and tool names
lose, and depth then size break the remaining ties.

GOG's galaxy_*.exe support installer is not the game either. The Witcher:
Enhanced Edition ships galaxy_the_witcher_enhanced_edition_2.1.0.15.exe
beside launcher.exe, and its build metadata names that file as the
product's temp executable, so launching it starts a 32-bit installer that
stops at "Path not found" under ARM64 FEX - the same dialog as the setup
stub #1174 removed. Play tasks, the hint and the name search skip it.

Fixes #680
Fixes #694

Only a primary launcher task counts as a launch task: GOG files the
configuration tool beside a game as a non-primary launcher, so it now falls
through to the executable search instead of becoming the game.

The temp_executable hint is matched by basename with either separator and
must resolve inside the install folder, so a nested galaxy_*.exe is skipped
too and a hint cannot point outside the game.

GOG runs a task from the working directory it declares, and from the install
root when it declares none. That directory now reaches the sidecar and the
shortcut's Start In: a game in a subfolder (System/witcher.exe) starts where
GOG starts it instead of in System/, where it cannot find its Data folder.
2026-11-04 11:38:02 -05:00
MaxsTechReview d849e6ae0a fix: Home screen setting keeps DroidDeck in RedMagic Game Space (#2083) 2026-11-04 09:06:37 -05:00
MaxsTechReviewandmaxjivi05 26274114a3 ci: avoid redundant gamescope builds (#2070)
Co-authored-by: maxjivi05 <6025299+maxjivi05@users.noreply.github.com>
2026-11-04 00:38:17 -05:00
Kurt Himebauch 45fb017496 perf(steam): batch compatibility mapping updates (#1755) 2026-11-03 22:01:41 -05:00
Kurt Himebauch a2a05ebc5b fix: preserve the runtime PATH when overriding guest binaries (#1826) 2026-11-03 22:00:41 -05:00
Kurt Himebauch ad0d39f457 fix(quest): gamescope no longer aborts at start with vk.WaitSemaphores -13 (#1938) 2026-11-03 21:58:49 -05:00
Kurt Himebauch 1915e16fe1 fix: controller focus moves into an opened folder (#1962) 2026-11-03 21:56:57 -05:00
Kurt Himebauch c1b8f4c706 fix(hud): show the GPU clock in the Steam overlay on Adreno without root (#2059) 2026-11-03 21:54:55 -05:00
Kurt Himebauch 306cd789df feat(droiddeckctl): thermal and wait cool (#2062) 2026-11-03 21:54:29 -05:00
angelrenefm 8e480d0e84 feat(droiddeckctl): thermal and wait cool
Nothing in droiddeckctl reported temperature, so a before/after
comparison could start one run hot and the next cold.

`thermal` reads the battery temperature from dumpsys battery, the
thermal status from dumpsys thermalservice, and each CPU policy's
scaling_max_freq against cpuinfo_max_freq (capped when lower), all
readable over plain adb. `wait cool --below <C>` polls it every 10 s
until the battery is under that temperature, or exits 5 at --timeout.
2026-11-04 00:13:31 +01:00
angelrenefm 3ad13b1b66 fix(hud): bind the GPU clock and load nodes even when the HUD starts hidden
With the overlay hidden at session start the blocked feeds have no value,
so cur_freq and perf_now were never written before the binds were taken
and stayed unbound for the whole session.
2026-11-04 00:07:13 +01:00
angelrenefm 7901e76561 fix(hud): see the Steam session's mangoapp config when deciding whether the HUD is shown
Steam sessions point mangoapp at /tmp/droiddeck-mangohud.conf, so
OverlayShown never saw the overlay and the GPU clock stayed at 0 MHz.
2026-11-04 00:04:30 +01:00
MaxsTechReview f3650d3d37 Reduce on-screen stick load and honour Low latency off (#2048)
* Reduce on-screen stick load and honour Low latency off

On-screen controls requested unbuffered touch on every press, so turning
Low latency off had no effect on them. They now follow the setting.

Every stick move also redrew the whole overlay. Redraws during movement are
capped at 30 per second in both overlays, and stick moves under a pixel
are dropped in the standard overlay.

* Keep full stick deflection reachable

Moves under a pixel were dropped even at the edge of the stick, so the pad
could stop just short of full range.
2026-11-03 16:12:08 -05:00
Kurt Himebauch ad90d9e200 fix: find Steam libraries whose installs have no appmanifest (#2054) 2026-11-03 15:56:12 -05:00
Kurt Himebauch a9f365851e fix: fall back to completed manifests when depot.config lists none 2026-11-03 15:14:58 -05:00
Kurt Himebauch 4cc117b45b fix: read DepotDownloader's compressed protobuf depot.config 2026-11-03 15:05:04 -05:00
Kurt Himebauch 0cc187025f fix: read installed depots from completed manifest names too 2026-11-03 14:54:33 -05:00
Kurt Himebauch be5f1560b2 fix: find Steam libraries whose installs have no appmanifest 2026-11-03 14:39:45 -05:00
Kurt Himebauch 9f6c73442b fix(quest): answer denied KGSL timestamp reads so Steam starts on Quest 3 (#2050) 2026-11-03 13:06:57 -05:00
Daniel Noam 627aea0e8f Merge main 2026-11-03 19:32:54 +02:00
Kurt Himebauch edbe0c7179 fix(quest): drop a KGSL context's tracking before its destroy ioctl and restore it on failure 2026-11-03 10:55:54 -05:00
Kurt Himebauch ccd317384d fix(quest): ignore a finished wait when its KGSL context was recreated 2026-11-03 10:30:50 -05:00
Kurt Himebauch 9388ef07d8 fix(quest): grow the timestamp table instead of evicting an active context 2026-11-03 10:26:24 -05:00
Kurt Himebauch b7e550ae89 fix(quest): keep active contexts tracked and answer only queued and retired reads 2026-11-03 10:20:49 -05:00
Kurt Himebauch 4e571f1f99 fix(quest): answer denied KGSL timestamp reads so Steam starts on Quest 3 2026-11-03 10:09:44 -05:00
K11MCH1 5766696555 gamescope: ship p20 so the EA sign-in stays above the launcher splash
Patch 0126 (#2037) is in the source tree, but the app still stages the
p19 binary pinned here, built on Oct 29 before the patch existed. A fresh
install keeps drawing the EA Steam Launcher splash over the EA sign-in.

p20 is the gamescope-patched archive from the main build of 951270bc
(Droid-Deck/DroidDeck actions run 41637838020): patches 0002-0126
applied, gamescope tests Ok 2 / Fail 0.
2026-11-03 22:41:58 +09:00
K11MCH1 951270bc8f gamescope: EA sign-in stays above the EA launcher's splash (#2037)
* gamescope: EA sign-in stays above the EA launcher's splash

The EA app's Steam launcher shows the game's splash as a layered tool
window, and the EA app, another process, opens its sign-in window
topmost. gamescope took the splash as the sign-in's override window, so
the splash was painted over the sign-in and became gamescope's keyboard
focus window (Burnout Paradise Remastered). With patch 0126 a window from
another process that is neither topmost nor transient for a topmost
focus window is no longer an override candidate for it, as on Windows.
map_win now also reads _WINE_HWND_EXSTYLE: gamescope only took it from a
PropertyNotify, which it listens for from map on, so a style Wine set
before mapping was never known.

* gamescope: the topmost rule needs both windows' pids

gamescope keeps a window's pid at -1 when XRes cannot name its client,
so an unknown pid next to a known one is not evidence of two processes.
Patch 0126 now applies the rule only when both pids are known. The patch
carries function names in its hunk headers, and the test also checks
that its map_win hunk reads _WINE_HWND_EXSTYLE into hasHwndStyleEx (a
check of the patch text, not of a running gamescope).
2026-11-03 07:41:24 -05:00
K11MCH1 b7b08a40e8 Steam: EA games install the EA app (#2036)
The redistributable seeder marks every process in a game's install scripts
as already run, except Vulkan runtime and Ubisoft Connect installers. EA
games on Steam list the EA app installer (EADesktopSetup) there and start
through steam2ea://, which only the EA app handles. With the installer
skipped, Proton could not open that link (ret 31) and the game closed
without a window (Burnout Paradise Remastered). The EA app installer is
now left to run like Ubisoft Connect's, and a marker an earlier seeding
wrote is taken back out, so an existing prefix installs it on its next
launch.
2026-11-03 07:41:01 -05:00
Kurt Himebauch 8eeea5ef5a feat: add size, opacity and hidden-key settings for the PC keyboard (#1897) 2026-11-03 07:01:33 -05:00