diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 9c8385374dc..233f50e7c4e 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -3217,7 +3217,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. @@ -3228,18 +3228,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()); + } } } @@ -3487,9 +3489,7 @@ void Viewport::push_input(RequiredParam rp_event, bool p_local_coord 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 bf512813b10..f45cc337532 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();