1
0
mirror of https://github.com/godotengine/godot.git synced 2025-12-30 18:30:54 +00:00

Merge pull request #112712 from bruvzg/mo_e

Use event position for mouse over when event come from the same window.
This commit is contained in:
Rémi Verschelde
2025-12-18 14:23:48 +01:00
2 changed files with 11 additions and 11 deletions

View File

@@ -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<InputEventMouse> &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<InputEvent> rp_event, bool p_local_coord
Ref<InputEventMouse> 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)) {

View File

@@ -488,7 +488,7 @@ private:
bool _sub_windows_forward_input(const Ref<InputEvent> &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<InputEventMouse> &p_mm);
virtual void _update_mouse_over(Vector2 p_pos);
virtual void _mouse_leave_viewport();