Commit Graph
1345 Commits
Author SHA1 Message Date
Kurt Himebauch ccab14384d test: isolate unrooted log archive output 2026-11-05 13:52:43 -05:00
angelrenefm 2fb066507a fix(droiddeckctl): logs latest works without root
`logs latest` pulled the session folder under getFilesDir(), which adb
cannot read on an unrooted device, so it always failed with "Permission
denied" and droiddeck-scenario kept no logs for failed runs.

The agent bridge gets a `logs` method that writes the Share logs archive
to the app's external files folder (agent-logs/), and droiddeckctl pulls
that zip and unpacks it into the destination with the session's files at
the top, as before. Builds without the method still get the old pull.
2026-11-05 13:52:43 -05:00
Kurt Himebauch 4b6cba0a6d fix(l10n): mark Russian percent string unformatted 2026-11-05 13:49:20 -05:00
flexeykinDev 4f831fbd34 l10n(ru): translate strings added since the last translation pass
Adds the 83 Russian strings that showed in English: extra Steam libraries, session logs, dual screen launcher and sessions, PC keyboard options, the bottom screen desktop, screen swap, the stats HUD and the Mali bridge GPU info.
2026-11-05 13:49:20 -05:00
Kurt Himebauch a28ff05981 fix: handle enhanced log chooser launch failures 2026-11-05 13:32:46 -05:00
Kurt Himebauch 2ab8a1bac3 test: validate enhanced log share descriptor reads 2026-11-05 13:32:46 -05:00
wallentx 7053058db6 Harden enhanced diagnostics collection and sharing 2026-11-05 13:32:46 -05:00
wallentx 44f8d5de70 Check the matching diagnostic manifest entry 2026-11-05 13:32:46 -05:00
wallentx 3c6447528a Make secure log export testable under Robolectric 2026-11-05 13:32:46 -05:00
wallentx 5614bd5d5a Add enhanced one-session diagnostic bundles 2026-11-05 13:32:46 -05:00
KeegantheVeganat0r b563b8d1eb fix(hud): translate low FPS toggles in all supported locales 2026-11-05 12:38:55 -05:00
KeegantheVeganat0r 6b887c42af feat(hud): add independent 1% and 0.1% low toggles 2026-11-05 12:38:55 -05:00
Omar Al Taki 3d1f0f63b9 fix(input): release a held mouse Back only when its own device disconnects 2026-11-05 12:13:51 -05:00
Omar Al Taki aad60fef5b fix(input): keep the right button down until every overlapping mouse Back is released 2026-11-05 12:13:51 -05:00
Omar Al Taki db8c66b107 fix(input): keep mouse Back routed to screen-key text fields while editing them 2026-11-05 12:13:51 -05:00
Omar Al Taki abb28792e8 fix(input): release a mouse Back right click on focus loss and pass nav Back through
Address review: a navigation-bar Back that arrives while an injected mouse
Back is held now stays Back instead of releasing the right button early.
A held right button is released on pause, focus loss and input-device
removal, like the other held Back handling. While the session is
suspended or still loading, Back is no longer sent to the guest.
2026-11-05 12:13:51 -05:00
Omar Al Taki 57b3623a9a fix(input): mouse right click no longer acts as Back in REDMAGIC cast mode
REDMAGIC's cast mode replaces a mouse's right button with a Back key that
names no device and lacks the virtual-hard-key flag that the navigation
bar and back gesture set. During a session, a Back from a mouse, or that
injected form while a mouse is connected, now presses the guest's right
button. The navigation bar, back gesture and controller Back still act
as Back, and so does a right click while a DroidDeck menu is open.

A mouse's Back and Forward buttons no longer also send a left click;
Android delivers them as key events.
2026-11-05 12:13:51 -05:00
HCOOKIELYT 0544933abd fix(steam): show progress while applying client updates
Forward extraction and installation messages from the x64 bootstrap log and replace stale download percentages with the applying-update state. Add regression coverage for phase ordering and log forwarding.

Fixes #812
2026-11-05 11:56:42 -05:00
Kurt Himebauch fe1dd8ca72 test(battlenet): close the folder scan case 2026-11-05 11:56:37 -05:00
visail 969b7e625f fix: list Battle.net games installed under Blizzard's China uids
Blizzard's China client records some products under a CN uid, so the installs
it makes never reach the Library and their Stores card keeps offering Install:

  Diablo II: Resurrected  osic      (catalogue had osi)
  StarCraft II            s2_cn     (catalogue had s2)
  Diablo Immortal         anbs_cn   (catalogue had anbs)

title() now resolves those uids to the international title, so the Library, the
Stores "installed" state, the cover folder and the launch code all agree, while
Game.installUid keeps the uid the Agent recorded for updates and uninstalls.
TITLES and STORE are untouched.
2026-11-05 11:56:37 -05:00
sanogueralorenzo 1c24c600cd refactor: clarify adaptive stick hit testing and test setup 2026-11-05 11:43:46 -05:00
sanogueralorenzo d8c1bc6059 fix: extend left adaptive stick activation to the screen edge 2026-11-05 11:43:46 -05:00
uubooster-team e1fe6f99cf fix(network): handle gatewayless IPv4 VPN links
Provide compatible gateway metadata for IPv4 VPN links without changing
VPN routing, and keep text and JSON network snapshots consistent.

Add regression tests for gateway selection and network snapshots.
2026-11-05 11:43:30 -05:00
vitamin663-sys 92a588ea16 fix(input): add radial stick dead zone setting 2026-11-05 10:53:15 -05:00
cphillamandmaxjivi05 e879375ca4 fix: upscale game buffers before native-resolution composition (#1367)
* fix: upscale game buffers before native-resolution composition

* fix: drop an added code comment from the effects source draw

* fix: effects source keeps pillarboxed games and near-full source rectangles

* fix: a larger opaque draw above keeps the full composition path

---------

Co-authored-by: maxjivi05 <maxjividen@gmail.com>
2026-11-05 10:34:19 -05:00
Kurt Himebauch 7c5bf77f17 fix: fit output after pip resize 2026-11-05 10:18:37 -05:00
visail a0a7a66470 fix: use Blizzard's China hosts for Battle.net installs and update checks
The Agent's install request pointed at http://cn.patch.battle.net:1119/<product>.
That host only 301-redirects to the country's version service today; Blizzard's
China client asks cn.patch.battlenet.com.cn:1119 directly.

The update check built <branch>.version.battle.net, so a China install (branch
cn) asked cn.version.battle.net, which does not answer; the China service is
cn.version.battlenet.com.cn.

Only region cn changes.
2026-11-05 09:56:40 -05:00
kmnkv1 26c562c174 fix(stores): moving through the side menu no longer freezes the launcher (#2105) 2026-11-05 09:44:45 -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
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
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
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 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
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
Kurt Himebauch a2a05ebc5b fix: preserve the runtime PATH when overriding guest binaries (#1826) 2026-11-03 22:00:41 -05:00
Kurt Himebauch 1915e16fe1 fix: controller focus moves into an opened folder (#1962) 2026-11-03 21:56:57 -05: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 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
Daniel Noam 627aea0e8f Merge main 2026-11-03 19:32:54 +02: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
Kurt Himebauch 61cbf91150 fix: the navigation bar stays dark when the launcher is not fullscreen (#1975) 2026-11-03 06:58:51 -05:00