From 29b83bf02cff1578add0764510b39b997dcae893 Mon Sep 17 00:00:00 2001 From: Susko3 Date: Mon, 8 Apr 2024 17:20:15 +0200 Subject: [PATCH] Async mouse and keyboard on Windows This works because SDL queries for raw mouse and keyboard input on a separate thread and we sync all inputs to a `ConcurrentQueue`. --- osu.Framework/Platform/Windows/WindowsWindow.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/osu.Framework/Platform/Windows/WindowsWindow.cs b/osu.Framework/Platform/Windows/WindowsWindow.cs index 2f241e8e5d..726e939c78 100644 --- a/osu.Framework/Platform/Windows/WindowsWindow.cs +++ b/osu.Framework/Platform/Windows/WindowsWindow.cs @@ -93,8 +93,20 @@ private SDL_bool handleEventFromHook(MSG msg) protected override int HandleEventFromFilter(SDL_Event evt) { + bool rawMouse = SDL3.SDL_GetRelativeMouseMode() == SDL_bool.SDL_TRUE; + switch (evt.type) { + // handle raw mouse and keyboard events in SDL_EventFilter for lower latency are resilience against SDL_PumpEvents() lag + case SDL_EventType.SDL_EVENT_MOUSE_MOTION when rawMouse: + case SDL_EventType.SDL_EVENT_MOUSE_BUTTON_DOWN when rawMouse: + case SDL_EventType.SDL_EVENT_MOUSE_BUTTON_UP when rawMouse: + case SDL_EventType.SDL_EVENT_MOUSE_WHEEL when rawMouse: + case SDL_EventType.SDL_EVENT_KEY_DOWN: + case SDL_EventType.SDL_EVENT_KEY_UP: + HandleEvent(evt); + return DROP_EVENT; + case SDL_EventType.SDL_EVENT_WINDOW_FOCUS_LOST: warpCursorFromFocusLoss(); break;