You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-12-31 18:41:20 +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:
@@ -3217,7 +3217,7 @@ void Viewport::_window_start_resize(SubWindowResize p_edge, Window *p_window) {
|
|||||||
_sub_window_update(sw.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.
|
// 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.
|
// 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()) {
|
if (get_tree()->get_root()->is_embedding_subwindows() || is_sub_viewport()) {
|
||||||
// Use embedder logic for calculating mouse position.
|
// Use embedder logic for calculating mouse position.
|
||||||
_update_mouse_over(gui.last_mouse_pos);
|
_update_mouse_over(p_mm->get_position());
|
||||||
} else {
|
} else {
|
||||||
// Native Window: Use DisplayServer logic for calculating mouse position.
|
// Native Window: Use DisplayServer logic for calculating mouse position.
|
||||||
Window *receiving_window = get_tree()->get_root()->gui.windowmanager_window_over;
|
Window *receiving_window = get_tree()->get_root()->gui.windowmanager_window_over;
|
||||||
if (!receiving_window) {
|
if (!receiving_window) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (receiving_window->get_window_id() != p_mm->get_window_id()) {
|
||||||
Vector2 pos = DisplayServer::get_singleton()->mouse_get_position() - receiving_window->get_position();
|
Vector2 pos = DisplayServer::get_singleton()->mouse_get_position() - receiving_window->get_position();
|
||||||
pos = receiving_window->get_final_transform().affine_inverse().xform(pos);
|
pos = receiving_window->get_final_transform().affine_inverse().xform(pos);
|
||||||
|
receiving_window->_update_mouse_over(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;
|
Ref<InputEventMouse> me = ev;
|
||||||
if (me.is_valid()) {
|
if (me.is_valid()) {
|
||||||
gui.last_mouse_pos = me->get_position();
|
_update_mouse_over(me);
|
||||||
|
|
||||||
_update_mouse_over();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_embedding_subwindows() && _sub_windows_forward_input(ev)) {
|
if (is_embedding_subwindows() && _sub_windows_forward_input(ev)) {
|
||||||
|
|||||||
@@ -488,7 +488,7 @@ private:
|
|||||||
bool _sub_windows_forward_input(const Ref<InputEvent> &p_event);
|
bool _sub_windows_forward_input(const Ref<InputEvent> &p_event);
|
||||||
SubWindowResize _sub_window_get_resize_margin(Window *p_subwindow, const Point2 &p_point);
|
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 _update_mouse_over(Vector2 p_pos);
|
||||||
virtual void _mouse_leave_viewport();
|
virtual void _mouse_leave_viewport();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user