From a6f6d7118e934913953cc0bd9edb22afa3c953e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Thu, 13 Nov 2025 08:26:11 +0200 Subject: [PATCH] Use event position for mouse over when event come from the same window. --- scene/main/viewport.cpp | 20 ++++++++++---------- scene/main/viewport.h | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index e0e60a7ac75..f0112717185 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -3198,7 +3198,7 @@ void Viewport::_window_start_resize(SubWindowResize p_edge, Window *p_window) { _sub_window_update(sw.window); } -void Viewport::_update_mouse_over() { +void Viewport::_update_mouse_over(const Ref &p_mm) { // Update gui.mouse_over and gui.subwindow_over in all Viewports. // Send necessary mouse_enter/mouse_exit signals and the MOUSE_ENTER/MOUSE_EXIT notifications for every Viewport in the SceneTree. @@ -3209,18 +3209,20 @@ void Viewport::_update_mouse_over() { if (get_tree()->get_root()->is_embedding_subwindows() || is_sub_viewport()) { // Use embedder logic for calculating mouse position. - _update_mouse_over(gui.last_mouse_pos); + _update_mouse_over(p_mm->get_position()); } else { // Native Window: Use DisplayServer logic for calculating mouse position. Window *receiving_window = get_tree()->get_root()->gui.windowmanager_window_over; if (!receiving_window) { return; } - - Vector2 pos = DisplayServer::get_singleton()->mouse_get_position() - receiving_window->get_position(); - pos = receiving_window->get_final_transform().affine_inverse().xform(pos); - - receiving_window->_update_mouse_over(pos); + if (receiving_window->get_window_id() != p_mm->get_window_id()) { + Vector2 pos = DisplayServer::get_singleton()->mouse_get_position() - receiving_window->get_position(); + pos = receiving_window->get_final_transform().affine_inverse().xform(pos); + receiving_window->_update_mouse_over(pos); + } else { + receiving_window->_update_mouse_over(p_mm->get_position()); + } } } @@ -3461,9 +3463,7 @@ void Viewport::push_input(const Ref &p_event, bool p_local_coords) { Ref me = ev; if (me.is_valid()) { - gui.last_mouse_pos = me->get_position(); - - _update_mouse_over(); + _update_mouse_over(me); } if (is_embedding_subwindows() && _sub_windows_forward_input(ev)) { diff --git a/scene/main/viewport.h b/scene/main/viewport.h index cf1d14383ef..b80af53187a 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -488,7 +488,7 @@ private: bool _sub_windows_forward_input(const Ref &p_event); SubWindowResize _sub_window_get_resize_margin(Window *p_subwindow, const Point2 &p_point); - void _update_mouse_over(); + void _update_mouse_over(const Ref &p_mm); virtual void _update_mouse_over(Vector2 p_pos); virtual void _mouse_leave_viewport();