diff options
author | Markus Sauermann <6299227+Sauermann@users.noreply.github.com> | 2024-03-26 22:20:02 +0100 |
---|---|---|
committer | Markus Sauermann <6299227+Sauermann@users.noreply.github.com> | 2024-03-28 20:22:49 +0100 |
commit | 48ea01932203d810a6e01d5fa292ca124d72b8f0 (patch) | |
tree | a48566d40870c74f2e6e13359714655918ec5cb2 | |
parent | 7d151c83811f8ac8873439826c16d88c83aba12f (diff) | |
download | redot-engine-48ea01932203d810a6e01d5fa292ca124d72b8f0.tar.gz |
Fix a special case for button masks
In certain situations it is possible that in a `Viewport` the same
mouse button is pressed twice in series without releasing it in
between.
In this case, focus stealing should happen to ensure, that the
mouse button is not sent unintentionally to the previously focused
Control node.
-rw-r--r-- | scene/main/viewport.cpp | 7 | ||||
-rw-r--r-- | tests/scene/test_code_edit.h | 1 |
2 files changed, 5 insertions, 3 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 4e1d2b3983..5313493dc6 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -1705,9 +1705,10 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) { Point2 mpos = mb->get_position(); if (mb->is_pressed()) { - if (!gui.mouse_focus_mask.is_empty()) { - // Do not steal mouse focus and stuff while a focus mask exists. - gui.mouse_focus_mask.set_flag(mouse_button_to_mask(mb->get_button_index())); + MouseButtonMask button_mask = mouse_button_to_mask(mb->get_button_index()); + if (!gui.mouse_focus_mask.is_empty() && !gui.mouse_focus_mask.has_flag(button_mask)) { + // Do not steal mouse focus and stuff while a focus mask without the current mouse button exists. + gui.mouse_focus_mask.set_flag(button_mask); } else { gui.mouse_focus = gui_find_control(mpos); gui.last_mouse_focus = gui.mouse_focus; diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h index bc2f7f51b1..b0a46b8107 100644 --- a/tests/scene/test_code_edit.h +++ b/tests/scene/test_code_edit.h @@ -3520,6 +3520,7 @@ TEST_CASE("[SceneTree][CodeEdit] completion") { /* Single click selects. */ caret_pos.y += code_edit->get_line_height() * 2; SEND_GUI_MOUSE_BUTTON_EVENT(caret_pos, MouseButton::LEFT, MouseButtonMask::LEFT, Key::NONE); + SEND_GUI_MOUSE_BUTTON_RELEASED_EVENT(caret_pos, MouseButton::LEFT, MouseButtonMask::NONE, Key::NONE); CHECK(code_edit->get_code_completion_selected_index() == 2); /* Double click inserts. */ |