Commit Graph
135 Commits
Author SHA1 Message Date
github-actions[bot] 7df694fe49 README: contributions ledger 2026-09-23 02:32:10 +00:00
github-actions[bot] 0053d12407 README: contributions ledger 2026-09-23 02:16:54 +00:00
Kurt Himebauch 4d6ee985b9 Merge pull request #4 from The412Banner/update-app-icon 2026-09-22 22:16:47 -04:00
github-actions[bot] 94d74d35db README: contributions ledger 2026-09-23 02:15:33 +00:00
xXJsonDeruloXx d6a157578d Update app launcher icon 2026-09-22 22:15:06 -04:00
The412Banner 0b9f3106fe gitignore: the Kotlin compiler's session files 2026-09-22 21:54:33 -04:00
The412Banner 17c75bf671 PROGRESS_LOG: pull-request CI and the contributions ledger 2026-09-22 21:46:47 -04:00
github-actions[bot] d6a9c2ed90 README: contributions ledger 2026-09-23 01:44:05 +00:00
Kurt Himebauch 9931dc13a7 Merge pull request #3 from The412Banner/fix/session-back-key-routing 2026-09-22 21:43:54 -04:00
github-actions[bot] 4a3d5a7d66 README: contributions ledger 2026-09-23 01:40:36 +00:00
The412Banner 38df1e8141 CI: full history for the pull-request merge (the depth expression came out shallow), and git's own words when a merge cannot start 2026-09-22 21:40:22 -04:00
xXJsonDeruloXx ac2cfc1266 Fix session hardware back routing 2026-09-22 21:39:54 -04:00
The412Banner e228eca65e CI: pull requests build on pull_request_target (a conflicting one never fires pull_request); README: contributors and a ledger of their pull requests kept by a workflow 2026-09-22 21:38:40 -04:00
The412Banner 6eddda9808 CI: the pull-request report — mergeable or the conflicting hunks, and a failed build's errors, as one comment kept current
A pull request is checked out at its own head and merged onto main by the job itself: clean,
and the merged result is what gets built; conflicting, and the files and every conflicting hunk
go into the run summary and the comment, and nothing is built. The Gradle log is kept, and a
failed build's compiler errors (paths shortened) and Gradle's own 'What went wrong' are quoted
back. One comment per pull request, rewritten on every push; fork pull requests, whose token is
read-only, get the same text in the run summary.
2026-09-22 21:23:53 -04:00
The412Banner 45ca3c95c1 CI: a pull request against main builds itself (Bannerlator's PR check, in this one workflow)
Every push to the pull request rebuilds it and cancels the build it replaces (the concurrency
group is already per ref, and a pull request's ref is its own); a draft waits until it is
marked ready. The apk comes back as the run's artifact.
2026-09-22 21:19:41 -04:00
The412Banner e0dd8b8c59 on-screen controls: two sticks beside the d-pad, and the controls take the bars beside or under the picture
A left and a right stick (a base and a knob that follows the finger, clamped) write the pad's
thumb axes the way a physical stick does, and only while they own them, so a physical pad's
sticks are not zeroed by a tap on A. The layout follows where the compositor letterboxes the
picture: on a wide panel showing 16:9 the clusters go in the side bars, on a squarer panel
showing a wide picture they go in the bottom band, and only when neither bar is wide enough do
they overlay the picture as before. The activity hands the picture rectangle over whenever the
surface or the output size changes.
2026-09-22 20:41:14 -04:00
The412Banner 95cd642745 tonight's Bannerlator Linux fixes carried over: the client's GPU process gets its frames back, client-interface switches, Deck mode, a GPU gate before the download
- libpci: an empty file bound over /proc/bus/pci/devices, created at session start, so
  Chromium's GPU process stops dying on its way up and CEF stops falling back to SwiftShader
  (WinNative deff1ac6 via Bannerlator 8fb668d1: 44 -> 85 fps in the Big Picture library on a
  OnePlus 15; not measured here yet).
- Client interface, as toggles on the Performance page and lines in the device report:
  mesa_glthread, ZINK_DESCRIPTORS=lazy (now on by default) and MESA_NO_ERROR on; Steam Deck
  mode (-steamdeck -steamos3, the script builds the line) off.
- A non-Adreno device is told before the runtime download that a session would be sound over a
  black screen, and may still go ahead.

Not carried: Bannerlator's proot fixes live in its proot source, which this repo does not
build (the runtime tarball ships its own); its apk-proot -i guard is moot here (the apk carries
no proot); its session-log head keep is moot (Steam's logs are copied whole).
2026-09-22 20:12:54 -04:00
The412Banner 96d453e370 PROGRESS_LOG: r7 on main, r8 drawer + FEX presets 2026-09-22 18:51:32 -04:00
The412Banner 90ff23aea4 session: back key no longer knows the frame-generation dialog 2026-09-22 18:46:47 -04:00
The412Banner 63cde17bf4 session drawer in the front end's dress + FEX presets + landscape file manager
The drawer Back opens over a session slides in from the right and uses the same rows and
anchored menus as the settings pages: Now (HUD, frame generation, touch, the virtual pad,
keyboard, the client's menu) and Next session (display shape, FEX preset, compatibility tools),
with Send to background and Stop at the end. Steam-only rows show only in a Steam session.

FEXCore presets, Bannerlator's table carried over (core/FexPreset): a Games row in the Steam
settings page and the drawer; the chosen preset's FEX_* variables go into the Steam session's
environment so the games the client launches inherit them. Default = FEX's own defaults, which
is what every session ran on before.

The file manager and the picker stay in landscape like the rest of the app.
2026-09-22 18:44:12 -04:00
The412Banner af3f377dfd front end: Setup rows join the rail's tracked column (the pill can reach Performance); the session drawer keeps its frame-generation dialog 2026-09-22 18:31:13 -04:00
The412Banner 8dd36b794e settings without a pop-up: pages in the pane with anchored menus under each value; frame generation, logs and offline open in place on the rail
The cog's settings window and the Performance dialog become pages in the front end's pane:
one row per setting, its value in a chip, and a small faded menu that opens under the chip
(SettingsWidgets: AnchoredMenu on a Popup with its own position provider, MenuItem, ValueChip,
Choice/Toggle/Multi/Action rows). One menu at a time; the page dims while it is open; the back
key, the rail and the page's Back all leave it. Steam and Desktop each get a Settings entry in
the rail that lights while its page shows, as does Performance under Setup. Frame generation,
Session logs and Start offline open their menu right on their rail row; the frame-generation
dialog is gone.
2026-09-22 18:28:33 -04:00
The412Banner 39272cf0f2 front end: Setup folds like Steam and Desktop (open until the runtime is installed); the desktop page says 'Linux desktop environment'; the emulator help link moves above the grid it was hiding 2026-09-22 18:10:19 -04:00
The412Banner 1ba803b1d5 session: the guest gets the device's time zone (the client's clock and logs were UTC) 2026-09-22 18:05:27 -04:00
The412Banner dab34d1ba9 PROGRESS_LOG: 720p default, builds r3/r4 2026-09-22 17:57:37 -04:00
The412Banner fb2a3d4dd8 session: the desktop caps at 720p by default too 2026-09-22 17:53:43 -04:00
The412Banner d1ced8706f session: the Steam client's display caps at 720p by default (desktop stays 1080); a chosen cap still wins 2026-09-22 17:49:29 -04:00
The412Banner 5d8fadec65 PROGRESS_LOG: motion front end + run-as-a-game builds r1/r2 2026-09-22 17:45:05 -04:00
The412Banner 546c063b0c game_mode_config: the attribute is allowGameDownscaling 2026-09-22 17:40:43 -04:00
The412Banner 06e67cd7d5 session: run as a game — game category + game_mode_config, sustained performance mode, fastest display mode, ADPF hint session on the compositor thread, 16 KB-aligned libraries
The manifest now declares the app a game (appCategory, isGame) with a game_mode_config that
welcomes Performance mode and refuses the OS-side FPS cap and resolution downgrade — the
interventions that make a regular flagship's Big Picture crawl while a gaming phone's does not.
The session window asks for sustained performance mode and the panel's fastest mode at its size,
tells GameManager it is in gameplay, and opens a PerformanceHintManager session over the
compositor thread fed with each presented frame's interval against the panel's period. All
version-guarded (6/7/12/13); the session log carries one 'perf:' line saying what took.

The app's own libraries link with 16 KB-aligned LOAD segments (loads unchanged on 4 KB kernels).
Six prebuilt PulseAudio libraries under jniLibs are still 4 KB-only and need a rebuild.
2026-09-22 17:39:04 -04:00
The412Banner 7ddfb57610 front end: qualify the play badge's AnimatedVisibility (the Column scope stole the overload) 2026-09-22 17:30:03 -04:00
The412Banner 19514c32b8 front end: motion system — gliding rail selection, unfolding sub-lists, page cascades, lifting tiles, session rise
The rail's selection is one pill that springs between rows; sub-lists unfold with
their children staggering in. A page change sinks the old page out and cascades the
new one in row by row over a blurred wash of the selection's own art. Tiles lift,
ring and shine when the pad lands on them and pop a play badge; the launch button
sweeps a sheen on focus and squashes on press. The session activity rises over the
front end and sinks back on finish. Every duration follows the system animator
scale, so 'no animations' in developer options snaps everything.
2026-09-22 17:27:25 -04:00
The412Banner d343b6f859 PROGRESS_LOG: checkpoint after the front-end merge 2026-09-22 14:52:13 -04:00
The412Banner 36cde7d1af docs: the front end and the first emulator game proven (README ledger, PROGRESS_LOG) 2026-09-22 13:32:57 -04:00
The412Banner 703f73610f The game's arguments reach the run-mode session
The activity forwarded mode, program and the Steam extras to the service and dropped
EXTRA_PROGRAM_ARGS, so RPCS3 opened with no game. device.txt names run mode too.
2026-09-22 13:23:45 -04:00
The412Banner 496ab5787a The game's arguments reach the run-mode session
The activity forwarded mode, program and the Steam extras to the service and dropped
EXTRA_PROGRAM_ARGS, so RPCS3 opened with no game. device.txt names run mode too.
2026-09-22 13:22:47 -04:00
The412Banner 7645db94d1 Front end: emulator tiles are square 2026-09-22 12:41:37 -04:00
The412Banner 6462b9b4d6 Front end: PS3 games as they really are on disk, and RPCS3's installed games
The scan goes one folder deeper (a dump comes as a folder named for the game with the image
inside), treats a folder with PS3_GAME as a disc, drops the ".dec" suffix, and lists what RPCS3
has installed on its own HDD (dev_hdd0/game/<ID> with a PARAM.SFO title, ICON0 art and an EBOOT
to boot) - a PSN package installed through RPCS3 is not in the ROMs folder at all.
2026-09-22 12:20:17 -04:00
The412Banner 4836558658 Front end: focus outline for pad navigation, art 25% larger, each emulator's own icon
The emulators' icons are bundled (the runtime keeps them as Papirus SVGs the app cannot draw):
the projects' own from their repositories, PPSSPP's from the runtime, RetroArch's flat icon
from libretro's assets. ROM tiles carry their emulator's icon.
2026-09-22 12:05:05 -04:00
The412Banner 78a7629eaa Front end: game art at 40% of the first cut 2026-09-22 11:52:16 -04:00
The412Banner 8581adcc46 Front end, slice 1: a rail of Steam and its games, the desktop and its emulators and their games
FrontEndScreen replaces the main screen on this branch. Steam's installed games come from the
client's own appmanifests (both libraries, with the library-cache art) and launch straight
into a Steam session with steam://rungameid; the emulators list their games from the ROMs
folder (a system folder as a hint, by extension) and launch under gamescope with the game on
the command line (EXTRA_PROGRAM_ARGS). A session running in the background is the first thing
on the rail and tapping it goes back to it. Landscape: rail beside content; narrow: above.
Every dialog and setting from the main screen is reachable from the rail's lower list.
2026-09-22 11:30:47 -04:00
The412Banner d39fd02d04 An ending session takes its log folder with it; the session replacing it gets its own
Handing off from the desktop, the new session claimed the folder the desktop was still
finishing, and the desktop's collector then stopped the new session's app.log capture. The
folder is taken from the shared slot as the session stops and handed to its collector; the
next session's beginOrCurrent finds the slot empty and makes a new folder.
2026-09-22 11:24:05 -04:00
The412Banner 68b09c1ed1 The session's number is claimed when it is registered, not when its process starts
The replaced desktop's proot exits on SIGTERM within a tenth of a second - before the new
session's start thread had numbered itself - so its exit still matched the current number and
ended the new session (4 s on the ended card, then the main menu, with the client audible in
the background). The number is taken in onStartCommand now, ahead of any thread.
2026-09-22 11:22:31 -04:00
The412Banner 74b4c2ef09 A replaced session's exit no longer ends the one that replaced it
Hand-off from the desktop: the new session started, and a second later the old proot - killed
by its own teardown - reported its exit, which the service took as the current session ending
("The session ended 137"). Exits are matched to the session that started the process. The same
race took the new session's log capture and its folder (stopFor / release by folder), and a
finishing activity unhooked the replacement's end listener (compared by identity now).
2026-09-22 11:15:35 -04:00
The412Banner 593ef8fcaf A finishing activity no longer takes the next one's Surface; the library label is environment, not an argument
Hand-off from the desktop to a Steam session: the new activity attached its Surface, then the
old one's surfaceDestroyed detached it - the compositor presented nothing while gamescope sent
frames by the thousand (black screen, sound only). detach() now takes the Surface being destroyed
and ignores one that is not attached. BL_LIBRARY_LABEL was added to the guest list after the
script's mode and reached the Steam client as an argument; it is an environment variable now.
2026-09-22 11:01:58 -04:00
The412Banner b28e91128f The desktop uses the client's own game entries; a steam shim hands them to the app
The client already writes one menu entry per installed game (steam steam://rungameid/<id>, with
the game's icon); they were dead for want of a steam command, and r45 added a second entry per
game beside them. Now: steam on the desktop is a shim that hands off to bannerlator-steam-launch
(and is the client itself anywhere else), and bannerlator-desktop-games writes an entry only for
a game the client wrote none for.
2026-09-22 10:48:26 -04:00
The412Banner d0ca41d160 The client's games on the desktop, launching Steam's desktop UI under gamescope
bannerlator-desktop-games writes one menu entry per installed game (both libraries, the
client's own artwork) and links Steam Games / SD Games in the home folder. The entries, and the
menu's Steam / Big Picture ones, run bannerlator-steam-launch: the client cannot draw on the
desktop (labwc, no dma-buf), so it leaves a request in the session directory; the service
watches it (FileObserver), ends the desktop session and hands the activity a Steam session to
start - desktop UI (BL_STEAM_UI=desktop drops -gamepadui) with the game's rungameid URL.
2026-09-22 09:46:19 -04:00
The412Banner 1374091d1b Game storage is automatic: a card in the phone is a Steam library by itself
The choice belongs inside the client - the drive drop-down on Install, Settings > Storage - so
the app no longer needs a setting for the common case. Default = automatic (the first SD card
present); the cog keeps Internal only and a chosen folder.
2026-09-22 09:41:58 -04:00
The412Banner fa25451766 Game storage: a second Steam library on an SD card or a chosen folder
The runtime already knew how to register /mnt/bannerlator-sd with the client; the app never
bound anything there, so the client only ever saw internal storage. The Steam cog's Game storage
section offers every removable volume (through the app's own folder on it, the one place a card
lets a targetSdk-28 app write) and any folder from the File Manager, proven writable first. The
session binds the choice and names it (BL_LIBRARY_LABEL); bannerlator-steam-library registers it,
or forgets it when nothing is bound. The client does the rest: asks where to install, shows both
on Storage, moves games between them. device.txt records the choice.
2026-09-22 08:18:20 -04:00
The412Banner 2cbd015d80 Sysmem says it costs frames; a session that died in the ENOSYS storm says which switch answers it
Two field bundles: an S25 running with Turnip sysmem on (it turns tiled rendering off - a
corruption fix, not a speed setting, and the text did not say so), and a Fold 5 ending, again,
in dozens of 'Function not implemented' lines from proot's seccomp acceleration failing Steam's
xalia helper. The ended-session message now reads the log's tail off the main thread and, when
it finds that storch, names 'Run proot without seccomp' / 'Skip xalia' in Performance.
2026-09-22 06:41:13 -04:00