Qt: Fix Big Picture Mode mnemonic shortcut lost after state change#14245
Merged
Conversation
kamfretoz
approved these changes
Apr 26, 2026
SternXD
approved these changes
May 3, 2026
F0bes
approved these changes
May 3, 2026
Hancock33
added a commit
to Hancock33/batocera.piboy
that referenced
this pull request
May 4, 2026
----------------------------------------------------------------------------------- cemu.mk a8bd6f84f79e82ab9830c777376a38bd138660da # Version: Commits on May 04, 2026 ----------------------------------------------------------------------------------- coreinit: Implement OSDynLoad_IsModuleLoaded, ------------------------------------------------------------------------------------------ dolphin-emu.mk e22551eae1c84a7e4d0b6a5c519ef4ed4ef69df1 # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------------ Merge pull request #14641 from Dentomologist/replace_maybe_unused_annotations_with_commented_names Replace some [[maybe_unused]] annotations with commented names, ------------------------------------------------------------------------------------------ duckstation.mk e4c55ad0283ff26a76991a759d8db13d6969b9ec # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------------ Achievements: Don't display indicators when in pause menu, ---------------------------------------------------- pcsx2.mk v2.7.314 # Version: Commits on May 03, 2026 ---------------------------------------------------- - [Qt: Fix Big Picture Mode mnemonic shortcut lost after state change](PCSX2/pcsx2#14245) , ------------------------------------------------------------------------------------- ppsspp.mk 046ff112f0daa139a2a080b3e526a07ff4a3b6c0 # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------- Merge pull request #21631 from hrydgard/apply-libretro-fix libretro: Apply swapchain timing fix suggested in #21627, ------------------------------------------------------------------------------------ rpcs3.mk 773808169e94f2a980db6fa4983b4fcb2a83d16e # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------ Move multi-game ISO parsing code path to proper location, --------------------------------------------------------------------------------------- touchhle.mk 75433482c27b91c5bd782930ee639b4b16c2df41 # Version: Commits on May 02, 2026 --------------------------------------------------------------------------------------- Implement truncate() Change-Id: I9b7606bf5c048b3f05b47e6c38e813376a8a8cb3, ------------------------------------------------------------------------------------------- moonlight-qt.mk 8cc3b3064211dfd91d1f9bfdbe6aeed97b1a9db8 # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------------- Update Windows, macOS, and AppImage dependencies, --------------------------------------------------------------- ruffle.mk nightly-2026-05-04 # Version: Commits on May 04, 2026 --------------------------------------------------------------- ## What's Changed * ci: Improve release script local testing experience by @kjarosh in ruffle-rs/ruffle#23611 * chore: Bump WebdriverIO to 9.27.1 in web/ by @torokati44 in ruffle-rs/ruffle#23612 * chore: Bump copy-webpack-plugin to 14 in web/ by @torokati44 in ruffle-rs/ruffle#23614 **Full Changelog**: ruffle-rs/ruffle@nightly-2026-05-03...nightly-2026-05-04, --------------------------------------------------------------------------------------- thextech.mk 5e155cafb5033c4c552879ec540221c3e4a0d2da # Version: Commits on May 03, 2026 --------------------------------------------------------------------------------------- Declare the policy regarding AI contributions We don't want any AI being used for the code generation at all. [ci skip], ---------------------------------------------------------------------------------------------------- gamenetworkingsockets.mk 380c380f829e99c476690726d2f22473ed7bcb25 # Version: Commits on May 04, 2026 ---------------------------------------------------------------------------------------------------- Increase lock warnings under tsan even more, ---------------------------------------------------------------------------------------- retroarch.mk 4a82976afb6d0672d628d24562d54c01339b7bcb # Version: Commits on May 03, 2026 ---------------------------------------------------------------------------------------- Scanline Sync improvements, -------------------------------------------------------------------------------------- vkquake.mk 5c1cf5ce6ebb502255fdc9f05e439876953bb8cb # Version: Commits on May 04, 2026 -------------------------------------------------------------------------------------- Fix standard alpha blend state after OIT pipeline setup, -------------------------------------------------------------------------------------- yquake2.mk b1d145511d90b3fda2761e4ec97b8257a24ffa33 # Version: Commits on May 03, 2026 -------------------------------------------------------------------------------------- game: random fixes Spawn on start command is extended to support scale. Check possible fixes for #130 in mgu5m3 with monster_supertank at 144.000 -2650.000 136.031, ---------------------------------------------------------------------------------------------- libretro-fceumm.mk 7939d92b3e930850538ea059159c2d5145c255ca # Version: Commits on May 04, 2026 ---------------------------------------------------------------------------------------------- core: ROM loader hardening - reject malformed iNES/UNIF/FDS inputs Pass 9 audit of the iNES, UNIF, and FDS loaders against malformed ROM input under AddressSanitizer + UndefinedBehaviorSanitizer. The ROM file is the entry point for untrusted input, so any out-of-bounds read, write, integer overflow, or DoS in the parsers is a real attack surface for anyone who downloads ROMs from third-party sites. Two pre-existing crash inputs caught by ASAN ============================================ test_zero_prg.nes : iNES 2.0 header that decodes to PRGRomSize == 0. Master loads it: uppow2(0) = 0, FCEU_malloc(0) returns an implementation-defined small/null buffer, and the first PRG fetch from the reset vector reads past the heap. => heap-buffer-overflow at cart.c:138 CartBR test_mapr_huge_unif.unf : UNIF MAPR chunk with declared size 0xFFFFFFFF. Master computes FCEU_malloc(uchead.info + 1) which overflows uint32_t to FCEU_malloc(0); the subsequent fread of 4 GiB then heap-corrupts and boardname[uchead.info] = 0 finally segfaults. => SEGV at unif.c:345 SetBoardName Plus a UNIF CTRL DoS: a CTRL chunk declaring 4 GiB drives the diagnostic dump loop through 4 billion FCEU_fgetc() calls (and the loop didn't even break on EOF), printf'ing each byte to the log. Pass 9 fuzz inputs reject every one of those cleanly. Bit-exact identical audio + video output to upstream master across nine valid test ROMs (silent, idle, active gameplay, 5-channel max-volume stress, and the per-APU-channel test ROMs). Changes ======= src/ines.c (iNESLoad): * Reject PRGRomSize <= 0. The legacy iNES path already substitutes ROM_size = 256 when the byte is zero, but the iNES 2.0 exponent encoding can still resolve to zero from a malformed header. * Cast PRGRomSize + CHRRomSize to uint64_t before adding. Both fields are int with a 0x40000000 cap from iNES_read_header_info, so the addition can reach 0x80000000 - signed overflow (UB) that wraps negative and then sign-extends bogusly into the uint64_t romSize used for size sanity prints. * Check the FCEU_fread return value on every read (trainer, PRG, CHR, MiscROM) and warn on truncation. The buffers are pre-filled with 0xFF (open bus) or zero, so a short read leaves a sane tail, but the user got no warning that the file was incomplete. src/unif.c: * FixRomSize: change return type from int to uint32_t. The 0x80000000 cap was being implicitly converted from signed int (where it is INT_MIN) to the uint64_t UNIF_PRGROMSize/CHRROMSize callers, sign- extending to 0xFFFFFFFF80000000 - a 16 EiB malloc request. * SetBoardName: cap uchead.info at 256 (in addition to the existing < 4 reject). Real UNIF board-name strings are < 32 characters. Without the upper bound, uchead.info near 0xFFFFFFFF makes (uchead.info + 1) wrap to zero and FCEU_malloc returns a tiny buffer that the subsequent 4 GiB fread heap-overflows. Also check the fread return. * DoMirroring / CTRL: cap the diagnostic dump-and-skip path at 16 bytes and FCEU_fseek past the remainder. Without the cap, a chunk declaring info ~ 0xFFFFFFFF would spin 4 billion FCEU_fgetc/printf iterations - CPU-bound DoS. The CTRL branch also lacked an EOF break, so a truncated stream would keep returning -1 forever. src/fds.c (SubLoad): * Zero-initialise the stack header[16] so partial reads see deterministic zeros rather than stack garbage. The fsize >= 16 guard reduces the chance of a short read but doesn't eliminate it (mid-stream IO error etc). * Check the FCEU_fread return on the header read and on each 65500-byte side read; warn on truncation. Verification ============ ASAN/UBSAN sweep across 18 fuzz inputs: * Every case that crashed master now LOAD_REJECTED on pass 9. * No new UBSAN/ASAN findings introduced (the pre-existing ppu.c:85 left-shift UB shows up identically on both sides). Bit-exact audio dump regression vs master across 9 valid ROMs at 600 frames each: identical output. No behavioral change for legitimate input., ------------------------------------------------------------------------------------------------- libretro-geargrafx.mk fa79f484320af0b3d13c2841cec769bbb748a72e # Version: Commits on May 03, 2026 ------------------------------------------------------------------------------------------------- Fix display buffer sizing and clearing, -------------------------------------------------------------------------------------------------- libretro-gearsystem.mk 822287417a2d11c458e5f3b04549ecc9034c0c6e # Version: Commits on May 03, 2026 -------------------------------------------------------------------------------------------------- Fix display buffer sizing and clearing, ---------------------------------------------------------------------------------------------- libretro-ppsspp.mk 046ff112f0daa139a2a080b3e526a07ff4a3b6c0 # Version: Commits on May 04, 2026 ---------------------------------------------------------------------------------------------- Merge pull request #21631 from hrydgard/apply-libretro-fix libretro: Apply swapchain timing fix suggested in #21627, ---------------------------------------------------------------------------------------------- libretro-prboom.mk 668094b484922d91a53082b7495242360bf9ccda # Version: Commits on May 04, 2026 ---------------------------------------------------------------------------------------------- video: direct render into the frontend's software framebuffer Eliminate the per-frame memcpy from screen_buf to the frontend buffer. At I_StartDisplay, query GET_CURRENT_SOFTWARE_FRAMEBUFFER and bind screens[0].data plus the renderer's cached top-left pointers (drawvars.short_topleft / int_topleft, latched at R_InitBuffer time) to the returned buffer. The column drawers, span drawers, V_FillRect, V_CopyRect, and the wipe blender all write directly into the frontend buffer through screens[0].data, and I_FinishUpdate just hands the same pointer to video_cb. No copies on the hot path. The previous code already queried the SW FB API in I_FinishUpdate, but then memcpy'd screen_buf into the returned buffer, which is exactly the bandwidth cost the API exists to avoid (\the goal of this call is to allow zero-copy behavior\ -- libretro.h:974). Move the query to I_StartDisplay so the renderer can write into the acquired buffer directly. Acquisition is gated on three conditions matching the libretro.h contract: - in_retro_run: retro_load_game runs D_DoomLoop a few times during init before the frontend's video pipeline is fully up, and querying then can deref a half-set-up frontend. - format == RETRO_PIXEL_FORMAT_RGB565: the frontend is allowed to return a different format than SET_PIXEL_FORMAT negotiated, e.g. when running behind a HW backend that needs an internal conversion stage. We can only direct-render when the formats agree. - pitch == SCREENPITCH: the renderer treats SURFACE_SHORT_PITCH (= SCREENWIDTH) as a global constant; threading a per-frame stride through every drawer is out of scope. When any of these fails, direct_fb_data stays NULL and the fallback path runs: renderer writes to screen_buf, I_FinishUpdate hands screen_buf to video_cb, and the frontend handles copy/conversion internally. Same behaviour as before this change. I_FinishUpdate restores screens[0].data and drawvars to screen_buf after handing the SW FB pointer to video_cb. Per libretro.h the SW FB pointer is invalid once retro_run returns, so any code that touches screens[0] outside retro_run (savestate hooks, idle paths) must see a stable buffer. The restore is three pointer assignments per frame. f_wipe.c: wipe_doMelt repaints each column from scratch each tick (boundary = max(0, y_lookup[i]); end-screen above, start-screen below) instead of writing only the new dy rows of end-screen and trusting prior ticks' writes to still be there. Under direct render screens[0].data (= wipe_scr.data) rotates per frame, so prior writes are not on the current frame's buffer. wipe_ScreenWipe already re-binds wipe_scr.data = screens[0].data on every entry; this completes the picture., --------------------------------------------------------------------------------------------------- libretro-snes9x-next.mk 7fb5b58d526f041d0cc4246d71159de525f03986 # Version: Commits on May 03, 2026 --------------------------------------------------------------------------------------------------- Mode 7 hires: 4x horizontal mode, bilinear stable/smooth modes, BL at 1x Extends the Mode 7 hires renderer along two orthogonal axes. Hires factor: was a bool (off/on, on=2x), now a tristate (off/2x/4x). The new 4x mode samples the Mode 7 matrix four times per native pixel and writes to a 1024-wide buffer, with sprites/HUD/non-Mode-7 BGs quadrupled via a new Normal4x1 third-level pixel plotter. Buffer allocation grows once at retro_load_game time to fit max(NTSC_OUT_WIDTH, 1024); frames at lower tiers write only the leftmost columns. Bilinear filter: was a bool (off/on, \on\ was the original 4-corner bilinear), now a tristate (off/stable/smooth) and is now independent of the hires factor: - Stable: X-axis linear blend on the floor-Y texel row only. Mirrors HD-no-BL's Y sampling exactly. Inherits its seam-free behaviour on hostile content -- Tiny Toons rainbow rings, palette-rotation effects, anything with abrupt vertical texel changes. New default. - Smooth: full 4-corner bilinear with both-axis interpolation. More aggressive smoothing on perspective gradients, but can produce a one-scanline seam where adjacent texel rows contain dissimilar palette entries. The original \on\ behaviour, kept available for users who prefer the extra smoothness. The two filter modes share one renderer body and switch on a runtime flag inside M7HR_BLEND_AND_WRITE; the branch is constant across a frame so the predictor handles it cleanly. Stable/smooth applies identically at 1x, 2x, and 4x. A new BL1X path lets bilinear filtering run at native (1x) width when hires is off -- previously bilinear was only available with hires=2x. Useful as \smoother native Mode 7\ without committing to a wider buffer. Symbol table: six new NAME1 families (DrawMode7BG{1,2}{HR4X,BL4X,BL1X}) and one new NAME2 expansion (Normal4x1). Each NAME1 expands to seven math variants for 42 new entry points. The Normal4x1 base renderer generates the full set of Tile/ClippedTile/MosaicPixel/Backdrop families needed for non-Mode-7 layers at 4x width. Buffer width plumbing: IPPU.QuadWidthPixels is added alongside the existing IPPU.DoubleWidthPixels. QuadWidth implies DoubleWidth -- code that just wants \wider than native\ can keep checking DoubleWidth alone. Frame-start promotion (cpuexec.c) and mid-frame promotion (ppu.c::S9xUpdateScreen) both handle 1x->4x. The 2x->4x transition (frame starts in mode 5/6 then switches to Mode 7 with Hires=4) is not handled mid-frame and stays at 2x for that frame; this is exceedingly rare in real ROMs. Backwards compatibility: old config values \enabled\ still parse -- \enabled\ maps to 2x for hires and stable for bilinear, matching the prior \on\ behaviour as closely as possible (modulo the horizontal-only blend fix from daf6287, which is now stable mode). Settings type changes: Settings.Mode7Hires bool8 -> int32 (0/2/4) Settings.Mode7HiresBilinear bool8 -> int32 (0/1/2) Truthy tests still work; nothing else was reading these as bool. Core options: snes9x_2010_mode7_hires { disabled, 2x, 4x } def disabled snes9x_2010_mode7_hires_bilinear { disabled, stable, smooth} def stable The bilinear option's visibility-callback (which hid it when hires was off) is removed -- bilinear now applies independently and is always shown. Invariants verified: - Audio bit-identical with all options off (no SDSP path changes). - Save state format unchanged (settings are core options, not state). - Mode7Repeat clip/fill modes preserved across all new paths. - Index-0 transparency preserved via the per-corner op_mask. - EXTBG per-pixel priority bit preserved (raw TL byte exposed as 'b' so Z1/Z2 expansions can reference 'b & 0x80'). - Color math goes through MATH() in all blend paths. Known limitations: - NTSC filter and Hires=4 are mutually exclusive (NTSC has hard-coded 256/512 input paths). Picking one disables the other; the user typically wants one or the other anyway. - Mosaic Mode 7 at 4x falls through to 2x mosaic, leaving every other column unfilled where mosaic is active. Mosaic by definition suppresses sub-pixel detail, so this is cosmetic. - Sprite/HUD pixels at 4x are pixel-quadrupled (correct -- the SNES runs sprites at native 256-px resolution); visually they read as chunky relative to the smooth Mode 7 background. Files: 742+/170-, +572 net across 7 files., ---------------------------------------------------------------------------------------------- libretro-stella.mk 7089bb895855b97a2d5f074aaf29c4940d272bf1 # Version: Commits on May 04, 2026 ---------------------------------------------------------------------------------------------- Convert ostringstream to std::format, fix typos, whitespace issues, commenting, etc., ------------------------------------------------------------------------------------------------ libretro-tyrquake.mk 0920dec3082d2eecd90147e2d525052d146b5f58 # Version: Commits on May 04, 2026 ------------------------------------------------------------------------------------------------ Drop dangling extern cvar_t declarations Commit d0b9a8f (\host: drop dead cvars\) removed the definitions and Cvar_RegisterVariable calls for 10 unused cvars but left four extern declarations behind in the headers: client.h: m_forward, m_side r_local.h: r_speeds, r_graphheight Nothing in the codebase references these names, so the linker stayed silent and the codebase has been compiling fine -- but the headers are advertising symbols that have no definition. Drop the four extern decls., --------------------------------------------------------------------------------------------- libretro-vba-m.mk 5b09f0a856f1ecb5463701f465cbe4167ccc0491 # Version: Commits on May 03, 2026 --------------------------------------------------------------------------------------------- build: fix enabling Vulkan in macOS builder Add include paths to `PROJECT_ARGS` in the macOS builder so that `try_compile()` can detect the Vulkan headers and enable Vulkan support. Signed-off-by: Rafael Kitover <[email protected]>,
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description of Changes
onFullscreenUIStateChange()was setting the action text to"Start Big Picture Mode"(without the&mnemonic) when exiting Big Picture mode, while the.uifile correctly defines it as"Start Big Picture &Mode". This caused the keyboard shortcut to stop working after exiting Big Picture mode.Rationale behind Changes
The Qt mnemonic ampersand (
&) was missing from thetr()call inonFullscreenUIStateChange(), causing the underlined shortcut letter to disappear from the System menu after exiting Big Picture mode. The fix reuses strings that already exist in all translation files, so no translation updates are needed.Suggested Testing Steps
Fixes #13584
Did you use AI to help find, test, or implement this issue or feature?
No