Port of OnionUI/Onion PRs OnionUI#1936–OnionUI#1946 onto the OnionPlus tree (onionplus-compact).
Tip: f87e778
Previous public tip: fa5bb007 (V4.4.0-beta-20260901)
All original work in those eleven PRs is by @robcodedev. This release only ports them onto OnionPlus and adapts the few call sites where the fork already diverged (Flip / AXP keymon, AdvanceMENU, process_* / file_resolvePath).
Hardware check on Miyoo Mini+ (id 354, 640×480): GameSwitcher Add favorite / Remove favorite writes Roms/favourite.json and MainUI picks it up.
Highlights
- GameSwitcher favorites — popup action Add favorite / Remove favorite on the current game. Same
Roms/favourite.jsonas MainUI; write is temp-file + rename. - Safer game switching — GameSwitcher remembers the RetroArch PID that was running when the overlay opened and signals that PID only. Stops the race where
killall/pidofcould kill the game you just switched to and reload the boot screen over a good state. - Faster launches —
playActivity startand servicekillallrun in the background and are joined before the emulator starts.retroarch.cfgis no longer rewritten on every launch. - ThemeSwitcher — theme previews load on demand (5-slot LRU) instead of all at once.
- Framebuffer — new
fbmodehelper for 752×560 devices (Mini V4 / Flip), withfbsetfallback. Mini+ stays 640×480; behaviour there should match the previous build. - Lists persist on the card — ROM list scroll position (
romwinidx.json) lives on the SD, not only in/tmp. Theme icon reapply is tracked per device, not per card.
Upstream PRs (all @robcodedev)
| PR | Change |
|---|---|
| #1936 | keymon: refresh system state before handling SELECT (fixes intermittent SELECT→MENU on Mini V4 / Flip; no-regression on Mini+) |
| #1937 | lt.lang: missing comma — valid JSON again |
| #1938 | ThemeSwitcher: on-demand previews + archive stat cache |
| #1939 | GameSwitcher: favorites toggle; PID-targeted RetroArch kill; popup lifetime / save-state scan thread safety |
| #1940 | fbmode + cleaner framebuffer transitions and screen init |
| #1941 | Consume /tmp/.forceKillRetroarch atomically before each launch
|
| #1942 | Keep ROM list positions (romwinidx.json) on the SD card
|
| #1943 | Reapply theme icons per device, not per card |
| #1944 | Cap recents at 200 when toggling hidden games |
| #1945 | Do not repatch retroarch.cfg on every launch
|
| #1946 | Overlap launch prep (playActivity + killall, joined before handoff)
|
Ported in #217 (c7a1a7e, 587c35e, db9b3e8, merge f87e778).
Fork adaptations (not in upstream)
- GameSwitcher overlay: keep OnionPlus
process_killall_signal/process_killallfallback when no PID was captured (10×500 ms waits). - Theme install: keep the existing
NUMBER_OF_THEMESbound check. - keymon:
system_state_update()inserted into the fork’s extended SELECT path (AXP / Flip). - All
fbsetfallbacks from OnionUI#1940 kept.
Still from 20260901 (unchanged)
Findings A–G: empty-file test contract, Flip lid-already-closed suspend, AXP-then-hall detect, OTA beta without releases[0] fallback, brightness sysfs write-through, infoPanel scale cache key, theme TTF cleanup-before-free.
CI
- Host
make unit-test: 1,414 tests / ~71,400 assertions — ALL PASSED (test_gs_popmenu,test_lang,test_list,test_processincluded). - Cross-compile of
gameSwitcher,themeSwitcher,keymon,fbmodeclean (one pre-existingstrncpywarning in untouchedstate.h). sh -nonruntime.shandchange_resolution.sh;lt.lang/en.langvalid JSON.
Not covered / needs hardware
#1940mi_fbpath on Mini V4 / Flip 752×560 (Mini+ is 640×480 — confirm no shear on cold boot / return from game).#1946launch timing on device (play time must still record; Tweaks / file manager must not).- Flip lid / Hall sensor (no Flip on the test bench used for this note).
- OTA mid-
install.shpower cut; NEON under qemu-arm.
Commits vs 20260901 (fa5bb007)
c7a1a7e— port OnionUI#1936 OnionUI#1937 OnionUI#1941–OnionUI#1946 (runtime.sh, keymon,lt.lang)587c35e— port OnionUI#1938 OnionUI#1939 OnionUI#1940 (ThemeSwitcher, GameSwitcher,fbmode)db9b3e8— clang-formatf87e778— merge #217