Commit Graph
1813 Commits
Author SHA1 Message Date
The412Banner cd452edca8 test(dual-screen): record the Steam chat element tree to events.jsonl
Test-only probe (sizes, flex settings, inline heights under .chat_main; no
text) to measure what still limits the friends column. Revert before merge.
2026-10-31 16:30:50 +00:00
The412Banner 5468ae3731 fix(dual-screen): fill Steam chat's friends column; close the chat when its renderer ends
Build 5 hid the header but the friends column stayed short, so the full-height
rule now also covers .chat_main_flex, .friendsListContainer and .friendlist.

On the Retroid Pocket Duo Android ends the WebView renderer about a second after
DroidDeck goes to picture-in-picture (am_kill 'isolated not needed', seen twice);
the page left on the bottom screen was dead. Handle onRenderProcessGone by closing
the chat with a note to open it again.
2026-10-31 16:30:19 +00:00
The412Banner 5dd63cd8a2 fix(dual-screen): give Steam chat its full height and hide its site header
Measured on the Retroid Pocket Duo (layout probe, now removed): in the
WebView body, #friendslist-container and .chat_main came out 0 px tall,
which folded the friends list, and the site header is the element before
.chat_main_flex (its class name is generated, #global_header is not on
this page). Removes the test-only probe from 083bdc05/ac08f48b.
2026-10-31 16:06:27 +00:00
The412Banner ac08f48bf8 test(dual-screen): write the chat layout probe to events.jsonl
The Retroid Pocket Duo's logcat keeps only error-level app lines, so the
Log.i probe from 083bdc05 never showed up. Test-only; remove with the fix.
2026-10-31 15:45:04 +00:00
The412Banner 083bdc0560 test(dual-screen): log the Steam chat page's layout structure
Temporary, for the next device test only: 4 s and 12 s after the chat page
loads, log the element chain at the top, at the friends list and at the
bottom of the page, plus the body's children (tag, id, classes, position,
height; no text, long digit runs masked). Steam's header is not
#global_header there and the friends list stops short of the bottom, so
the real elements are needed before fixing it. To be removed with that fix.
2026-10-31 04:16:00 +00:00
The412Banner 80d954d24e fix(dual-screen): listen for game telemetry on 127.0.0.1, not ::1
Android's InetAddress.getLoopbackAddress() always returns the IPv6
loopback (libcore InetAddress.java, "Android-changed"), so the listeners
were bound to [::1] and never saw the games' IPv4 packets to 127.0.0.1.
A listener bound to 127.0.0.1:20777 on the same Duo received DiRT
Showdown's packets.
2026-10-31 04:13:34 +00:00
The412Banner 7fa60b3977 fix(dual-screen): give the bottom-screen Steam chat room to lay out
At the panel's own scale Steam's desktop chat got about 600x300 CSS
pixels and its friends list collapsed under the group chats bar. The page
is now laid out wider and drawn at 0.75 of the panel's scale, Steam's site
header is hidden, and while the chat is open Close, mic and volume share
one row so the chat gets the rest of the screen.
2026-10-31 03:43:02 +00:00
The412Banner 5a6ff7a596 fix(dual-screen): read DiRT Showdown's shorter telemetry packet
DiRT Showdown sends 152-byte packets (38 floats) on port 20777 even with
extradata 3; the page only accepted 256 bytes and stayed empty. The first
38 floats carry speed, rpm, gear, pedals, lap and lap time in the same
places, so they are read now and the rest (lap count, position, fuel, max
rpm) stays empty for these games. The page also says when a port gets
packets it cannot read, with their count and size.
2026-10-31 03:43:01 +00:00
The412Banner 889e113903 feat(dual-screen): bottom-screen Steam chat uses the Steam client's sign-in
Open Steam Chat copies the web sign-in Steam's built-in browser already
holds (its Chromium cookie store under config/htmlcache, "v10" values) for
steamcommunity.com and steam-chat.com into the chat page before it loads,
so no second login is needed. Values are never logged; the copy of the
store is deleted right after reading. With no Steam web sign-in yet, the
page shows Steam's sign-in as before.
2026-10-31 02:52:43 +00:00
The412Banner 84344091fa fix(dual-screen): notification access page was hidden under the dashboard
Android opens the settings page on the bottom screen, under the dashboard
window, so the button seemed to do nothing. Open DroidDeck's own switch
there (Android 11+), hide the dashboard, and bring it back once access is
on (or when Dashboard is chosen again). The Chat page now says how to turn
the microphone on when the session has none.
2026-10-31 02:46:44 +00:00
The412Banner 705019e43a fix(dual-screen): avoid name clashes in the bottom-screen pages; stop a telemetry listener on socket errors 2026-10-31 02:19:22 +00:00
The412Banner 72935d1bea fix(dual-screen): close the screenshot folder comment 2026-10-31 02:17:34 +00:00
The412Banner e27cbbbd9a feat(dual-screen): Telemetry page on the bottom screen
DroidDeck's own numbers (FPS while the HUD runs, CPU, GPU, battery, from
the HUD's sources) plus a live dash for racing games that send UDP
telemetry to 127.0.0.1: Codemasters "extradata 3" (DiRT Rally, DiRT 4,
GRID) on 20777, Forza Data Out (Motorsport 7/2023, Horizon 4/5) on 5300,
OutGauge (BeamNG.drive, Live for Speed) on 4444. War Thunder's local
state page and Elite Dangerous' Status.json show without setup. The
listeners and readers run only while the page is shown.
2026-10-31 02:10:07 +00:00
The412Banner 3cab85cc44 feat(dual-screen): Chat & voice page on the bottom screen
Mic on/off for the session and game volume buttons (no Android volume
panel over the game), plus Steam's web chat, loaded only when opened and
kept to Steam's own sites. Keyboard keys typed on the dashboard stay on
the bottom screen; controller buttons still go to the game.
2026-10-31 02:05:42 +00:00
The412Banner 09631255a7 feat(dual-screen): Screenshots page on the bottom screen
A Take screenshot button copies the game frame (without the overlay) and
saves it to Pictures/DroidDeck. The gallery shows those plus the
screenshots Steam keeps under userdata; tap one to see it full size.
2026-10-31 02:03:28 +00:00
The412Banner 3bc00b6e9f feat(dual-screen): Downloads and Notifications pages on the bottom screen
Downloads: Steam downloads and updates (read from Steam's appmanifests,
including SD-card libraries), shader-cache downloads from the content log,
and DroidDeck store downloads, with progress and speed.

Notifications: other apps' notifications, after the user allows
notification access once. Kept in memory only, never saved or logged;
ongoing, summary and empty ones are skipped.
2026-10-31 02:01:12 +00:00
The412Banner 31e6c08be9 feat(dual-screen): Dashboard mode for the bottom screen
A new bottom-screen mode that holds pages (downloads, screenshots,
telemetry and more come in the next commits). It sizes itself from the
bottom display it is shown on, is offered only while it has pages, and
follows the existing Dual screen Auto/On/Off setting and display pick.
The last page is remembered.
2026-10-31 01:55:28 +00:00
MaxsTechReview a81d1a4d4e Ask for All files access when a USB drive is mounted but unreadable (#1872) 2026-10-30 21:21:26 -04:00
MaxsTechReview 28067b3bbe Run x86_64 Flatpak apps through FEX (#1875)
* Run x86_64 Flatpak apps through FEX

* proot: run an execveat with an absolute path like execve

* Find x86_64 Flatpak installs and resolve sandbox paths like the sandbox does
2026-10-30 21:21:22 -04:00
MaxsTechReview 8088e47d14 fix: "DroidDeck isn't responding" on dual-screen handhelds after the bottom screen takes focus (#1871) 2026-10-30 19:52:17 -04:00
MaxsTechReview 6673a892e2 fix: x86 Flatpak bundles are refused with a clear message instead of installing and failing to start (#1873) 2026-10-30 19:03:27 -04:00
MaxsTechReview 8cf01ebb77 fix: Linux games on an NTFS USB drive start the first time instead of failing to load a library (#1850)
* fix: a read-only file on a USB drive no longer fails to close the first time it is read

On the RedMagic Astra 2, Android's NTFS USB drive returns EIO from close() for a file opened read-only when that first read updates its access time; the update itself succeeds and the descriptor is released. The x86 loader under FEX treats a failed close as fatal, so every Linux game newly installed or updated on such a drive failed to start once (libfreetype.so.6: cannot close file descriptor: Input/output error). The session library's close() now reports success for EIO on read-only descriptors; errors on descriptors opened for writing are still returned.

* Check the read-write close still reports EIO
2026-10-30 18:36:08 -04:00
MaxsTechReview 7e47db2e2a fix: a game with a launch-option picker is no longer closed while the picker is open (MK11) (#1869)
fix: a game with a launch-option picker is no longer closed while the picker is open
2026-10-30 18:16:11 -04:00
MaxsTechReview 484afffffd Translate the strings added since the last translation pass (#1855)
* Translate the strings added since the last translation pass

* Fix translation wording from review

Use the Android settings labels for the pairing guide in bg, cs, da, de, fi, ru and zh-CN, correct the frame limit divisibility wording in de and nl, describe owned games without implying purchase in hi and ru, fix the VRAM label in es-419, describe GOG replacement files correctly in tr and name the Guide button in zh-CN.
2026-10-30 18:08:05 -04:00
MaxsTechReview 0b1af34a5f fix: library filter, sort and display menus aren't cut off in portrait (#1827)
* fix: library menus open toward the side with room, so in portrait they are no longer cut off

In portrait the Filter, Sort, Display and Collections buttons sit at the left of the screen, but their menus still grew to the left and were squeezed into the space before the button, cutting the labels. A menu now opens the other way when its own side is narrower than the menu and the other side has more room.

* fix: step-out menus keep their outline with the content when a resize flips the side

* fix: step-out menus still take keyboard focus when the layout shifts while opening
2026-10-30 17:04:59 -04:00
MaxsTechReview 2ff682a4f5 fix: a folder of games with an extra non-game folder still lists each game (Rance 01) (#1822)
* fix: a folder of games still splits into its games when it also holds a folder with no game, as with Rance 01 in a VNs folder

A visual-novel folder on game storage held a steamapps folder with no exe in it. The group check asked every subfolder to hold a game, so the whole folder stayed one game and a pick in Rance 01 switched that game instead of adding its own. Folders without a game and Steam library folders no longer count, and old games folders being moved to entries split such a folder the same way.

* Check a folder's own entry, removal and store ownership before splitting it, and keep folders with redist or extras as one game

An old Games folder that was removed keeps its games removed after the split, a folder already added stays as it is, and a store game's folder is never split.

* fix: a split games folder keeps the game it launched and that game's settings

When an old games folder entry is split into one entry per game, the
folder holding the selected exe is kept even if ranking left it out (or
the parent stays whole when the exe sits directly in it), and the
parent's name, app ID, launch options and other settings carry over to
that game without overwriting settings it already has.

* fix: a split games folder never migrates steamapps and keeps the launched exe

A saved exe under a steamapps or hidden folder keeps the old entry whole
instead of adding that folder as a game, and the game that inherits the
old entry's settings keeps the exe the old entry launched when nothing
was picked.
2026-10-30 16:58:23 -04:00
MaxsTechReview 18f6305977 fix: banking apps no longer refuse to open while DroidDeck is installed (#1824)
* fix: banking apps open again with DroidDeck installed; the shortcuts accessibility service is listed only once the user sets it up

0.6.7 added HomeButtonService, a key-filtering accessibility service, enabled in the manifest. Android lists it as an installed accessibility service on every phone, and banking apps such as UBS refuse to start while one from outside the Play Store is installed. The service is now disabled by default, turned on when the user opens the Shortcuts setup, turned back off if they leave it unset, and kept on for anyone who already uses it.

* Keep the shortcuts service declared and turn it off at start unless the user chose it, so an update never drops their choice

A failed read of the enabled-services setting now changes nothing.

* Hide the unchosen shortcuts service right after an update, before DroidDeck is opened

A package-replaced receiver in its own light process runs the same listing sync as startup. The manifest default stays enabled because Android drops an unavailable service from the enabled-services setting, which would erase the choice of users updating from 0.6.7.

* Hide the shortcuts service as soon as the user turns it off in Accessibility settings
2026-10-30 16:55:09 -04:00
MaxsTechReview 7bc3529722 fix(audio): DirectAudio no longer crackles where Android refuses low-latency output (#1862)
* fix(audio): DirectAudio no longer crackles where Android refuses low-latency output

On devices where Android won't give the game a low-latency output (AYN Thor,
Android 13), DirectAudio kept Wine's 10 ms period and 12 ms buffer. An
emulated game audio thread can't keep that pace there, so audio crackled.
The session now checks for low-latency output and, only when it is refused,
asks DirectAudio for a 20 ms period and a 60 ms buffer.

DirectAudio's settings are now AUDIO_DIRECT_* everywhere in DroidDeck and are
handed to the driver under the names it reads when DirectAudio is set up.
AUDIO_DIRECT_MS and AUDIO_DIRECT_PERIOD_MS can be set per game.

* fix(audio): game profile DirectAudio settings and the microphone-off setting reach the driver
2026-10-30 16:34:45 -04:00
Kurt Himebauch 9cc56631cd feat: test and local builds show a faint PR, commit and title watermark (#1863) 2026-10-30 15:29:41 -04:00
Kurt Himebauch a5b035b247 test: the required-status gate expects the skip-on-superseded condition (#1866) 2026-10-30 15:25:28 -04:00
MaxsTechReview a8cebd024b fix(ci): required-check test matches the gate's !cancelled() condition (#1864)
fix(ci): the required-check test expects the gate's !cancelled() condition
2026-10-30 15:20:30 -04:00
MaxsTechReview 7c49eef79f fix(dual-screen): keep the bottom-screen controls up while a game loads (#1840)
* fix(dual-screen): keep the bottom-screen controls up while a game loads

The session opened its bottom-screen trackpad only at the game's first frame. The launcher's bottom menu closes when a game starts, so on dual-screen handhelds the bottom screen showed whatever Android app was behind it for the whole load, which is long for Xbox games while Xodus prepares them. The controls now open when the session starts. Devices without a built-in second screen, and players who turned the in-game controls off, are unchanged.

* fix(dual-screen): pick the bottom-screen panel again once the session's controller is known

Opening the bottom-screen controls at session start can run before SessionService has prepared the Steam Deck pad, while SessionState.deckPad is still false, so the trackpad could be chosen where the Deck controls belong. That early choice is now provisional: at the game's first frame it switches to the panel the remembered choice and the real deckPad give, unless the player has already picked one.

* fix(dual-screen): keep the loading-time panel choice through PiP, background and new sessions

* fix(dual-screen): retry a terminal panel opened before it was ready and keep a manual close made during loading
2026-10-30 14:32:34 -04:00
Kurt Himebauch c8c5e22a34 fix: new Steam installs start with shader pre-caching off (#1861) 2026-10-30 14:17:45 -04:00
Kurt Himebauch fa4a54f64a Default game library to vertical covers (#1857) 2026-10-30 14:09:44 -04:00
MaxsTechReview 83980035c6 fix(desktop): video wallpapers no longer race ahead after DroidDeck returns from the background (#1833)
* fix(desktop): video wallpapers no longer race ahead after DroidDeck returns from the background

* test: give the vrclient loader harness the clock syscall hook
2026-10-30 13:58:49 -04:00
MaxsTechReview 8f7cdb7106 fix: Battle.net scales its windows to large desktops instead of opening tiny on high-resolution screens (#1832) 2026-10-30 13:58:44 -04:00
MaxsTechReview 9a1334b73b fix: on dual-screen handhelds DroidDeck no longer jumps back over apps opened from outside it (#1828)
fix: the bottom-screen panel no longer pulls DroidDeck back over an app opened on the main screen from outside DroidDeck

On dual-screen handhelds the panel took focus and moved DroidDeck's task forward whenever another app opened over it on the main screen, unless DroidDeck had opened that app itself. A frontend such as iisu, or Settings opened from a shortcut, was covered again within a fraction of a second. The panel now stops reclaiming once the launcher is paused, and starts again when it resumes.
2026-10-30 13:58:40 -04:00
MaxsTechReview ab949a4a5a fix(runtime): the x86-64 Steam client starts again on the Ubuntu runtime (liblzo2-2 for FEX) (#1825)
* fix(runtime): ship liblzo2-2 so the x86-64 Steam client can install FEX

FEX's unsquashfs links liblzo2. The Ubuntu runtime did not ship it, so the FEX check failed on every build, the x86-64 client was never set up, and the session went straight back to the home screen. Only phones with the desktop installed had it.

* fix: the x86-64 Steam client starts again after it updates itself under FEX

On its first start the x86-64 client downloads a 500 MB update and, under FEX, ends on an illegal instruction (rc=132) instead of asking for a restart with rc=42, so the session ended there. The client is started again once.
2026-10-30 13:58:35 -04:00
MaxsTechReview b91e8fdeab fix: a session in picture-in-picture draws at 30 fps instead of the full refresh (#1842)
* fix: a session in picture-in-picture draws at 30 fps instead of the full refresh

Since auto picture-in-picture became the default (#1727), pressing Home leaves the session running in a small window that takes no input. A game kept drawing at its full rate there: on a REDMAGIC Astra 2 Among Us in picture-in-picture drew 3.31 W, the same as playing it and about 1.05 W more than a suspended session. While in picture-in-picture the compositor now paces the session at 30 fps (or a lower limit already set). Mirroring to glasses keeps the glasses rate, and the display mode request ignores the picture-in-picture limit so the app in front is not slowed.

* fix: keep the no-argument output limit the glasses pacing tests read

* fix: hold scene renders to the output limit and keep frame generation off in picture-in-picture

A frame limit only paced dmabuf buffer releases, so a shared-memory client was still drawn on every vsync with its frame callbacks sent at the panel's rate. The vsync tick now waits until the limit's interval, less half a refresh, has passed since the last scene. Frame generation is disarmed while picture-in-picture is shown and armed again when it ends; frame generation requests are applied in order.

* Give the commit render harness the frame limit hold

* Hold scene renders to a frame limit deadline, also on the fallback timer, and keep frame generation for glasses mirroring in picture in picture
2026-10-30 13:29:10 -04:00
MaxsTechReview 021e7153fa fix: Automatic dual screen needs a real second touch panel (Odin keeps its side rail) (#1801)
* fix: AYN Odin handhelds are single-screen in automatic dual-screen mode

* Use a second screen only when more than one physical screen is lit, instead of excluding AYN models

* fix: open the session panel when the second screen turns on, and keep the On mode's display choice

* fix: let the session panel open again after its screen goes away and returns

* fix: Automatic dual screen needs a touchscreen for the second panel instead of counting lit displays

* fix: check the second screen again when a touchscreen comes back after the display

* fix: check the second screen again when a touchscreen is added or removed, and on resume

* Keep the second screen panel closed once the session has ended
2026-10-30 13:19:21 -04:00
Kurt Himebauch 524292f457 fix: drop the runtime installs on first Play chip from the Steam home (#1854) 2026-10-30 13:04:16 -04:00
Kurt Himebauch 92c1560f63 feat: Steam's sleep-after timers start every session as Disabled (#1848) 2026-10-30 12:13:12 -04:00
MaxsTechReview 41615d2460 fix: Steam's UI runs at the panel's full refresh rate again (#1841)
#1809 held Steam's own UI to an even share of the refresh near 60 fps whenever it had focus. On 120 Hz and faster screens Big Picture then felt locked at 60 while games ran at the full rate, and players reported it as a regression. The compositor now releases Steam UI buffers unpaced again, like a game's. The larger swapchain stays limited to games, so the client UI still uses gamescope's default image count.
2026-10-30 11:10:03 -04:00
Kurt Himebauch bc1a010411 fix: launching a game from a frontend starts it instead of sitting on the home screen (#1844) 2026-10-30 10:34:30 -04:00
MaxsTechReview d31f234f74 fix(xbox): games run from their own folder on the short drive, not the drive root (#1804)
* fix(xbox): keep the game in its own folder on the short drive instead of at the drive root

* fix(xbox): SD card Xbox games can read their own package files

Xodus mounts a store library on the selected SD card at /mnt/droiddeck-stores/<card> and links the launch view to it, but game sessions only bound that library as /mnt/droiddeck-sd. The links were dangling inside the game, so MicrosoftGame.Config, appxmanifest.xml and XCurl.dll could not be read and GDK games stopped with "Failed to initialize GDK". Game sessions now bind the same store roots Xodus uses.

* fix(xbox): give the SD Steam library its own store path when another store root shares the card

externalRootsForXodus added the selected Steam library's Games folder with the card's guest path even when another store root on the same card already used it, so both bound to one destination. It now takes a path-derived suffix in that case, the same way externalRoots separates its own roots.
2026-10-30 10:10:23 -04:00
FX1922 6ffe675a57 fix: match the game page's check for updates, uninstall and edit art buttons to the frosted design (#1831) 2026-10-30 09:31:05 -04:00
MaxsTechReview fb5af9d35e fix(runtime): cutscenes and in-game videos play again with DroidDeck-Proton (libva-drm2, libva-x11-2) (#1823)
fix(runtime): ship libva-drm2 and libva-x11-2 so DroidDeck-Proton's video demuxer loads

DroidDeck-Proton's ffmpeg links libva-drm and libva-x11. The runtime only had libva2, so winedmo.so failed to load and Media Foundation video stopped: Resident Evil Revelations hung on its loading screen with "Failed to create demuxer, status 0xc000007a", and RE engine and Kingdom Hearts cutscenes broke. Installing the desktop hid it because Plasma pulls both in.
2026-10-30 09:18:09 -04:00
Kurt Himebauch b75060c280 feat: cap the frame rate in session for games launched without Steam (#1813) 2026-10-30 07:39:31 -04:00
FX1922 67d391958f feat: apply itch updates as butler patches (#1829) 2026-10-30 07:38:06 -04:00
4770d11e39 feat: Add physical controller button shortcuts (#1202)
* feat(controller): add physical button shortcuts

* fix(controller): improve shortcut capture and assignment feedback

* refactor(controller): simplify menu button assignment UI

* feat(controller): save menu assignments on button release

* refactor(controller): remove obsolete shortcut UI resources

* fix(controller): place drawer remaps below Back

* refactor(controller): simplify shortcut capture wording

* fix(controller): refresh active shortcut bindings on changes

* fix(controller): preserve drawer confirmation for mapped A

* fix: preserve controller shortcut navigation and cancel

* test: align shortcut dialog assertions

---------

Co-authored-by: xXJsonDeruloXx <danielhimebauch@gmail.com>
Co-authored-by: Kurt Himebauch <136133082+xXJSONDeruloXx@users.noreply.github.com>
2026-10-30 07:08:59 -04:00