From 125ff3213ac282a801aaeeb7fc07ec55802866a5 Mon Sep 17 00:00:00 2001 From: Alex Docauer Date: Mon, 19 Aug 2024 19:31:24 -0700 Subject: [PATCH] Only reset tooltip timer when mouse actually moved InputEventMouseMotion isn't guaranteed to fire only on actual mouse movement. It's not uncommon for the underlying OS motion event to be sent either by the OS itself or another application even though the mouse hasn't moved. Godot will generate such zero-motion InputEventMouseMotion events itself for things like cursor shape changes. Once started, the tooltip timer is reset only after a mouse movement of at least 5 pixels in one frame. --- scene/main/viewport.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index c85fda23712..1d6546c2085 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1933,7 +1933,12 @@ void Viewport::_gui_input_event(Ref p_event) { } } - if (!is_tooltip_shown && over->can_process()) { + // If the tooltip timer isn't running, start it. + // Otherwise, only reset the timer if the mouse has moved more than 5 pixels. + if (!is_tooltip_shown && over->can_process() && + (gui.tooltip_timer.is_null() || + Math::is_zero_approx(gui.tooltip_timer->get_time_left()) || + mm->get_relative().length() > 5.0)) { if (gui.tooltip_timer.is_valid()) { gui.tooltip_timer->release_connections(); gui.tooltip_timer = Ref();