From 1029f57b8aa9118d08413d1d8a6dd9d32cf0d5f1 Mon Sep 17 00:00:00 2001 From: ocornut Date: Mon, 3 Jul 2023 12:17:23 +0200 Subject: [PATCH] Inputs, Tooltip: Rework stationary timer logic as it broke on high-framerates with lower rate of mouse inputs. (#1485) --- imgui.cpp | 12 +++++------- imgui.h | 2 +- imgui_internal.h | 2 -- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 92a95cfbd..418be675b 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -8619,14 +8619,12 @@ static void ImGui::UpdateMouseInputs() else io.MouseDelta = ImVec2(0.0f, 0.0f); - // Update stationary timer. Only reset on 2 successive moving frames. - // FIXME: May need to expose threshold or treat touch inputs differently. + // Update stationary timer. + // FIXME: May need to rework again to have some tolerance for occasional small movement, while being functional on high-framerates. const float mouse_stationary_threshold = (io.MouseSource == ImGuiMouseSource_Mouse) ? 2.0f : 3.0f; // Slightly higher threshold for ImGuiMouseSource_TouchScreen/ImGuiMouseSource_Pen, may need rework. - g.MouseMovingFrames = (ImLengthSqr(io.MouseDelta) >= mouse_stationary_threshold * mouse_stationary_threshold) ? (g.MouseMovingFrames + 1) : 0; - if (g.MouseMovingFrames == 0) - g.MouseStationaryTimer += io.DeltaTime; - else if (g.MouseMovingFrames > 1) - g.MouseStationaryTimer = 0.0f; + const bool mouse_stationary = (ImLengthSqr(io.MouseDelta) <= mouse_stationary_threshold * mouse_stationary_threshold); + g.MouseStationaryTimer = mouse_stationary ? (g.MouseStationaryTimer + io.DeltaTime) : 0.0f; + //IMGUI_DEBUG_LOG("%.4f\n", g.MouseStationaryTimer); // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) diff --git a/imgui.h b/imgui.h index b333ee8cf..5e0ab7f8c 100644 --- a/imgui.h +++ b/imgui.h @@ -23,7 +23,7 @@ // Library Version // (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM >= 12345') #define IMGUI_VERSION "1.89.7 WIP" -#define IMGUI_VERSION_NUM 18967 +#define IMGUI_VERSION_NUM 18968 #define IMGUI_HAS_TABLE /* diff --git a/imgui_internal.h b/imgui_internal.h index cb1d1b12f..c78e9d69a 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -1978,7 +1978,6 @@ struct ImGuiContext // Mouse state ImGuiMouseCursor MouseCursor; - int MouseMovingFrames; float MouseStationaryTimer; // Time the mouse has been stationary (with some loose heuristic) ImVec2 MouseLastValidPos; @@ -2182,7 +2181,6 @@ struct ImGuiContext HoverItemDelayTimer = HoverItemDelayClearTimer = 0.0f; MouseCursor = ImGuiMouseCursor_Arrow; - MouseMovingFrames = 0; MouseStationaryTimer = 0.0f; TempInputId = 0;