From e84823360de2162f166cac224968d110d3c5924f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 24 Mar 2019 13:09:46 +0100 Subject: [PATCH] WindowServer: Moving a window to front should always activate it. So instead of having move_to_front() + set_active_window(), let's have move_to_front_and_make_active(). --- Servers/WindowServer/WSWindowManager.cpp | 22 +++++++++------------- Servers/WindowServer/WSWindowManager.h | 2 +- Servers/WindowServer/WSWindowSwitcher.cpp | 6 ++---- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index bfac95bef3..8a68f967bc 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -520,7 +520,7 @@ void WSWindowManager::add_window(WSWindow& window) m_switcher.refresh(); } -void WSWindowManager::move_to_front(WSWindow& window) +void WSWindowManager::move_to_front_and_make_active(WSWindow& window) { if (window.is_blocked_by_modal_window()) return; @@ -529,6 +529,8 @@ void WSWindowManager::move_to_front(WSWindow& window) invalidate(window); m_windows_in_order.remove(&window); m_windows_in_order.append(&window); + + set_active_window(&window); } void WSWindowManager::remove_window(WSWindow& window) @@ -620,6 +622,7 @@ void WSWindowManager::start_window_drag(WSWindow& window, WSMouseEvent& event) #ifdef DRAG_DEBUG printf("[WM] Begin dragging WSWindow{%p}\n", &window); #endif + move_to_front_and_make_active(window); m_drag_window = window.make_weak_ptr();; m_drag_origin = event.position(); m_drag_window_origin = window.position(); @@ -628,6 +631,7 @@ void WSWindowManager::start_window_drag(WSWindow& window, WSMouseEvent& event) void WSWindowManager::start_window_resize(WSWindow& window, WSMouseEvent& event) { + move_to_front_and_make_active(window); constexpr ResizeDirection direction_for_hot_area[3][3] = { { ResizeDirection::UpLeft, ResizeDirection::Up, ResizeDirection::UpRight }, { ResizeDirection::Left, ResizeDirection::None, ResizeDirection::Right }, @@ -821,23 +825,17 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ for_each_visible_window_from_front_to_back([&] (WSWindow& window) { if (window.type() == WSWindowType::Normal && outer_window_rect(window).contains(event.position())) { if (m_keyboard_modifiers == Mod_Logo && event.type() == WSMessage::MouseDown && event.button() == MouseButton::Left) { - move_to_front(window); - set_active_window(&window); start_window_drag(window, event); return IterationDecision::Abort; } if (m_keyboard_modifiers == Mod_Logo && event.type() == WSMessage::MouseDown && event.button() == MouseButton::Right && !window.is_blocked_by_modal_window()) { - move_to_front(window); - set_active_window(&window); start_window_resize(window, event); return IterationDecision::Abort; } } if (window.type() == WSWindowType::Normal && title_bar_rect(window.rect()).contains(event.position())) { - if (event.type() == WSMessage::MouseDown) { - move_to_front(window); - set_active_window(&window); - } + if (event.type() == WSMessage::MouseDown) + move_to_front_and_make_active(window); if (close_button_rect_for_window(window.rect()).contains(event.position())) { handle_close_button_mouse_event(window, event); return IterationDecision::Abort; @@ -848,10 +846,8 @@ void WSWindowManager::process_mouse_event(WSMouseEvent& event, WSWindow*& event_ } if (window.rect().contains(event.position())) { - if (window.type() == WSWindowType::Normal && event.type() == WSMessage::MouseDown) { - move_to_front(window); - set_active_window(&window); - } + if (window.type() == WSWindowType::Normal && event.type() == WSMessage::MouseDown) + move_to_front_and_make_active(window); event_window = &window; if (!window.global_cursor_tracking()) { // FIXME: Should we just alter the coordinates of the existing MouseEvent and pass it through? diff --git a/Servers/WindowServer/WSWindowManager.h b/Servers/WindowServer/WSWindowManager.h index 1913229487..62e5a2eb50 100644 --- a/Servers/WindowServer/WSWindowManager.h +++ b/Servers/WindowServer/WSWindowManager.h @@ -49,7 +49,7 @@ public: WSWindow* highlight_window() { return m_highlight_window.ptr(); } void set_highlight_window(WSWindow*); - void move_to_front(WSWindow&); + void move_to_front_and_make_active(WSWindow&); void invalidate_cursor(); void draw_cursor(); diff --git a/Servers/WindowServer/WSWindowSwitcher.cpp b/Servers/WindowServer/WSWindowSwitcher.cpp index 8bee2c382e..27278a0337 100644 --- a/Servers/WindowServer/WSWindowSwitcher.cpp +++ b/Servers/WindowServer/WSWindowSwitcher.cpp @@ -34,10 +34,8 @@ void WSWindowSwitcher::on_key_event(const WSKeyEvent& event) { if (event.type() == WSMessage::KeyUp) { if (event.key() == Key_Logo) { - if (auto* window = selected_window()) { - WSWindowManager::the().set_active_window(window); - WSWindowManager::the().move_to_front(*window); - } + if (auto* window = selected_window()) + WSWindowManager::the().move_to_front_and_make_active(*window); WSWindowManager::the().set_highlight_window(nullptr); hide(); }