Changelog
Unreleased
Added
- LOAD messages now carry the source
.binpath (2-byte little-endian UTF-8 length + path bytes, appended after the tag data). Cemu's listener opens that file and attaches it to the figure slot, so vehicle and character builds made in-game are written straight back into the app's library files and survive reloads. Toggling a figure in the app is now a real save, not a session-only placeholder.
Fixed
- Tag persistence through the app: game writes used to be memory-only on the Cemu side (the listener handed the figure a null file handle), which is why bins loaded via the app always reverted to blank templates. Now that the path is sent with the LOAD,
WriteBlock/Save()flush to the same.binthe app read from. - Toypad pad layout:
kSlotspad numbering is now the real toypad convention (pad 1 = CENTER, pad 2 = LEFT, pad 3 = RIGHT),kPadCellsfollows the true 3/1/3 geometry, andkPadNeighborsnavigation was rebuilt to match. Previously pads 1/2/3 were mislabeled and the touch layout didn't match the physical pad. - Controller input is now suppressed in Cemu for the whole time the overlay is visible. Ownership was previously gated on the overlay holding foreground focus, which could silently fail (Windows can refuse focus transfers from background processes), letting Cemu keep reading the pad while the picker was up.
- Assert/release the input-handoff event synchronously around show/hide instead of relying on the 16ms poll, closing the race where Cemu could read controller input right after the overlay appeared or just before it closed.
- Fixed the event-name mismatch between repos: the handoff now sets
Local\CemuToypadPickerInputActive, the exact name Cemu'sController.cppwaits on. LegoToypad was setting a differently-named event, so Cemu never neutralized input.
Notes
- The first controller button press that opens the overlay is still seen by Cemu; that race can only be closed with a short grace period on the Cemu side.