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>
pspautotests modules/idlist shows that sceKernelGetModuleIdList still
writes a partial entry at the end of the buffer (a size of 6 gives two
entries), which the previous commit had stopped. A NULL buffer or a
negative size returns ILLEGAL_ADDR without writing the count.
sysmem/kernel/heap shows sceKernelAllocHeapMemory returning null for
sizes near 4GB, rather than wrapping. The WithOption variant already
checked this. The plain one now does too.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- sysclib strchr/strrchr searched for the whole string, not the
character, so they returned 0 for any nonzero c.
- A thread ending with blocks from more than one TLS pool leaked every
other block, since the restarted loop's ++iter skipped an entry.
- FPL's nextBlock grew by up to numBlocks per allocation and eventually
overflowed into a negative block index. Old states with a negative one
now reset it rather than failing to load.
- sysclib strncpy bounded its copy by the source's valid size only, not
the destination's.
- sceKernelAllocHeapMemory wrapped for sizes near 4GB, and
sceKernelGetModuleIdList could write a partial entry past the buffer
size and dereferenced a missing module.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Action type IDs start at 0, and the first one registered is
ActionAfterMipsCall, but MipsCall::DoState used 0 to mean no action.
So every call made with __KernelCallAddress lost its action chain on
load: the thread's wait state was never restored when the call
returned, and chained actions never ran.
Version 2 of the section marks a missing action with -1.
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>
FFmpeg is now built from ext/ffmpeg as part of the CMake build, so the
submodule's build script the Dockerfile ran no longer exists.
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>
Lists the T() calls, settings page texts, config labels and choice lists whose
key isn't in en_US.ini. With --dynamic, it lists the lookups whose key is only
known at runtime instead, which it can't check.
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>
A "Show Keyboard" button in the menu bar brings up the soft keyboard and
keeps it up, typing into the debugger. On Android, NativeSurfaceView
acts as a text editor while it's forced, so showSoftInput actually works
for it, and passes typed text and key presses on to the native side.
Closing the keyboard with Back unticks the toggle.
The Misc menu can hide the button (which also turns the keyboard off)
and choose whether the keyboard comes back after switching apps.
Other platforms can provide an implementation through
ImDebugger_SetSoftKeyboardHook.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A thin floating strip on the right edge with Top, PgUp, Up, Down, PgDn
and End buttons, acting on the last debugger window the user touched
(its name is shown under the buttons). Regular ImGui windows are
scrolled directly. The CPU disassembly and the memory viewers get key
presses instead, and Top/End go to the start or end of RAM.
The strip can be collapsed to a single button, or turned off from the
Misc menu.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The menus are split into lambdas, so they can be shown either side by
side or as submenus of a single "Menu" dropdown. The compact layout is
used on narrow screens, or when chosen from the Misc menu (the default
on phones).
The bar also gets an adjustable left margin (to keep the first button
clear of rounded screen corners, on by default on phones), slightly
taller menu rows in the compact layout, and a Running/Stepping
indicator.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
AI translated. Languages without a reliable translation (mostly dr_ID, ku_SO,
km_KH, lo_LA, jv_ID, tg_PH) keep the English placeholder.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Found by scanning the source for lookups whose key isn't in en_US.ini. They get
the English string as a placeholder in every language for now.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
These were looked up in a different section from the one with the translation,
so they always showed in English (the savedata error messages, "Done!" after
moving the memstick, "Switch UMD", "Ask for network permission" and others).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Also adds the missing "Latency" key for the header of that name, and removes
the unused "Performance" key.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- Metal: Load the shader cache again in DeviceRestore, like Vulkan. DeviceLost
saves it and throws everything away, so the next save (the next app switch,
or quitting) overwrote it with only what had been drawn since.
- Software renderer: Bring the post-shader back after a device loss.
DestroyDeviceObjects asks for it with restorePostShader_, but
CreateDeviceObjects cleared the flag again before BeginFrame could act on
it. The hardware backends recover through renderResized_.
- Forget pointers into the old device's objects in DeviceLost, rather than
relying on BeginFrame to come before the next flush: Vulkan's last pipeline
and bound views, Metal's UBO allocations, the GLES last linked shader and
bound texture.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
0b1e1a9bb3 put the PopsMMIO entries inside the MeMMIO ones, leaving
unclosed tags, so Visual Studio couldn't load the filters. Also adds
the missing Util\KL4E.h.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The system info screen's "Copy summary" kept the draw context it was
created with, and the GPU driver test screen kept its pipelines and
sampler, using and finally releasing them into a deleted context after
Android lost the surface. Look up the draw context when clicked, and
release the test objects on device loss (they're recreated on draw).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Android replaces both when it loses the surface (a recreate, which
changing the display resolution does, or switching away), but the
settings screen and its views live on. The external display setting's
enabled check, which runs on every draw, then called into the deleted
DrawContext ("Pure virtual function called!"). The UI scale and
"Reload UI atlas" handlers had the same problem with the UIContext.
Look them up through the screen manager when needed instead.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
We don't support the headphone remote buttons, so we just leave
the buffer all zeroes. Previously we didn't write, which could cause
games to register a ghost "track forward" or the other buttons.
Should fix the DJ Max 2 OST track-forwarding problem in #7468.