seed_install read the app's manifest from every library before checking
that it was the linked DroidDeck install, so a manifest in another library
that is not UTF-8 raised past the caller and stopped routing for later
games. It now returns before reading anything but the linked manifest.
An untouched manifest from an older version was migrated even while
steamapps/downloading/<appid> existed; that migration now waits until
Steam is not staging the app, like the rewrite of a queued import.
An added game the account owns is linked into Steam as DroidDeck-<appid>.
When the folder carries no Steam build, Steam marks it Update Required and
checks every file before updating. That check reads the whole game, and an
interrupted one starts over, so on an SD card it ran again in every session
and kept the card busy: Lords of the Fallen (33 GB) restarted 51 times in a
day on an AYANEO Pocket FIT Elite.
The manifest for such an import now asks Steam to update the game when it
is launched. Imports that Steam already rewrote, but whose update has not
started, switch from "always keep updated" to "update when launched"; a
priority of 2, an update in progress, or an import with a recorded build is
left alone.
Stream each archive entry to disk instead of reading it into memory,
refuse an archive from a session that started after the state call, and
delete the exported zip from shared storage once it has been pulled.
`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.
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
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.
Zink's rebind_image() and zink_rebind_all_images() refreshed only a sampler
view's main image view after the resource got a new backing object. The
view's zs_view and cube_array surfaces stayed on the old object and were
freed with it, so the next descriptor update wrote a garbage VkImageView.
On PowerVR (needs_zs_shader_swizzle) every RGBX/BGRX view has a zs_view, and
Steam's web helper segfaulted in vkUpdateDescriptorSetWithTemplate within
seconds of fast Right presses on the Home shelf. The new Mesa patch rebuilds
all of the view's surfaces with init_sampler_view().
Avoid decoding every app when Start without Steam resolves one game launch. Use wanted-app selection in the single-game helpers while keeping the existing field decoder and full-reader default for bulk callers.
Track partial coverage separately from complete results, share one immutable byte snapshot for incremental queries, and keep timestamp invalidation and warm hits. Preserve the last valid duplicate record and release the raw snapshot after a full decode.
Add format/cache/structural-budget and launch-resolution regressions, reuse the existing binary fixture encoder, and document the host-only performance scope.
* 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>
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.
* 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
* 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.
* 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
* 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>
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>
* 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
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.
* 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).
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.
* fix(runtime): keep the Linux desktop installed across a runtime update
A runtime update replaces the whole runtime tree, and the desktop pack
is built against one runtime, so every update removed the installed
desktop. Since the runtime started updating by itself, this happened
without the user doing anything: the next Open showed "Install & open"
and downloaded the whole desktop again.
When the desktop was installed before the update, the same update job
now installs the new runtime's desktop pack right after the runtime,
with the update's progress. If that install fails, the runtime update
still counts as done and Open offers the install as before. A repair
from the session no longer installs the desktop a second time when the
runtime install already did.
* fix(runtime): roll back a failed desktop restore after a runtime update
If putting the desktop back fails after its archive started unpacking,
the install journal stayed behind, and every later launch, Steam
included, tried to resume it and stopped when that failed. The update
now rolls back the partial desktop with the desktop removal, which
restores the runtime's own files and clears the journal. Open then
offers the desktop install as before.
Whether the desktop was installed is now checked on its own, so a
repair of a damaged runtime also restores it.
* fix(session): do not install the desktop again after resuming it
Opening the desktop with an interrupted desktop install resumed that
install and then installed the desktop a second time. The second
install is now skipped when the resume already completed the desktop.
On phones where Android blocks the GPU's sysfs files for apps, the HUD
reads the GPU without root (#1969). On Adreno 8xx that showed no GPU
clock and only the partial load from Vulkan timing (OnePlus 13, Adreno
830, reported by iamTooShaar).
- GPU clock: the clock job used the Adreno 6xx/7xx registers. The
register layout is now picked from the KGSL chip id: on 8xx
CP_ALWAYS_ON_COUNTER is 0x8e7 and the RBBM cycle countable is 1.
Unknown later generations read nothing.
- GPU load: hardware-scheduled kgsl kernels (every 8xx, and some 7xx
such as the AYANEO Pocket FIT's) never write the memstore ringbuffer
timestamps. When those stay 0, the reader samples the contexts' own
memstore entries (every context that has submitted work, up to 64,
contexts with new or running work first).
- HUD diagnostics report: a "GPU readers without root" line with the
reason each reader works or fails, "none" instead of "null", and the
per-core CPU % source named honestly.
Tested: iamTooShaar's OnePlus 13 shows GPU clock and load with the PR
test build (06be2c5). Pocket FIT standalone build of the final readers
against the kernel's sysfs numbers: idle 1-2 % vs 3-4 %, GPU job loop
25-29 % vs 28-30 %, clock 1050 MHz vs 1050 MHz. The review fixes after
the test build were not tested on the OnePlus 13.