- Add update channel combo box (Stable/Nightly) in General settings
- Store channel preference in QSettings
- Change compact layout breakpoint from 950px to 550px
- Improve layout switching logic to move screenshots group box
- Add translation support for update channel labels
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Force the updater dialog to be non-modal so users can continue using
the application while checking for or downloading updates. This improves
user experience by not blocking interaction with the main window.
The dialog is explicitly set to non-modal in the constructor, overriding
any setting from the UI file.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Add recursion guard (m_is_updating_theme) to prevent UpdateUITheme()
from entering an infinite loop when palette changes trigger recursive
theme updates. This eliminates the need for manual qt-config.ini edits
on Arch Linux systems.
The guard ensures that if UpdateUITheme() is already running, subsequent
calls will exit immediately, preventing stack overflow and application
freezing.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add responsive layout switching (compact/wide) based on window width
- Move UI positioning combo to UI file for better maintainability
- Convert layouts to QFormLayout for better organization
- Add resizeEvent handling for dynamic layout adjustments
- Reduce minimum window size from 1000x600 to 700x600
The configuration dialog now adapts to smaller window sizes by switching
to a single-column layout when the width is less than 950px, improving
usability on smaller screens.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Allows users to switch between vertical and horizontal navigation
layouts. Includes new UI positioning setting, dynamic layout switching,
and style animation event filter for improved UX.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Change GenericRequest() to create a new httplib::Client for each request
instead of reusing a single instance
- Remove shared client instance and mutex to avoid thread safety issues
- This is the safest approach in a multi-threaded environment and prevents
potential race conditions
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Fix RestoreDefaults() to properly iterate through hotkey groups and prevent
crashes with improved bounds checking
- Add explicit handling for empty key sequences in LoadHotkeys() to prevent
invalid QKeySequence objects
- Improve user feedback with success message when defaults are restored
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add Shutdown() method to ChatRoom to properly disconnect Qt signals
- Initialize room_network pointer to nullptr for safety
- Call Shutdown() in MultiplayerRoomOverlay::DisconnectFromRoom() to prevent
signal leaks when disconnecting from rooms
- Ensures proper cleanup of chat widget connections when overlay is hidden
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Replace socket option assertion failures with proper error returns
- Add WSAENOPROTOOPT/ENOPROTOOPT error handling
- Fix LINGER and option value size validation
- Add Network::Errno::OTHER translation
- Implement basic Nex service stub for error code 2306-0520
Fixes crashes in Minecraft and other games when encountering unsupported
socket operations or attempting to use Nintendo's online services.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Enable mouse wheel scrolling throughout scroll areas instead of
requiring hover over scrollbars. Add event filter to forward wheel
events to scrollbars. Fix Input tab scrolling by only consuming
wheel events in ConfigureInputPlayer when actively mapping inputs.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Implement first-run setup wizard for PC with DuckStation-style UI.
Includes installation type selection, keys/firmware installation,
game directory configuration, and platform-aware path detection
for Windows, Linux, and macOS.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
The TitleID check was broken due to using || operator which evaluated
to 1 instead of a title ID value, preventing the recovery mechanism
from working.
- Fix title_ids.h: Replace incorrect || expression with proper
LittleNightmares3Base constant (0x010066101A55A000)
- Update physical_core.cpp: Use GetBaseTitleID() to match both
base and update title ID variants
This now correctly identifies Little Nightmares 3 and enables the
recovery mechanism that sets PC to LR when detecting null pointer
execution loops.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Explicitly cast modification_time to qint64 to resolve Linux build
error where std::int64_t conversion to QJsonValue is ambiguous.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
The PC < 0x1000 recovery mechanism introduced in commit fbb4f5c0
was causing issues for other games. This change restricts the recovery
to only apply when the title ID matches Little Nightmares 3.
- Add LittleNightmares3 title ID constant to title_ids.h
- Check program ID before applying PC return recovery in physical_core.cpp
- Recovery now only triggers for Little Nightmares 3 (010066101A55A800)
to avoid affecting other games
Fixes issues caused by the general PC return recovery in other titles.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Add a toolbar to the game list with:
- List/Grid view toggle buttons with icons and rounded corners
- Icon size slider for adjusting game icon sizes in real-time
- A-Z sort button that toggles between ascending/descending order
- Rounded corners styling throughout for a modern appearance
Key improvements:
- Fix games vanishing when adjusting slider during filtered search by
updating icons in-place instead of recreating the model
- Preserve scroll position and selection when updating icon sizes
- Reuse filtered model instead of deleting/recreating to prevent view flicker
- Ensure consistent rounded icon rendering at exact target sizes
- Sync sort button state with Name column header sort order
- Preserve active filters when repopulating the game list
The toolbar uses themed icons with Qt standard icon fallbacks for
cross-platform compatibility.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Implement a comprehensive caching system for game title metadata to
significantly improve game list loading performance for large libraries.
- Add CachedGameMetadata structure to store program ID, file type,
size, title, icon, and modification time
- Implement LoadGameMetadataCache() and SaveGameMetadataCache() to
persist cache to disk as JSON
- Integrate cache into ScanFileSystem() to skip expensive ReadIcon()
and ReadTitle() operations when cached data is available
- Add automatic cache invalidation based on file modification time
- Cache respects existing UISettings::values.cache_game_list setting
The cache is stored in the game_list directory and automatically
invalidates entries when files are modified, ensuring data accuracy
while providing substantial performance improvements for subsequent
library scans.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Major networking enhancements to improve multiplayer performance and
reduce desync issues in games like Mario Kart 8 Deluxe:
Network Performance:
- Add socket connection pooling in BSD service to reduce overhead
- Implement unreliable packet delivery for latency-sensitive game data
- Add packet reliability control for both ProxyPacket and LDNPacket
- Use ENET_PACKET_FLAG_UNSEQUENCED for small UDP packets (<1200 bytes)
Monitoring & Debugging:
- Add PacketStatistics struct to track sent/received/dropped packets
- Enhanced logging for proxy packet handling and socket lifecycle
- Periodic stats logging every 100 packets for diagnostics
Configuration:
- Update lobby_api_url and web_api_url to https://api.ynet-fun.xyz
- Add lobby API URL configuration support
Socket Management:
- Implement SocketPoolKey for efficient socket reuse
- Store domain/type/protocol info in FileDescriptor
- Max pool size limit (8 sockets per type) to prevent memory bloat
- Return closed sockets to pool when room is still connected
Protocol Updates:
- Add 'reliable' field to ProxyPacket and LDNPacket structures
- Update room.cpp packet handlers to respect reliability flags
- Maintain backward compatibility with default reliable=true
These changes significantly reduce packet latency for real-time game
traffic while maintaining reliability for control packets.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
- Add device detection for Snapdragon 8 Elite (device ID 0x43052c01)
- Disable shader float controls and 64-bit integer atomics on Qualcomm
proprietary drivers to work around driver limitations
- Enable native BGR format support on S8 Elite (similar to S8 Gen 2)
- Implement VOTE_vtg instruction for vertex/tessellation/geometry shaders
with proper single-thread semantics
- Replace stub warnings with detailed comments for FCSM_TR flow test and
SR_WSCALEFACTOR special registers to document expected behavior
These changes improve compatibility with Qualcomm Snapdragon 8 Elite
devices and reduce spurious warnings by documenting shader features
that are correctly handled as conservative defaults.
Signed-off-by: Zephyron <zephyron@citron-emu.org>
Annoyed a few people that the Overlay was non-functional unless they were in-game. Now it works when not in-game.
Signed-off-by: Collecting <collecting@noreply.localhost>