From 307e40e8737826081ce1a21525705205d442fffb Mon Sep 17 00:00:00 2001 From: kit Date: Wed, 21 Aug 2024 09:37:44 -0400 Subject: [PATCH] Clean up Viewport forced_mouse_focus --- editor/gui/editor_object_selector.cpp | 1 - scene/gui/popup_menu.cpp | 8 -------- scene/gui/popup_menu.h | 2 -- scene/main/viewport.cpp | 29 +++++---------------------- scene/main/viewport.h | 3 --- 5 files changed, 5 insertions(+), 38 deletions(-) diff --git a/editor/gui/editor_object_selector.cpp b/editor/gui/editor_object_selector.cpp index bfd7e18de1d7..b73cd3b65cf4 100644 --- a/editor/gui/editor_object_selector.cpp +++ b/editor/gui/editor_object_selector.cpp @@ -103,7 +103,6 @@ void EditorObjectSelector::_show_popup() { sub_objects_menu->set_position(gp); sub_objects_menu->set_size(Size2(size.width, 1)); - sub_objects_menu->take_mouse_focus(); sub_objects_menu->popup(); } diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index 86b01657545b..9b20d3b430cd 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -2592,14 +2592,6 @@ void PopupMenu::clear_autohide_areas() { autohide_areas.clear(); } -void PopupMenu::take_mouse_focus() { - ERR_FAIL_COND(!is_inside_tree()); - - if (get_parent()) { - get_parent()->get_viewport()->pass_mouse_focus_to(this, control); - } -} - bool PopupMenu::_set(const StringName &p_name, const Variant &p_value) { if (property_helper.property_set_value(p_name, p_value)) { return true; diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index 5313dae404f7..b8aa51c1ad17 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -369,8 +369,6 @@ class PopupMenu : public Popup { virtual void popup(const Rect2i &p_bounds = Rect2i()) override; virtual void set_visible(bool p_visible) override; - void take_mouse_focus(); - PopupMenu(); ~PopupMenu(); }; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 00362476256e..54530e21a9df 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -655,9 +655,7 @@ void Viewport::_notification(int p_what) { case NOTIFICATION_WM_WINDOW_FOCUS_OUT: { _gui_cancel_tooltip(); _drop_physics_mouseover(); - if (gui.mouse_focus && !gui.forced_mouse_focus) { - _drop_mouse_focus(); - } + _drop_mouse_focus(); // When the window focus changes, we want to end mouse_focus, but // not the mouse_over. Note: The OS will trigger a separate mouse // exit event if the change in focus results in the mouse exiting @@ -1831,7 +1829,6 @@ void Viewport::_gui_input_event(Ref p_event) { // as the release will never be received otherwise. if (gui.mouse_focus_mask.is_empty()) { gui.mouse_focus = nullptr; - gui.forced_mouse_focus = false; } bool stopped = mouse_focus && mouse_focus->can_process() && _gui_call_input(mouse_focus, mb); @@ -1860,7 +1857,6 @@ void Viewport::_gui_input_event(Ref p_event) { gui.drag_data = control->get_drag_data(control->get_global_transform_with_canvas().affine_inverse().xform(mpos - gui.drag_accum)); if (gui.drag_data.get_type() != Variant::NIL) { gui.mouse_focus = nullptr; - gui.forced_mouse_focus = false; gui.mouse_focus_mask.clear(); break; } else { @@ -2398,7 +2394,6 @@ void Viewport::_gui_hide_control(Control *p_control) { void Viewport::_gui_remove_control(Control *p_control) { if (gui.mouse_focus == p_control) { gui.mouse_focus = nullptr; - gui.forced_mouse_focus = false; gui.mouse_focus_mask.clear(); } if (gui.key_focus == p_control) { @@ -2564,9 +2559,12 @@ void Viewport::_drop_mouse_focus() { Control *c = gui.mouse_focus; BitField mask = gui.mouse_focus_mask; gui.mouse_focus = nullptr; - gui.forced_mouse_focus = false; gui.mouse_focus_mask.clear(); + if (!c) { + return; + } + for (int i = 0; i < 3; i++) { if ((int)mask & (1 << i)) { Ref mb; @@ -3893,23 +3891,6 @@ Rect2i Viewport::subwindow_get_popup_safe_rect(Window *p_window) const { return gui.sub_windows[index].parent_safe_rect; } -void Viewport::pass_mouse_focus_to(Viewport *p_viewport, Control *p_control) { - ERR_MAIN_THREAD_GUARD; - ERR_FAIL_NULL(p_viewport); - ERR_FAIL_NULL(p_control); - - if (gui.mouse_focus) { - p_viewport->gui.mouse_focus = p_control; - p_viewport->gui.mouse_focus_mask = gui.mouse_focus_mask; - p_viewport->gui.key_focus = p_control; - p_viewport->gui.forced_mouse_focus = true; - - gui.mouse_focus = nullptr; - gui.forced_mouse_focus = false; - gui.mouse_focus_mask.clear(); - } -} - void Viewport::set_sdf_oversize(SDFOversize p_sdf_oversize) { ERR_MAIN_THREAD_GUARD; ERR_FAIL_INDEX(p_sdf_oversize, SDF_OVERSIZE_MAX); diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 0d31c07e57e2..faa36851e98e 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -349,7 +349,6 @@ class Viewport : public Node { Ref vrs_texture; struct GUI { - bool forced_mouse_focus = false; //used for menu buttons bool mouse_in_viewport = false; bool key_event_accepted = false; HashMap touch_focus; @@ -662,8 +661,6 @@ class Viewport : public Node { Viewport *get_parent_viewport() const; Window *get_base_window() const; - void pass_mouse_focus_to(Viewport *p_viewport, Control *p_control); - void set_canvas_cull_mask(uint32_t p_layers); uint32_t get_canvas_cull_mask() const;