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.
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.
* 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): 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
* 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
* 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.
* 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
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#680Fixes#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.
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.
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.
* 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.
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.
* 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.