From 558e3d0cb3e4a751d4ba1f70b17bfa4333438231 Mon Sep 17 00:00:00 2001 From: bicarus <202771338+bicarus-dev@users.noreply.github.com> Date: Mon, 20 Jul 2026 03:00:34 -0700 Subject: [PATCH] rawinput: avoid enumerationg adapter modes on first touch (#817) ## Link to GitHub Issue or related Pull Request, if one exists Regressed by #790 ## Description of change Avoid enumerating every display mode with `EnumDisplaySettings` during the first raw touchscreen report, as it can take a couple hundred milliseconds. The latency-sensitive path now refreshes only the current display size using `GetWindowRect(GetDesktopWindow())` and orientation using `EnumDisplaySettingsEx(..., ENUM_CURRENT_SETTINGS, ..., EDS_RAWMODE)`. Full `EnumDisplaySettings` enumeration runs only when native resolution is needed for aspect compensation. Jubeat and Reflec Beat now enable aspect compensation before initializing touch input. ## Testing Sanity checked rb/jb on laptops with non-16:9 ratio --- src/spice2x/games/jb/jb_touch.cpp | 3 ++- src/spice2x/games/rb/touch.cpp | 6 +++--- src/spice2x/rawinput/touch.cpp | 34 +++++++++++++++++++------------ 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/spice2x/games/jb/jb_touch.cpp b/src/spice2x/games/jb/jb_touch.cpp index d4fe174..4798643 100644 --- a/src/spice2x/games/jb/jb_touch.cpp +++ b/src/spice2x/games/jb/jb_touch.cpp @@ -202,11 +202,12 @@ namespace games::jb { IS_PORTRAIT = avs::game::is_model("L44"); log_info("jubeat", "using window handle for touch: {}", fmt::ptr(wnd)); - touch_create_wnd(wnd, true); // let the rawinput stack correct the aspect ratio ::rawinput::touch::ASPECT_COMPENSATION_GAME = true; + touch_create_wnd(wnd, true); + if (GRAPHICS_SHOW_CURSOR) { ShowCursor(TRUE); } diff --git a/src/spice2x/games/rb/touch.cpp b/src/spice2x/games/rb/touch.cpp index 50108ca..f9d1f16 100644 --- a/src/spice2x/games/rb/touch.cpp +++ b/src/spice2x/games/rb/touch.cpp @@ -86,6 +86,9 @@ bool games::rb::ReflecBeatTouchDeviceHandle::open(LPCWSTR lpFileName) { SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER); } + // request automatic aspect ratio fixes + ::rawinput::touch::ASPECT_COMPENSATION_GAME = true; + // create touch window touch_create_wnd(wnd); @@ -94,9 +97,6 @@ bool games::rb::ReflecBeatTouchDeviceHandle::open(LPCWSTR lpFileName) { ShowWindow(wnd, SW_SHOW); } - // request automatic aspect ratio fixes - ::rawinput::touch::ASPECT_COMPENSATION_GAME = true; - } else { // fallback to dx hook diff --git a/src/spice2x/rawinput/touch.cpp b/src/spice2x/rawinput/touch.cpp index 5eaf5fb..44adf1f 100644 --- a/src/spice2x/rawinput/touch.cpp +++ b/src/spice2x/rawinput/touch.cpp @@ -35,6 +35,8 @@ namespace rawinput::touch { long DISPLAY_NATIVE_Y = 0L; bool DISPLAY_INITIALIZED = false; + static void update_current_display_mode(); + bool aspect_compensation_enabled() { switch (ASPECT_COMPENSATION_MODE) { case AspectMode::On: @@ -279,7 +281,7 @@ namespace rawinput::touch { // check if display is initialized if (!DISPLAY_INITIALIZED) { - display_update(); + update_current_display_mode(); } // update timeouts here as well so events are in the right order @@ -638,12 +640,7 @@ namespace rawinput::touch { return false; } - void display_update() { - - // check if disabled - if (DISABLED) - return; - + static void update_current_display_mode() { // determine monitor size static RECT display_rect; GetWindowRect(GetDesktopWindow(), &display_rect); @@ -651,12 +648,6 @@ namespace rawinput::touch { DISPLAY_SIZE_Y = display_rect.bottom - display_rect.top; log_info("rawinput", "primary display size: {}x{}", (int) DISPLAY_SIZE_X, (int) DISPLAY_SIZE_Y); - // determine the native (maximum) resolution of the primary display; used to - // detect and undo letterboxing when a non-native display mode is in use - detect_native_resolution(); - log_info("rawinput", "primary display native size: {}x{}", - (int) DISPLAY_NATIVE_X, (int) DISPLAY_NATIVE_Y); - // determine monitor orientation DEVMODE display_mode{}; display_mode.dmSize = sizeof(DEVMODE); @@ -703,4 +694,21 @@ namespace rawinput::touch { // mark as initialized DISPLAY_INITIALIZED = true; } + + void display_update() { + + // check if disabled + if (DISABLED) + return; + + update_current_display_mode(); + + if (aspect_compensation_enabled()) { + // determine the native (maximum) resolution of the primary display; used to + // detect and undo letterboxing when a non-native display mode is in use + detect_native_resolution(); + log_info("rawinput", "primary display native size: {}x{}", + (int) DISPLAY_NATIVE_X, (int) DISPLAY_NATIVE_Y); + } + } }