Brings in the app UI scale presets (#272), compact settings headers (#268), the
undimmed session menu (#267) and the MangoHud battery fix (#270). Setup's
Launcher group lists Language first and App scale after it; the scale's three
new strings are translated.
A game whose resolution differs from the screen's (DiRT 3 at 1280x720)
fights --force-windows-fullscreen: every forced resize makes it rebuild
its swapchain, and the picture flickers between its own size and the
screen's - often from the first menu, before the player can reach the
game's resolution setting. It also drove the Xwayland dma-buf leak fixed
separately.
The switch stays in Settings > Games and the session drawer, now off
unless turned on; its hint says when to turn it on (a game coming back
small or in a corner after switching apps, e.g. FlatOut) and when to
leave it off (flicker). Users who already set it keep their choice. The
session script's fallback when the app passes nothing is off as well.
Co-authored-by: The412Banner <the412banner@users.noreply.github.com>
- #166: export the fake-input ring paths with the spelling the session tree is bound under
(Context.getFilesDir(), /data/user/0/...) instead of the canonical path. Where /data/user/0
resolves to /data/data (ColorOS 16) the guest has nothing bound at the canonical prefix, so
libfakeinput could not open the rings and every pad, physical and on-screen, was dead. The ring
path logic moves to FakeInputRingPaths so it can be unit-tested without the native library.
- #219: play a game's rumble on the physical controller that last drove the pad, when Android
exposes its motors (strong and weak separately on Android 12+), and fall back to the device's
vibrator for the on-screen pad or a controller without rumble. PadBridge records the active
controller; the on-screen pad taking over moves rumble back to the phone.
- #153: when a program takes a pointer lock (a mouse-look game through gamescope), capture a
physical mouse and send its raw deltas as relative motion, so the camera no longer stops where
Android's pointer meets the screen edge. Capture is released for the drawer, the PC keyboard,
picture in picture, focus loss and pause, and when the lock ends.
Brings in the display settings and in-session controls rework (#247). Its
layout and behaviour are kept; the choices it shows (scaling filters, frame
limits, texture options, effect presets, Back order, the auto touch mode)
use the translated labels, and its new strings are translated.
On a short screen the language menu shows five entries; with Chinese chosen
the checked one was below the fold. A menu now brings its checked entry into
view when it opens.
Side by side in a pane under 720dp, each channel's name and date were cut to a
word in every language. Also lowercase the relative time inside "Checked
...", which Android capitalizes to stand alone (Spanish "Comprobado Hace 5
minutos").
On a 640dp-wide screen the Japanese "Install & open desktop" button left the
card's title a character a line, and three tiles a row left the emulators'
names as an ellipsis in every language. The button now goes under the title
when the card is under 640dp, and the grid shows two tiles a row under 720dp.
The Session tab's Back setting showed "1: menu 2: QAM" in every language: the
two orders were Kotlin constants. They are string resources now, written as
"Menu → QAM" and "QAM → Menu" and translated.
On a phone in landscape the language menu shows five of its eight entries and
ends on a whole row, so nothing hints that more follow. While the list can
scroll further it now fades out at the bottom over a down arrow.
* Clarify display sizing, game fit and scaling controls
* Replace aspect and resolution controls with one dimension menu
* Organize Steam session settings into tabs
* Keep session resolution out of the live controls panel
* Group live session controls and add a conditional second-screen tab
* Refine session sliders, tab icons and contextual controls
* Simplify screen effects with presets and collapsed advanced controls
* Give in-session tab icons more spacing
* Center the loading cancel button glyph
Text that still reached the screen in English because its function had no
Context now comes from resources: the child-process limit's titles and
instructions, the update blocks and install failures, game save and storage
errors, game file export errors, component package errors, the GPU's support
line, family and unnamed fallback, and the driver source tags. The setting
choice lists and screen effect Looks use their localized labels, the second
library menu is built from separate resources instead of splitting a label at
its separators, and an account without a name gets whole sentences rather than
a stand-in name. The device report keeps its English text.
Fills the 600-700 strings each language was missing, including the text just moved out of the
code (#212), and corrects existing translations that had lost a sentence, inverted a meaning or
broken a placeholder. Hong Kong Chinese now uses Hong Kong terms throughout rather than mainland
ones in traditional characters. Plurals carry every quantity each language needs.
The loading screen's checklist, the session's package lines and the Decky
plugin button branched on the English wording of progress lines that are now
translated. They now carry what the line is about beside it: the installer's
Step, a LoadingState topic and readable flag (the session script's English
"== STEP" lines are still classified by their text), and DeckyManager's
downloadingBinary. English behaviour is unchanged.
Refs #212
A client stopped part way through updating itself can be left unable to
draw anything. Its files and our install stamp are still on disk, so the
installer never looked at it again and every session sat on "Waiting for
Steam" with nothing retried.
The session now adds a line to package/droiddeck-unconfirmed each time it
starts the client, and the app removes the file on the client's first
frame. After two starts in a row with nothing shown, the installer:
- drops Steam's update manifests, the stamp, .crash and steam.pid
- deletes package zips whose sha1 no longer matches their name
- downloads the client again over the old one
steamapps, config and userdata are left alone. An automatic repair runs
once per failure, until a start is seen again.
The Steam page's Client settings get a "Repair Steam client" item that
queues the same repair for the next start. The request is only cleared
once the download completes, so an interrupted repair is retried.