Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Qt: Fix Big Picture Mode mnemonic shortcut lost after state change#14245

Merged
F0bes merged 1 commit into
PCSX2:masterfrom
Vishrut2403:fix/big-picture-mode-shortcut
May 3, 2026
Merged

Qt: Fix Big Picture Mode mnemonic shortcut lost after state change#14245
F0bes merged 1 commit into
PCSX2:masterfrom
Vishrut2403:fix/big-picture-mode-shortcut

Conversation

@Vishrut2403
Copy link
Copy Markdown
Contributor

Description of Changes

onFullscreenUIStateChange() was setting the action text to "Start Big Picture Mode" (without the & mnemonic) when exiting Big Picture mode, while the .ui file 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 the tr() call in onFullscreenUIStateChange(), 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

  1. Launch PCSX2
  2. Open System menu -> confirm M is underlined in "Start Big Picture Mode"
  3. Enter Big Picture mode
  4. Exit Big Picture mode
  5. Open System menu again -> M should still be underlined

Fixes #13584

Did you use AI to help find, test, or implement this issue or feature?

No

@F0bes F0bes merged commit 7de2aad into PCSX2:master May 3, 2026
14 checks passed
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]>,
@Mrlinkwii Mrlinkwii added this to the Release 2.8 milestone May 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG]: Big Picture mode only starts with the key combination once when the emulator is launched.

5 participants