github Amiga500/Onion OnionPlus-v4.4.0-beta-20260910-f87e7781
OnionPlus V4.4.0-beta-20260910

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.json as 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/pidof could kill the game you just switched to and reload the boot screen over a good state.
  • Faster launches — playActivity start and service killall run in the background and are joined before the emulator starts. retroarch.cfg is no longer rewritten on every launch.
  • ThemeSwitcher — theme previews load on demand (5-slot LRU) instead of all at once.
  • Framebuffer — new fbmode helper for 752×560 devices (Mini V4 / Flip), with fbset fallback. 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_killall fallback when no PID was captured (10×500 ms waits).
  • Theme install: keep the existing NUMBER_OF_THEMES bound check.
  • keymon: system_state_update() inserted into the fork’s extended SELECT path (AXP / Flip).
  • All fbset fallbacks 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_process included).
  • Cross-compile of gameSwitcher, themeSwitcher, keymon, fbmode clean (one pre-existing strncpy warning in untouched state.h).
  • sh -n on runtime.sh and change_resolution.sh; lt.lang / en.lang valid JSON.

Not covered / needs hardware

  • #1940 mi_fb path on Mini V4 / Flip 752×560 (Mini+ is 640×480 — confirm no shear on cold boot / return from game).
  • #1946 launch 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.sh power cut; NEON under qemu-arm.

Commits vs 20260901 (fa5bb007)

Don't miss a new Onion release

NewReleases is sending notifications on new releases.