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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
* 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
* 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
* 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.
* 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
* 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.
* 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
* 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
* 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
* fix(desktop): video wallpapers no longer race ahead after DroidDeck returns from the background
* test: give the vrclient loader harness the clock syscall hook
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.
* 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.
* 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
* 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
#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.
* 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.
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.