* window: auto-hide the cursor over the game window
Hide the cursor when the game window is created and whenever the mouse
has been idle for two seconds; any mouse motion, button or wheel event
shows it again. Games that draw their own cursor (e.g. Blue Prince) no
longer show the host pointer on top of it.
Only real mouse input counts as activity: synthetic touch/pen mouse
events and zero-delta motion (sent by some platforms on focus or cursor
visibility changes) are ignored. The event loop only waits with a
timeout while the cursor is visible, so it still blocks indefinitely
once the cursor is hidden. The cursor is restored on shutdown.
Uses SDL_HideCursor/SDL_ShowCursor, which SDL implements for X11,
Wayland, Cocoa and Win32 and which only affect the cursor over the
emulator window.
Closes#282
* window: make cursor auto-hide optional in CLI and launcher
Co-authored-by: Anatolii Kucheruk <anatolii.kucheruk01@gmail.com>
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
Co-authored-by: Anatolii Kucheruk <anatolii.kucheruk01@gmail.com>
* network: handle SO_NBIO on non-Windows hosts
Setsockopt only translated the guest SOL_SOCKET/SO_NBIO (0x1200) option
under _WIN32; other hosts rejected it with ENOPROTOOPT. FMOD Studio's Live
Update listener sets SO_NBIO, so on Linux its socket setup failed and the
Studio async manager latched FMOD_ERR_NET_CONNECT. Every blocking Studio
call then failed: loadBankFile returned FMOD_ERR_NOTREADY for all banks,
leaving the game silent and stuck on the splash screen waiting for
RuntimeManager.HaveAllBanksLoaded (PPSA28997).
Toggle O_NONBLOCK with fcntl on non-Windows hosts.
* network: map connection errors from POSIX socket calls
ConvertHostSocketError only covered a handful of errno values on
non-Windows hosts, so anything else reached the guest as EIO. With
SO_NBIO now honoured there, a nonblocking connect() that is still in
progress returned EIO instead of EINPROGRESS (and EALREADY on retry).
Map the same connection and network errors the Windows branch already
translates.
* network: share nonblocking socket error handling
---------
Co-authored-by: nmzik <Nmzik@mail.ru>
* window: explain why each GPU was rejected in device selection
"Could not find suitable device" gave no hint of what was missing; the
reasons only went to the log file, which users often cannot find (#489).
Device selection now records each rejection reason and the fatal error
lists every GPU with its reasons, for example:
Could not find suitable device:
AMD BC-250 (RADV GFX1013): fragmentShaderBarycentric is not supported
The missing-extension check also names each missing extension instead of
stopping at the first one without saying which. Device requirements and
selection are unchanged; the log keeps the same messages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* window: simplify GPU rejection reporting and capability checks
* window: identify storage-image format failures accurately
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: nmzik <Nmzik@mail.ru>