The icon-with-text drawing helpers and the large list dimensions move
with it, exported since DirButton uses them too.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed/unsigned comparisons, bool/int mixes and narrowing in our own code,
plus duplicate NOMINMAX defines. The UWP Common/Core/UI projects now define
_CRT_NO_POSIX_ERROR_CODES like the desktop ones, so SocketCompat.h no longer
redefines the errno macros there. ImMemView's byte search no longer strdup()s
the query (it leaked on the error path).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A PS1 disc can be a cue sheet, .ccd or .mds rather than an image, and
GetSizeUncompressedInBytes tried to open one as a block device. Measure the
disc the sheet describes instead, and count its image files in the size on
disk too, not just the sheet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The link is now just "Speed hacks", with a hint under it saying they can
cause rendering errors, and the page starts with a longer explanation.
Adds SettingsPage::Description() for text between the groups.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
It now collects the page's settings when its view is created, so it can be
put first. Moved it to the top of Speed Hacks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
SettingsPage::RestoreDefaults() adds a button that, after asking, puts the
config settings added to the page before it back to their defaults, running
the config's OnChanged reactions. Config::RestoreSettingToDefault() does the
work for a single setting, including those in blocks that reset as a whole.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On Android the render thread runs the UI, and surfaceDestroyed waits for
it, so slow storage (SAF especially) there stutters and can become an ANR.
- Store: only check whether the game is installed when an install or
uninstall finishes, not every frame.
- Savedata: read the modification time with SIZE on the GameInfo worker.
The popup asked for it every frame, and each button on first draw.
- FirmwareScreen: scan the NAND, and erase it, on a worker thread. It
rescanned on every RecreateViews, which is after every popup.
- GameScreen: look up the installed update, plugins and what the firmware
can play on a worker thread. They ran on every RecreateViews, which
happens as each piece of game info arrives.
- LaunchFile: wait only for the file type, and for PARAM.SFO just in the
cases that use it.
Also add --start-screen=firmware.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Some old homebrew, like Ozone and Trig Wars, ships an ELF named
EBOOT.PBP. Identify_File accepts it and it boots, but the browser
required a PARAM.SFO, so the Homebrew tab left it out entirely.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Leaving a game creates a new MainScreen, which picked the default tab
(Recent unless changed) whenever there were recent files. Remember the
tab for the rest of the session, so the default tab only applies to the
first main screen after startup.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Half the radius of a Choice. Covers notices, progress bars, the
leaderboard tracker and RetroAchievements popups (not the listed
achievements on the achievement screens).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RenderNotice and MeasureNotice take padding (added inside the background)
and the corners to round. The drop shadow moves out of RenderNotice to the
floating OSD notices, since views don't have one. Without layout params, a
NoticeView is FILL_PARENT wide like a Choice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drawing now takes the style and scale too, like measuring, so the text
drawers have no font state left. UIContext keeps its current style and
passes it, and fills it in from the theme if nothing has set one yet.
PPGe passes its one font.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The name lists (extensions, flags) become InfoItems, which have the
background a ChoiceGroup needs.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Links to other pages already had one. SettingItem::OpensScreen() gives the same to
choices (and custom items that are choices) that open a full screen, like control
mapping or the savedata manager. Ones that open popups don't get it.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Games in Android's scoped storage are opened through JNI, and getEnv()
asserts on a thread that isn't attached, so compression crashed on its
first file access.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GameManager translated install errors when storing them, and the install
screens then looked the translated text up again as a key. It now stores the
category and key, and translates when asked. The raw ISO install error gets
the existing "Installation failed" string.
Some other errors went around as strings that were then used as keys:
- A missing savestate file now has its own error code, ERROR_FILE_MISSING,
instead of a key in the failure reason.
- The PKG reader's reasons are technical English, so they're now shown
untranslated under the translated "This PKG file isn't a PSP game update".
- The netconf dialog looked up the channel number. Only "Auto" is translated
now, using the WLAN Channel setting's string.
- Adds the missing "Failed to read old directory" for memstick moves.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The MIPSTracer page's "log file" is the trace file, and some strings had odd
spacing, grammar or capitalization. The auto load savestate toast now uses the
setting's key instead of a duplicate one, and the English fallbacks in code
match en_US.ini.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A "Bar height" setting in the Misc menu, 166% by default on phones.
The item spacing in the bar grows along with it, so the menu titles can
be hit anywhere in the bar's height. The menus themselves keep the
normal style.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Instead of a hook and four Android_* functions declared in
ImDebugger.cpp, the debugger calls System_SetSoftKeyboardForced(), and
the platform reports a closed keyboard with
UIMessage::SOFT_KEYBOARD_HIDDEN.
"Keep keyboard after switching apps" is passed along with the request,
and the activity's onStop ends a keyboard that shouldn't persist, so the
native side no longer tracks app pauses.
The debugger is now also told when it's hidden. Frame() isn't called
then, so hiding it with the hotkey used to leave the keyboard up.
The keyboard button and its Misc menu options are only shown when
SYSPROP_KEYBOARD_IS_SOFT is set, which Android now reports too. iOS and
UWP on Xbox report it as well, but don't implement the request yet.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>