diff --git a/examples/example-server-lib/floating_window_manager.cpp b/examples/example-server-lib/floating_window_manager.cpp index dffcc6a6a3c..d85deb27544 100644 --- a/examples/example-server-lib/floating_window_manager.cpp +++ b/examples/example-server-lib/floating_window_manager.cpp @@ -90,14 +90,14 @@ bool FloatingWindowManagerPolicy::handle_pointer_event(MirPointerEvent const* ev if (action == mir_pointer_action_button_down) { - if (auto const window = tools.window_at(cursor)) - tools.select_active_window(window); - - if (auto const window = tools.active_window()) + if (mir_pointer_event_button_state(event, mir_pointer_button_tertiary)) { - if (mir_pointer_event_button_state(event, mir_pointer_button_tertiary)) + if (modifiers == mir_input_event_modifier_alt) { - if (modifiers == mir_input_event_modifier_alt) + if (auto const window = tools.window_at(cursor)) + tools.select_active_window(window); + + if (auto const window = tools.active_window()) { Rectangle const old_pos{window.top_left(), window.size()}; diff --git a/src/miral/floating_window_manager.cpp b/src/miral/floating_window_manager.cpp index e48ae701bc5..1502cb0c748 100644 --- a/src/miral/floating_window_manager.cpp +++ b/src/miral/floating_window_manager.cpp @@ -386,26 +386,39 @@ bool miral::FloatingWindowManager::Impl::handle_pointer_event(MirPointerEvent co break; } - if (!consumes_event && action == mir_pointer_action_button_down) + if (!consumes_event) { - if (auto const window = tools.window_at(new_cursor)) - { - tools.select_active_window(window); - } - - if (auto const window = tools.active_window()) + switch (action) { + case mir_pointer_action_button_down: if (mir_pointer_event_button_state(event, mir_pointer_button_primary)) { if (shift_keys == pointer_drag_modifier) { - begin_pointer_gesture( - tools.info_for(window), - mir_pointer_event_input_event(event), - Gesture::pointer_moving, mir_resize_edge_none); - consumes_event = true; + if (auto const hint = tools.window_at(new_cursor)) + { + tools.select_active_window(hint); + + if (auto const window = tools.active_window()) + { + begin_pointer_gesture( + tools.info_for(window), + mir_pointer_event_input_event(event), + Gesture::pointer_moving, mir_resize_edge_none); + consumes_event = true; + } + } } } + break; + case mir_pointer_action_button_up: + if (auto const window = tools.window_at(new_cursor)) + { + tools.select_active_window(window); + } + break; + default: + break; } } diff --git a/tests/window_management_tests/test_floating_window_manager.cpp b/tests/window_management_tests/test_floating_window_manager.cpp index 9ea6798efda..04746ed4e65 100644 --- a/tests/window_management_tests/test_floating_window_manager.cpp +++ b/tests/window_management_tests/test_floating_window_manager.cpp @@ -209,7 +209,7 @@ TEST_F(FloatingWindowManagerTest, can_select_window_with_pointer) EXPECT_TRUE(focused(window2)); - auto const select_event = mir::events::make_pointer_event( + auto const select_event1 = mir::events::make_pointer_event( 0, std::chrono::system_clock::now().time_since_epoch(), mir_input_event_modifier_none, @@ -222,7 +222,22 @@ TEST_F(FloatingWindowManagerTest, can_select_window_with_pointer) mir_pointer_axis_source_none, {}, {}); - publish_event(*select_event); + auto const select_event2 = mir::events::make_pointer_event( + 0, + std::chrono::system_clock::now().time_since_epoch(), + mir_input_event_modifier_none, + mir_pointer_action_button_up, + mir_pointer_button_primary, + geom::PointF{ + window1.top_left().x.as_int() + window1.size().width.as_int() - 1, + window1.top_left().y.as_int() + window1.size().height.as_int() - 1}, + {}, + mir_pointer_axis_source_none, + {}, + {}); + + publish_event(*select_event1); + publish_event(*select_event2); EXPECT_TRUE(focused(window1)); }