mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-07 10:46:06 -10:00
main
2106
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
11218f0b24 |
perf(hud): reduce Strip rendering cost with bitmap graph and logo (#2235)
perf(hud): rasterize Strip graph and logo separately Replace PR2194's whole-View software layer with a hardware-accelerated Strip that rasterizes its graph and logo into small reusable bitmaps. Keep the 66 ms graph invalidation cap, clear stale graph pixels, and refresh cached logo colours when the theme changes. Include the comparison method and six sanitized benchmark samples. With matched Steam navigation, the hybrid averaged 12.2% less UI-thread CPU and 34.0% lower draw p95 than the PR2194 software path. App-process CPU averaged 5.9% lower in this run; whole-device and battery savings are not established. Current-build physical flicker confirmation is recorded separately from timing validation. Validation: all 12 DroidDeckHudPanelTest checks passed; comparison APK built and six alternating device samples completed with matched input counts, no focus loss, thermal status 0, and no frame metric report drops. |
||
|
|
d9bf6d8a17 |
feat: move UBWC compatibility from Components to Settings (#2008)
* feat: move UBWC compatibility from Components to Settings * fix: update driver menu tests for the moved UBWC restart check * fix: load saved UBWC mode at startup and block Settings restart during runtime operations |
||
|
|
041c3b1b55 |
ci: run compile jobs on the org workstation runner when it is idle (#2234)
* ci: run compile jobs on the org workstation runner when it is idle * ci: pick the compile runner right before each heavy job * ci: cover the runner picks in the job dependency test |
||
|
|
e5434117f2 |
fix(input): controller navigation works across the Controller tab and profile menus (#2231)
* fix(input): controller navigation works across the Controller tab and profile menus * fix(input): dialog choice rows expose their checked state |
||
|
|
b474cba79e |
fix(dual-screen): bring back the trackpad and Deck panels on the second screen (#2229)
Keyboard + trackpad and Deck grips + trackpads are second-screen panels again, rendering the stock layouts without changing the input profile. The last panel is remembered separately for desktop and game sessions; desktop sessions start on the trackpad. A Deck panel without the Deck pad falls back to the default. Stock panels left Steam blue return to the neutral look once. |
||
|
|
ffb76240fd |
fix(fex): show which preset Use Default resolves to (#2225)
* fix(fex): show which preset Use Default resolves to and rename FEX defaults to Stock FEX * test(components): the FEX preset chip names its resolved preset instead of Use Default * fix(fex): the game settings menu keeps Use Default beside the inherited preset * fix(fex): inherited preset chip follows the current Default preset |
||
|
|
875f8e3ce2 | feat(wow): download addons from WoWInterface and open CurseForge in the browser (#2219) | ||
|
|
5446497301 | fix: uninstalling a Flatpak app that Flatpak no longer has removes its folder (#2216) | ||
|
|
98a670fb81 |
fix(input): classic on-screen gamepad look, quick hide toggle and adaptive sticks switch (#2215)
* fix(input): bring back the classic on-screen gamepad look, quick hide toggle and adaptive sticks switch The unified input surfaces (#1439) drew the built-in gamepad as large rounded boxes labelled with control names, swapped the compact keyboard button for a wide pill, dropped the bottom-left show/hide toggle and left the Adaptive sticks setting with no effect once a layout was migrated. Gamepad elements are round again with shoulder pills, D-pad arrows, the old glyph labels and the tint-derived fill and outline. The keyboard is a small round button beside a restored quick show/hide toggle. Stick touch areas reach 25% further outward while keeping their inner edge, and the session menu gets an Adaptive sticks switch that writes the active layout's sticks. Libraries saved by the first unified build are restyled once without touching user edits or other layouts. * fix(input): overlay keyboard opens on the main screen and the D-pad matches the face buttons A keyboard command now carries the role of the surface that sent it, so the overlay's keyboard button opens the main screen keyboard as before the unified surfaces, while lower-screen and controller bindings still use a second screen. The D-pad buttons take the face buttons' size and spacing, and an untouched saved D-pad is resized around its own centre. Classic outlines sit where the old ones did and shoulder labels use their old size. * fix(input): keep edited D-pads and keyboard buttons, harden the quick and adaptive toggles Resize a saved D-pad only while its four buttons keep their original geometry, and replace the old keyboard button only while its name and shape are untouched. The quick toggle needs its own press before a release toggles it, and a cancelled touch does nothing. A rejected library write no longer crashes the session or changes the controller preference, and the Adaptive sticks switch shows whenever the built-in gamepad is the surface in use. * fix(input): show the adaptive sticks switch while the unfolded controls are up * fix(input): run the gamepad restyle as library version 10 and draw the quick toggle in Gray * fix(input): show the adaptive sticks switch whenever the built-in gamepad is the surface in use --------- Co-authored-by: Kurt Himebauch <[email protected]> |
||
|
|
a123af7c13 | fix(script-run): run x86 programs a native script starts through FEX (#2217) | ||
|
|
6026d72435 | fix(input): restore the neutral look of the bottom-screen controls (#2221) | ||
|
|
d5f3d1a0d5 |
fix(proton-run): follow a removed DroidDeck-Proton build to the newest one (#2223)
Battle.net, store games and desktop programs start through droiddeck-proton-run without the Steam client. When the Proton auto-update replaced the DroidDeck-Proton build that Steam's default or a title's mapping named, the name no longer matched an installed tool and the run fell back to Valve's Proton Experimental ARM64, which lacks DroidDeck-Proton's patches. World of Warcraft then hung at launch. A removed DroidDeck-Proton build now resolves to the newest installed one, the same successor steam-compatibility moves Steam's mappings to. |
||
|
|
4cb3a89483 |
fix: library scan and download cancel crash on Android 10 (#2204)
* fix: library scan and download cancel crash on Android 10
The storage scan read StorageVolume.getDirectory() for every volume to
build its key, but that method only exists from Android 11, so on
Android 10 the steam-library-scan thread died with NoSuchMethodError.
The directory is now read once behind the existing Android 11 check and
reused for both the key and the candidate path; older versions fall
back to the uuid, description and /storage scan as before.
Cancelling a download closes the response stream on a background
thread. The platform okhttp can throw IllegalStateException
("Unbalanced enter/exit") from close() while a read is still in
flight, which was uncaught and killed the app. That close now ignores
IllegalStateException as well as IOException; other failures still
surface.
Fixes #2200
* test: wait for the cancel task to finish instead of polling its thread state
The cancel-close tests decided the close task was done from the worker's
thread state, which can read WAITING while the pool is still cleaning up
after a thrown exception. A close failure that escapes ends its worker
thread, and Java runs the uncaught handler before the thread ends, so the
surfacing test now joins that thread. The suppression test hands the
cancel executor more work until it runs on the same thread, which only
happens once the close task has returned without throwing.
* test: watch the close task finish instead of probing which worker runs next
A cached pool can start a second worker, so a probe task may never land
on the thread that ran the close. The suppression test now waits until
the pool has no task running and that thread is back to waiting for
work, a state a worker that is exiting after a thrown exception never
enters.
|
||
|
|
22a675a664 |
Unify controller and screen input profiles for game and desktop sessions (#1439)
## Problem and intent Desktop sessions need configurable mouse, keyboard and application actions from a controller. On dual-screen devices, a lower-screen trackpad may already handle the pointer, leaving the physical controls available for other assignments. This PR gives physical controllers and local touch controls a shared profile/action model instead of separate configuration paths. This follows the centralization direction discussed in [#1202](https://github.com/Droid-Deck/DroidDeck/pull/1202#issuecomment-6299647180) and addresses the controller-input portion of #860 and #1356. Those discussions are context, **not prior maintainer approval** of this implementation. I would appreciate architectural feedback and guidance on splitting or coordinating this work if that would make review easier. ## Profiles and configuration - Controller stays within the existing Setup tabs. Game and Desktop each have a default-profile selector, followed by one profile list and device settings. - Named profiles reference three independently reusable parts: Physical controller, Main screen and Second screen. Layout geometry and action bindings are stored separately. Profiles can share physical controls while assigning different touch actions. - The session menu selects a complete profile, or expands to mix the three parts. A mixed selection can be saved as a new profile; Game and Desktop retain separate selections. - Both screens use the same full-size editor, with add, move, resize, snapping, undo and shared properties. The main-screen editor has movable, collapsible tools and is transparent above a running session. When editing the secondary display, its entire area is the canvas and the main display hosts tools/properties. - The old fixed gamepad, fixed Deck controls and separate Screen keys editor are replaced with editable presets and the shared renderer. Existing positions, bindings, shapes, symbols, imported images and toggle behavior migrate; legacy Screen keys become additional profiles without replacing the user's selected profile. Migration retains a backup before removing old preferences. - Saved layouts have thumbnails and screen targeting. Actions include compatible native output/remapping, keys/combinations, mouse buttons, pointer movement, vertical/horizontal scrolling, directional keys, existing menu/keyboard commands, and disabled. Buttons can use symbols, shapes and toggle behavior. ## Architecture and latency ```mermaid flowchart LR Library[Profiles + reusable layouts and bindings] --> Router[InputRouter] Physical[Physical controller adapters] --> Router Touch[Main + secondary InputSurfaceView] --> Sources[Owned pad / Deck sources] Sources --> Router BLE[Steam Controller BLE adapter] --> Router Router --> Native[Existing controller publication] Native --> Steam[Steam Input / guest controller] Router --> Held[Shared key and mouse ownership] Held --> Guest[Existing guest input outputs] Router --> UI[Existing menu / keyboard hosts] ``` Bindings resolve when the profile changes, outside event dispatch. Native forwarding has no additional frame/timer queue; identity routes reuse existing state/reports. Only synthesized continuous stick pointer/scroll motion uses a frame callback. One source releasing a key/button does not release another source's hold. Menu, profile, suspension and removal transitions release old outputs and gate held controls until neutral. Steam continues to own game-specific mappings and action sets. Steam Mobile Touch and VR retain their specialized paths. Raw device adapters remain responsible for transport/calibration and must join routing before publishing consumed controls; this does not claim that every adapter has been unified. Historical Thor measurements on the native Game path found kernel-event-to-guest-observer upper-bound medians of **3.061 ms baseline versus 2.999–3.403 ms candidate**, with a subsequent installed-APK check at **3.039 ms / 300 matched edges**. These are relative software-path measurements, not button-to-photon latency. Some tails increased, simultaneous BLE contention remains unmeasured, and **this UI revision has not had a new latency measurement**. The previous cursor fix changed visual update intervals from roughly 33.3 ms to 16.7 ms without changing sensitivity or adding smoothing. [Full design, migration and boundaries](https://github.com/Delete228/DroidDeck/blob/codex/unified-controller-input/docs/development/unified-input-proposal.md). ## Validation Updated through upstream 542bbf89c; current PR head |
||
|
|
ca6c409436 | fix(drivers): built-in Auto picks match the published table on Adreno 6xx and 8xx (#2151) | ||
|
|
7c429f3a26 | fix: droiddeckctl pacing reads timestats dumps with Windows line ends (#2186) | ||
|
|
aba55031c3 | perf: answer chown and bound thermal paths through the proot fast path (#2203) | ||
|
|
18c7d56409 | fix: Auto components update only DroidDeck-Proton and delete old builds (#2193) | ||
|
|
0b4bc827e7 | fix(battlenet): stop Battle.net's pages playing videos on the CPU (#2195) | ||
|
|
a552f1e293 |
fix(hud): isolate strip rendering in a software layer (#2194)
* fix(hud): skip relayout when size is unchanged and cap graph redraws * fix(hud): limit the redraw and relayout changes to the strip * fix(hud): draw the strip background from a cached bitmap like the panels * fix(hud): drop the strip-only redraw cap and relayout skip * fix(hud): the strip graph redraws at most 15 times a second * fix(hud): isolate strip rendering in a software layer --------- Co-authored-by: Kurt Himebauch <[email protected]> |
||
|
|
066834d17d | feat: compress idle game memory before low-RAM devices run out (#2187) | ||
|
|
aff9738748 |
Preserve second-screen choices across partial selections and migration retries
Track explicit whole-profile choices, including Auto, separately from inherited profiles so physical and main-screen overrides do not suppress legacy panel migration. Persist this distinction in library version 8 and read older selection records compatibly. Keep saved Deck panels during unavailable-controller fallbacks and retain legacy preferences when migration fails. Add regressions for all three review findings, explicit Auto selection and older saved libraries. Validation: all 992 input/UI tests passed. |
||
|
|
f33d5b9e09 | fix(components): auto updates follow DroidDeck-Proton only (#2190) | ||
|
|
281c2aea1b |
Preserve custom profiles when opening second-screen fallbacks
Only migrate stock controls for explicitly saved legacy panel modes. Automatic fallbacks retain the active profile layout and bindings without persisting an override. Add session regressions for automatic fallbacks, unavailable panels, explicit legacy migration and existing quick selections. Validation: all 986 input/UI tests passed. |
||
|
|
c2d7765619 | Fix desktop profile selection and simplify default touch layouts | ||
|
|
250f80fbb5 |
fix: stop switching between display modes with the same refresh rate (S26 lag and heat since 0.6.7) (#2192)
fix: stop switching between display modes with the same refresh rate |
||
|
|
08526f8283 | Preserve second-screen state when refreshing input profiles | ||
|
|
f44826ae3a | Merge main and retain unified input behavior | ||
|
|
31b8adbb55 | Guard shared input slots and mouse backend transitions | ||
|
|
542bbf89c3 |
fix: launch Battle.net and store games from any game page tab (#2185)
* fix(library): Keep one Play request per game and show Starting while it prepares * Track launch preparation per game * Keep each game preparing until its own worker finishes * Drop store lookups that finish after the activity ends |
||
|
|
e1987ca785 | chore: pin gamescope to the DroidDeck-Components p22 release (#2183) | ||
|
|
a81da1e476 |
feat(components): Auto updates for FEX, DXVK and VKD3D-Proton (#2156)
* feat(components): Auto updates for FEX, DXVK and VKD3D-Proton Each component gets an Auto or Manual mode on the Default Components page. Auto installs the newest DroidDeck-Components nightly into every Proton that ships the component, matching each Proton's ARM64EC or x64 flavour, keeps the current and replaced builds, and removes older builds it downloaded. A game that ran on the previous build and exits within 30 seconds twice on the new one rolls the line back; the failed build is skipped until a newer one is published. Existing manual choices keep that component on Manual, and DXVK stays on Manual while a GPU rule pins its version. * fix(components): Auto notes per line, Original label and first-update rollback Boot history on the Original is recorded before the first update so that update can roll back, rollback notes stay with their own component, the Original shows by name, and new Protons get the current build even when no newer one is published. * fix(components): Auto owns only its own downloads and follows in-place Proton updates Auto deletes only builds it downloaded, re-swaps a Proton whose version changed under an existing choice, reports a missing nightly listing as a failed check, writes its state atomically so the page can read it without waiting on a download, and words the rollback and download messages to match what it does. * fix(components): Auto keeps a rollback and reads updated Protons' own files After a rollback only a build newer than every rejected one is taken, so an older build still listed in the nightly cannot replace the restored one. Flavour detection treats a choice saved for an older Proton version as not applied, so a Proton Steam updated in place is read from its own files and re-swapped. A failed state rename falls back to a direct write and is logged. * fix(components): Keep the last good Auto state when a save fails * fix(components): Serialise Auto state reads and writes * Install the Linux runtime by itself on first launch The runtime auto-update skipped devices with no runtime, so FEX, Proton, DXVK and VKD3D waited for the first Steam launch to install it. Claim a first install when the device never had a runtime, on a usable network, outside battery saver and with a supported GPU, and check Proton as soon as the runtime is ready. A runtime the user removed stays removed. * fix(components): Check components as soon as Proton is installed The Auto check stamped its hourly timer even when no Proton was installed yet, so a fresh device waited an hour after Proton arrived. Skip the stamp until a Proton exists and run the check right after a Proton install finishes. * fix(components): Apply stored builds on every check and retry unfinished rollbacks A held or failed download no longer skips applying the stored build or stamps the hourly timer. Stored builds are applied on every check, so a new Proton is reconciled inside the hour, and a check requested while one runs is queued. A rollback that could not restore or swap a Proton is retried and reported only once it finishes. Removing the runtime marks it as seen so it is not installed again, and the failed-save test skips where the process can still write read-only files. * fix(components): Keep rollback restores pending until applied and save state on failure * fix(components): Hold newer builds until a pending rollback is applied * fix(components): Drop pending restores for removed Protons * fix(components): Never auto-install a non-ARM64X build over a Proton's own ARM64X DXVK or VKD3D * fix(components): Read probe archives outside the lock and block auto updates while the original build is unknown * fix(components): Require ARM64X when any Proton on the line needs it, and before each swap |
||
|
|
116728917f |
fix(input): Keep the Android pointer hidden over the game after hovering session menus (#2176)
* fix(input): Keep the Android pointer hidden over the game after hovering session menus * fix(input): Defer the overlay pointer icon from a container, since ComposeView is final |
||
|
|
5f180d909b |
fix(input): Click a touch stick only on a fast double tap (#2173)
* fix(input): Click a touch stick only on a fast double tap * fix(input): Count the release position in stick tap travel * fix(input): Treat cancelled pointer-ups as cancelled stick touches |
||
|
|
88acdbc3ab | ci: publish gamescope builds to DroidDeck-Components and never replace a tag (#2181) | ||
|
|
42b2810822 | ci: retry PR test build cleanup and sweep leftovers every six hours (#2180) | ||
|
|
1001bc00af |
fix: PiP scales the full-size output instead of shrinking it (#2174)
* fix: PiP scales the full-size output instead of shrinking it * fix: hide the performance HUD as PiP starts so it does not flash at full size |
||
|
|
69c6c14f3f |
fix(wow): Clear the game field selection after reading and sending chat (#2175)
* fix(wow): Clear the game field selection after reading and sending chat * fix(wow): Skip the field cleanup when the chat request has closed |
||
|
|
6060f2288f |
feat(wow): voice type and keyboard chat bar for World of Warcraft (#2171)
* Add voice and keyboard chat input for World of Warcraft Open a chat bar with an editable text field when a WoW client focuses a text box (reported by Proton's winex11 IME context hook through agent/wine-ime.json). First use asks for Voice type or Android keyboard with a remember toggle; the choice is also in the side menu's Keyboard group while a WoW client runs. Voice type uses the device's speech recognition service. On dual-screen devices the bar and keyboard open on the second screen. Send types the text and presses Enter; Cancel presses Escape. * Cover the Arm64 WoW client in the chat match test * Give the second-screen chat bar the session's result and back owners * Open the WoW chat bar with the game field's current text When the bar opens, select and copy the game's text field and fill the bar with it through the session clipboard bridge, then put the guest clipboard back. Send selects the field first, so the bar's text replaces what was there instead of being appended. * Keep WoW chat consistent across screen changes and failed field reads Close the bar when the game field closes even after the program name is cleared, move the bar to the top screen when the second screen drops it, and drop any pending second-screen keyboard request when the bar opens. A field read that gets no copy of its own leaves the game text unselected and Send then types without replacing it. Ctrl is only pressed and released when nothing else holds it, and a pending read ends when the clipboard bridge stops. * fix(session): Close WoW chat for other programs and keep the game cursor on cancelled reads |
||
|
|
915f373d82 |
Harden input migration and session lifecycle
Keep migration binding IDs stable, preserve unreadable libraries before recovery, and retain forward-version protection. Release keyboard owners on focus loss, handle unavailable settings displays, and allow controller confirmation or cancellation after physical key capture. Stop BLE routing and publication synchronously before asynchronous disconnect. Add regression coverage and record local and Thor validation. |
||
|
|
7b7722bd25 | Preserve replacement session Deck input routing | ||
|
|
63004567fd | Unify configurable control surfaces and profile management | ||
|
|
aa3757eff1 | Merge remote-tracking branch 'origin/main' into codex/unified-controller-input | ||
|
|
a1bc8467fd |
feat: show Steam launch options on the Launch tab (#2163)
* Show Steam launch options on the Launch tab * fix: Launch options is one row on the Launch tab, like the shortcut fields * fix(launch): reread Steam's launch options when the game page resumes * fix(launch): keep launch options disabled while they reload on resume * fix(launch): a saved launch option is not replaced by a read that started before it * fix(launch): an unreadable Steam config keeps the shown launch options instead of clearing them * fix(launch): an unparsable Steam config and a pending reload keep the shown launch options * fix(launch): the resume reload follows the game the panel shows --------- Co-authored-by: maxjivi05 <[email protected]> |
||
|
|
d6566f0dbe | feat: GOG achievements on by default, drop stores engine row (#2168) | ||
|
|
ba5876bf6d |
Merge latest upstream main before Controller UI integration
# Conflicts: # app/src/main/java/com/droiddeck/launcher/SessionActivity.kt # app/src/main/java/com/droiddeck/launcher/input/OnScreenControls.kt # app/src/main/java/com/droiddeck/launcher/input/PadBridge.java # app/src/main/java/com/droiddeck/launcher/ui/DeckControlsPanel.kt # app/src/test/java/com/droiddeck/launcher/input/PadBridgeQamTest.kt |
||
|
|
bf693d7f71 |
fix: Auto picks the upstream RADV pair on Xclipse 950 and 960 (#2158)
* fix: Auto picks the upstream RADV pair on Xclipse 950 and 960 * fix: Auto reads the Xclipse model after the Vulkan query * fix: Auto treats an unnamed Xclipse like the 950 and 960 * fix: Auto reads any three digit Xclipse model number |
||
|
|
4cbd7722f8 |
feat: the PowerVR runtime is a downloaded add-on pack, not bundled in the APK (#2157)
* feat: the PowerVR runtime is a downloaded add-on pack, not bundled in the APK * fix: a stopped session cancels the PowerVR pack download * fix: a session stopped during runtime unpacking ends before staging * fix: a failed PowerVR pack download ends the session with a message |
||
|
+1 |
3733c50902 |
feat: non-Adreno graphics stack (Venus, open driver pairs, gamescope patches) (#2029)
* Retain compositor resources when GPU completion is unconfirmed * Stop quarantined GPU callers before retries and mapped writes * Support Android hardware-buffer presentation over Wayland * Support PowerVR swapchains and linear image imports in Gamescope * Bundle verified PowerVR graphics components through existing build preparation * Detect and select the system Vulkan backend on PowerVR * Apply PowerVR Steam and game compatibility during normal launches * Show PowerVR support through existing driver and component controls * Update existing hardware guidance for system Vulkan support * Import the shared system Vulkan readiness check * Discover and propagate the actual PowerVR render node * Prune obsolete PowerVR runtimes after guest processes exit * Retain external DMA-BUF ownership after GPU quarantine * Name the PowerVR HAL selection explicitly * Isolate component UI tests from application startup * Cover the inherited FEX preset in PowerVR profile tests * Log test worker failures for CI diagnosis * Remove temporary test logging after diagnostic CI * Prefer system dependencies for the Android Vulkan loader * Capture raw stderr before test worker termination * Remove the temporary test worker crash probe * Import pinned DXVK recipe prerequisite from PowerVR PR570 Copy only the standalone build recipe, source pin, BC-format prerequisite and presentation-sync patch/check from wallentx/DroidDeck at |
||
|
|
f4e5032b7d | fix(fex): skip local patches already in the FEX release (#2152) |