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>
Close Zink's emulated GEM handles on KGSL (Xwayland dma-buf leak)
The session preload hands out GEM handles on the KGSL render node by
duplicating the dma-buf descriptor, and released them only through
drmCloseBufferHandle. Zink gives handles back with
drmIoctl(DRM_IOCTL_GEM_CLOSE) instead, which KGSL refuses, so every
duplicated descriptor stayed open and kept its buffer alive.
Xwayland asks for a handle for each buffer it imports through gbm. With
"Force game windows fullscreen" fighting a game's own resolution
(DiRT 3 at 1280x720), the game recreates its swapchain many times a
second and Xwayland piled up ~2,000 old swapchain images (6+ GB) in
seconds until Android killed the session. A preload trace on the device
put 2,090 of 2,118 open dma-buf descriptors in Xwayland on
drmPrimeFDToHandle called from Zink.
Handle GEM_CLOSE on the KGSL node in drmIoctl, and check the three DRM
symbols are exported in CI.
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