From aa045a9fdf4c39bf48a2b875faac3075f82002bf Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Thu, 25 Aug 2022 14:41:33 -0400 Subject: [PATCH] WindowServer: Always restore modal chain when clicking a window Refactors restore helper into move_to_front_and_make_active(). Fixes not bringing all modal children to the front when any modal child or its modeless parent is clicked. --- .../WindowServer/WMConnectionFromClient.cpp | 2 +- Userland/Services/WindowServer/WindowManager.cpp | 16 ++++++---------- Userland/Services/WindowServer/WindowManager.h | 1 - .../Services/WindowServer/WindowSwitcher.cpp | 2 +- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/Userland/Services/WindowServer/WMConnectionFromClient.cpp b/Userland/Services/WindowServer/WMConnectionFromClient.cpp index 49e383907f..f74cf6b037 100644 --- a/Userland/Services/WindowServer/WMConnectionFromClient.cpp +++ b/Userland/Services/WindowServer/WMConnectionFromClient.cpp @@ -63,7 +63,7 @@ void WMConnectionFromClient::set_active_window(i32 client_id, i32 window_id) return; } auto& window = *(*it).value; - WindowManager::the().restore_modal_chain(window); + WindowManager::the().move_to_front_and_make_active(window); } void WMConnectionFromClient::popup_window_menu(i32 client_id, i32 window_id, Gfx::IntPoint const& screen_position) diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 1fed7611c2..61df10906a 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -342,6 +342,12 @@ void WindowManager::add_window(Window& window) void WindowManager::move_to_front_and_make_active(Window& window) { + for_each_window_in_modal_chain(window, [&](auto& w) { + w.set_minimized(false); + w.window_stack().move_to_front(w); + return IterationDecision::Continue; + }); + auto* blocker = window.blocking_modal_window(); if (blocker && !window.is_capturing_input()) { blocker->window_stack().move_to_front(*blocker); @@ -2134,16 +2140,6 @@ void WindowManager::did_popup_a_menu(Badge) set_automatic_cursor_tracking_window(nullptr); } -void WindowManager::restore_modal_chain(Window& window) -{ - for_each_window_in_modal_chain(window, [&](auto& w) { - w.set_minimized(false); - w.window_stack().move_to_front(w); - return IterationDecision::Continue; - }); - move_to_front_and_make_active(window); -} - void WindowManager::minimize_windows(Window& window, bool minimized) { for_each_window_in_modal_chain(window, [&](auto& w) { diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index 4752f4c0af..dad8c6eca7 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -233,7 +233,6 @@ public: void start_menu_doubleclick(Window& window, MouseEvent const& event); bool is_menu_doubleclick(Window& window, MouseEvent const& event) const; - void restore_modal_chain(Window&); void minimize_windows(Window&, bool); void hide_windows(Window&, bool); void maximize_windows(Window&, bool); diff --git a/Userland/Services/WindowServer/WindowSwitcher.cpp b/Userland/Services/WindowServer/WindowSwitcher.cpp index 9b340b92f2..5a3799af18 100644 --- a/Userland/Services/WindowServer/WindowSwitcher.cpp +++ b/Userland/Services/WindowServer/WindowSwitcher.cpp @@ -90,7 +90,7 @@ void WindowSwitcher::on_key_event(KeyEvent const& event) if (event.type() == Event::KeyUp) { if (event.key() == (m_mode == Mode::ShowAllWindows ? Key_Super : Key_Alt)) { if (auto* window = selected_window()) { - WindowManager::the().restore_modal_chain(*window); + WindowManager::the().move_to_front_and_make_active(*window); } WindowManager::the().set_highlight_window(nullptr); hide();