Commit Graph
24706 Commits
Author SHA1 Message Date
J1coding 06bb419db9 iOS: shorten the longest comment blocks in the hack code
Tightens the new comments this branch added and the longest blocks it
sits next to, so every file it touches lands at or under the comment
density it started with.

Two of the trimmed blocks described what the code no longer does, which
is the kind of comment that goes stale without anyone noticing.
iOSv2.5.2
2026-08-06 17:10:11 +02:00
J1coding f7ca80075f iOS: assert the hack claim plumbing in tests
Three source assertions in the style of the descriptor tests: every
hack the bridge reports pins from its global row, every reported hack
is in the per game claim derivation table, and the writer never grows
a global claim merge again.
2026-08-06 17:10:11 +02:00
J1coding 7e6c5dd81e iOS: pin the remaining hacks the database can override
Texture Inside RT, Native Scaling and Bilinear Upscale go through the
claiming binding, the three bool hacks with pin bits claim on write,
and the bridge's hack table grows their entries so the notes and the
unpin button work for them too.

These had pin support in the core since the claim mask landed, but no
frontend ever set their bits, so the database kept overwriting them
the same way it overwrote align sprite.
2026-08-06 17:10:11 +02:00
J1coding 9fd49d3356 iOS: reset a hack's value when unpinning it
Use the game database value now writes the hack's default back through
the store property before dropping the pin, so the row keeps showing
what the INI actually asks for.

Unpinning alone left the old value in the INI while the core masked it
out and the database re decided, which read as a toggle that says on
and does nothing.
2026-08-06 17:10:11 +02:00
J1coding d30c4d61d4 iOS: let pinned hack rows work without manual mode
Half pixel offset, round sprite, the three sprite pickers and both
texture offsets now only need the per game master toggle, since a per
game value claims its own fix and the database steps aside for it.
Skipdraw keeps the manual hacks gate, and the captions now say only
skipdraw needs it.

The old gate is the closed loop from the report: rows went grey while
still showing on, the save kept writing them, and there was no way to
turn the hack off without flipping the whole panel off.
2026-08-06 17:10:11 +02:00
J1coding a7f6ca2395 iOS: make the per game sprite hacks tri state pickers
Align Sprite, Merge Sprite and Wild Arms Offset drop their override
plus value toggle pairs for the same Use Global, Off, On picker every
neighbouring row uses. The bridge takes one int with the use global
sentinel per hack, and the generic per game helpers keep the claim
mask in step whenever they touch a pinned hack key, which also covers
Texture Inside RT from the compatibility tab.

Two toggles per hack left an on state visible and stuck whenever the
rows were disabled, which is the shape of the report that keeps coming
back. One picker always names its state, and Use Global is always one
tap away.
2026-08-06 17:10:11 +02:00
J1coding 81a9e59b87 iOS: refresh the hack note after a per game save
Both per game reload paths now recapture the effective hack state after
the settings apply, the same call the global apply already makes.

Without it the graphics screen's hack notes kept describing the world
before the save, so even a change that worked read as stuck.
2026-08-06 17:10:11 +02:00
J1coding 54fe4ad3fe iOS: write only the game's own hack claims to its file
The per game writer derives the claim mask from the hack keys actually
present in the file instead of enumerating them, and stops folding the
global mask in, since the core now carries that across the layers. A
file whose stored mask disagrees with its keys is repaired when the
panel reads it, the same way the stale MTVU key already is.

Freezing the global claims into every game file meant a later global
unpin never reached those games, so the database fixes they should have
gone back to stayed suppressed for good.
2026-08-06 17:10:11 +02:00
J1coding 79a12a4194 GS: fold base hack claims back in under a game file
LoadCoreSettings ORs the base layer's UserHackOverrides into the mask it
just loaded, before the masks run.

The game settings layer replaces that key rather than merging into it,
so a game with its own file silently dropped every claim the player had
made globally, and the database took those hacks straight back. The
frontend used to compensate by freezing the global mask into each game
file at save time, which is how stale claims ended up pinned there
forever.
2026-08-06 17:10:11 +02:00
J1coding d0761f7285 iOS: give the menu reveal tap a surface that works on iOS 27
The reveal tap moves onto a clear SwiftUI shape overlaid on the game
view, and the dynamic input zones report their classified taps through
a notification the game screen listens for.

The old gesture sat on the Metal render view, which iOS 27 makes non
interactive so the SwiftUI overlays own touch. On that OS the tap
could never fire, and once the controller poll was gone there was no
path left to bring a hidden menu button back. The zones matter for the
same reason: with dynamic thumbsticks or swipe camera on they tile the
whole landscape screen and eat every tap before it reaches anything
below.
2026-08-06 12:43:48 +02:00
J1coding 2697dfb97d iOS: move the per game renderer picker to the graphics tab
The picker sits at the top of the Graphics section now, above Internal
Resolution, where the global screen keeps its own renderer section.
Fixes and Compatibility starts at Accurate Alpha Test, and its footer
drops the clause about the renderer needing a reset.

Testers kept looking for it under Graphics, which is where every other
renderer adjacent setting already lives.
2026-08-06 11:52:40 +02:00
J1coding 77c91fb8c5 iOS: save the per game renderer through the shared write path
The renderer write goes through the same useCurrent helpers as every
other per game key, and CheckForConfigChanges keeps a running game on
the renderer it booted with, iOS only.

Mid game the old forISO write resolved identity through a cache only
lookup that can silently miss, and even a hit can land the key in a
different file than the panel reads back and the boot path loads, so
the selection quietly vanished. The file only bypass never dodged the
live apply either: sibling writes in the same save trigger the same
debounced reload, and a renderer change in that reload would reopen GS
and tear the Metal device down under the running game.
2026-08-06 11:52:40 +02:00
J1coding 2559745f9c iOS: keep the hidden menu button hidden until a tap asks for it
Hide Menu Button is a real preference now. A tap on the game view shows
the button for four seconds and it fades back out, the controller input
poll is gone, and nothing writes the setting off behind your back. The
quick menu hint and the settings screen caption describe the new
behaviour, and the orphaned status message leaves the translation
tables.

Any controller input restored the button through a tenth of a second
poll, and any stray touch outside the pad brought it back too, each
time flipping the persisted setting off with it. The poll also never
bought a controller player anything: restoring the button still took a
screen tap to actually open the menu.
2026-08-06 11:43:03 +02:00
J1coding 1d5b367ecb iOS: match the root view to the window before the first frame
Move the orientation snap into syncRootViewToWindow and call it before
makeKeyAndVisible, after the SwiftUI menu is attached, and on
sceneWillEnterForeground as well as sceneDidBecomeActive. Compare the
two sizes rather than their orientation class.

A host container connects the scene while the app is still backgrounded,
where UIKit has no interface orientation to resolve, so the window takes
the real landscape bounds while its root view controller starts portrait.
Correcting that only once the scene was active left the menu squeezed
into a portrait strip for everything drawn before it.
2026-08-05 23:41:33 +02:00
J1coding 4eaf4e2dd5 iOS: load each icon preview once and simplify the picker
Cache the preview images instead of reopening every PNG on each pass of
the Form. Size and clip the thumbnail in one place so a non-square
preview cannot spill over the row. Drop AppIconManager for the async
setAlternateIconName the SDK already exposes, fold the failure alert
onto the option it belongs to, drop a section header that repeated the
navigation title, and add the inline title the other settings screens
use.
2026-08-05 22:31:16 +02:00
J1coding 74992820b5 iOS: give the app icon picker its own settings pane
Add an App Icon row to the Interface section, below Appearance, and a
matching SettingsPane case wired to AppIconSettingsView.

The picker used to open from a link at the top of Appearance. Rewriting
that screen dropped the link, and nothing else pointed at the view, so
it has been unreachable since. A pane cannot go the same way: the
detail switch is exhaustive, so leaving one out fails the build.
2026-08-05 22:31:16 +02:00
J1coding 1169f4f91a iOS: pin the interface to dark instead of following the system
Sets UIUserInterfaceStyle to Dark in the Info.plist template, so the app comes
up dark whatever the device is set to. One key covers the launch screen, the
window SDL creates, every UIKit alert and picker, and the SwiftUI tree, so no
view has to opt in.

The library, the BIOS list and every settings screen followed the system, while
the pause menu, per game settings and the gameplay surface were already dark
from their own palette. On a light device the two halves did not match, and the
save states and speed sheets came up white over a running game.
2026-08-05 18:44:49 +02:00
J1coding 95e13aa60a iOS: shorten the longest comment blocks in the settings code
Cuts the fifteen line block on Setting, the eight line one on NumberSetting and
the seven line one in NumberRow's accessory column down to the two or three
lines each of them needed. No code changes.
2026-08-05 17:10:21 +02:00
J1coding 324056d2c1 iOS: stop the keyboard and rotation breaking the per-game panel
The overlay container publishes how much of the card the keyboard covers
instead of insetting the hosted content itself, and the per-game panel
applies that inset inside its own reader, below the point where it picks one
column or two. The container's two card arms become one. The per-game overlay
no longer carries an id on orientation. The panel's rail and its form share a
single property for which section is open, with the form driving it through a
navigation path. The game screen and emulation only mode take orientation and
the portrait viewport split from the window rather than the safe region, and
the fullscreen sync that rode along on the size preference gets its own
trigger.

An inset applied from outside shrank the box the panel measured itself in, and
the panel picks its layout from that box, so a keyboard flipped it to the
landscape rail: wrong layout, navigation back at General, content clipped, and
a gap where its background stopped short of the card. The id and the two arms
each rebuilt the panel on a flip and took any unsaved edits with them.
2026-08-05 17:10:21 +02:00
jpolo1224 dd5b6616eb Merge remote-tracking branch 'origin/master' into jit-android-catchup-gv7 2.6.6.4 2026-08-05 01:39:50 -04:00
jpolo1224 785e4f5343 Android: let the resolved config decide fast boot; park the extra button above the D-pad
runVMThread forced boot_params.fast_boot from a raw base-layer read whose fallback
was FALSE, while Settings.kt's enableFastBoot and VMManager::SetDefaultSettings both
default it TRUE. Whenever the key was not yet in settings.ini -- notably right after
an update, before the Kotlin settings have been pushed down -- the app showed
"Skip BIOS: on" and full-booted into the BIOS browser anyway; toggling the switch
off and on wrote the key and appeared to fix it. Reading only the base layer also
discarded any per-game Skip BIOS override.

Leave fast_boot unset instead. VMManager::Initialize already falls back to
EmuConfig.EnableFastBoot, which it reads late and deliberately so a game can
override it, and ApplySettings has run by then. Log the resolved value.

The extra analog button defaulted above the left stick; above the D-pad is where it
is actually wanted, in the gap between the shoulder column and the D-pad. Portrait
cannot mirror that -- the stick sits directly above the D-pad there and the whole
left column is taken -- so it parks just clear of the D-pad's right edge.
2026-08-05 01:20:19 -04:00
jpolo1224 014676f3d5 Android: ignore the AAB dual-core staging artifact
build-play-aab.sh stages the 16k core into src/main/jniLibs so AGP merges it
with the CMake-built 4k one. It is a build intermediate, but an interrupted
build leaves it behind, where AGP happily packages it into the next APK and
a blanket 'git add' commits 22MB of it as source.
2026-08-05 01:12:07 -04:00
jpolo1224 570ca35d77 Android: draw the RetroArch overlay only when a game is on screen
Window() is the one surface every frontend passes through -- the game library,
the pause menu and the in-game manager screens are all inside its Box -- so
drawing the overlay artwork there unconditionally painted the bezel over the
library itself. Gate it on the same RUNNING || PAUSED test the touch controls
use, and suppress it while the library is pulled up over a running game.
2026-08-05 01:08:53 -04:00
jpolo1224 c88b18eb74 Android: make the stick's extra button a real layout widget; autosave BIOS NVRAM
The extra analog button (sprint/jump) was a satellite of the left stick:
drawn inside StickWidget, positioned only by distance/angle sliders in Pad
settings. The touch layout editor never knew it existed, so it had no
selection box and could not be dragged -- which is what everyone means by
"adjustable". Promote it to TouchButtonId.ANALOG_EXTRA (Kind.ANALOGEXTRA)
with entries in both default layouts, so it drags and resizes like any
other control and splices into saved layouts. The stick keeps the glide
hit test -- a finger locked onto the stick is the only pointer that
reaches that handler after it leaves the stick -- but now tests the
button's OWN circle wherever the user dragged it, lifting the local
pointer into overlay space via OverlayDims (which now carries density).
Two gestures can hold the button at once, so holders are counted and the
keycode is emitted only on 0<->1 transitions. Distance/angle sliders drop
out; dragging replaces them.

BIOS NVRAM reached disk only on a clean VMManager::Shutdown, and the pause
JNI's flush sat in the Running branch, so backgrounding while already
paused skipped it. That is exactly how you leave a game that booted into
the BIOS browser -- and on a never-configured console the BIOS runs its
setup and then parks in the browser, wanting a power cycle before it will
boot the disc, as real hardware does. With the config never written, every
full boot was the first one: "Skip BIOS off opens the memory card manager
instead of the game", permanently. Flush on the paused branch too, and
autosave properly -- cdvdWriteNVM sets a dirty flag, cdvdVsync flushes it
once a second. The compare-before-write in cdvdSaveNVRAM keeps that cheap.

Log the boot shape (fast_boot, CDVD source, disc type, .nvm presence) once
per boot so the next report of this names which of the four it is.
2026-08-05 00:44:23 -04:00
jpolo1224 cdb7310a74 Merge branch 'pr539' into jit-android-catchup-gv7 2026-08-04 21:35:10 -04:00