From 0fce98b4b5f568298477b175c70510924793f6b0 Mon Sep 17 00:00:00 2001 From: Markus Sauermann <6299227+Sauermann@users.noreply.github.com> Date: Wed, 9 Mar 2022 01:04:56 +0100 Subject: [PATCH] Update mouse cursor shape after changes This fixes some cases where the mouse cursor shape did not change automatically, but instead required a MouseMove to update. --- scene/gui/control.cpp | 5 +++++ scene/main/scene_tree.cpp | 1 + scene/main/viewport.cpp | 4 ++-- scene/main/window.cpp | 12 ++++++++++++ scene/main/window.h | 2 ++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index d8659b1f18d..2866a5ad6c4 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -2663,6 +2663,11 @@ void Control::set_default_cursor_shape(CursorShape p_shape) { ERR_FAIL_INDEX(int(p_shape), CURSOR_MAX); data.default_cursor = p_shape; + + if (!is_inside_tree()) { + return; + } + get_viewport()->get_base_window()->update_mouse_cursor_shape(); } Control::CursorShape Control::get_default_cursor_shape() const { diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index d1e8b477a62..0ff99bdab63 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -1087,6 +1087,7 @@ void SceneTree::_change_scene(Node *p_to) { if (p_to) { current_scene = p_to; root->add_child(p_to); + root->update_mouse_cursor_shape(); } } diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index de6aa2b1394..0082e7b0618 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1551,7 +1551,7 @@ void Viewport::_gui_input_event(Ref p_event) { gui.drag_preview_id = ObjectID(); } _propagate_viewport_notification(this, NOTIFICATION_DRAG_END); - // Change mouse accordingly. + get_base_window()->update_mouse_cursor_shape(); } _gui_cancel_tooltip(); @@ -1572,7 +1572,7 @@ void Viewport::_gui_input_event(Ref p_event) { gui.dragging = false; gui.drag_mouse_over = nullptr; _propagate_viewport_notification(this, NOTIFICATION_DRAG_END); - // Change mouse accordingly. + get_base_window()->update_mouse_cursor_shape(); } gui.mouse_focus_mask &= ~mouse_button_to_mask(mb->get_button_index()); // Remove from mask. diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 6837fcae213..a1124274d83 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -378,6 +378,18 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { } } +void Window::update_mouse_cursor_shape() { + // The default shape is set in Viewport::_gui_input_event. To instantly + // see the shape in the viewport we need to trigger a mouse motion event. + Ref mm; + Vector2 pos = get_mouse_position(); + Transform2D xform = get_global_canvas_transform().affine_inverse(); + mm.instantiate(); + mm->set_position(pos); + mm->set_global_position(xform.xform(pos)); + push_input(mm); +} + void Window::show() { set_visible(true); } diff --git a/scene/main/window.h b/scene/main/window.h index 3d8e337b4a1..27a02b837f8 100644 --- a/scene/main/window.h +++ b/scene/main/window.h @@ -205,6 +205,8 @@ public: void set_visible(bool p_visible); bool is_visible() const; + void update_mouse_cursor_shape(); + void show(); void hide();