diff --git a/Userland/Services/WindowServer/WMConnectionFromClient.cpp b/Userland/Services/WindowServer/WMConnectionFromClient.cpp index df213a5047..49e383907f 100644 --- a/Userland/Services/WindowServer/WMConnectionFromClient.cpp +++ b/Userland/Services/WindowServer/WMConnectionFromClient.cpp @@ -63,8 +63,7 @@ void WMConnectionFromClient::set_active_window(i32 client_id, i32 window_id) return; } auto& window = *(*it).value; - WindowManager::the().minimize_windows(window, false); - WindowManager::the().move_to_front_and_make_active(window); + WindowManager::the().restore_modal_chain(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 418b827cf0..90f014c22b 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -2124,6 +2124,16 @@ 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 339beaa00d..37c919b195 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -233,6 +233,7 @@ 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 f62968cf3f..9b340b92f2 100644 --- a/Userland/Services/WindowServer/WindowSwitcher.cpp +++ b/Userland/Services/WindowServer/WindowSwitcher.cpp @@ -90,8 +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()) { - window->set_minimized(false); - WindowManager::the().move_to_front_and_make_active(*window); + WindowManager::the().restore_modal_chain(*window); } WindowManager::the().set_highlight_window(nullptr); hide(); @@ -227,7 +226,7 @@ void WindowSwitcher::refresh() auto add_window_stack_windows = [&](WindowStack& window_stack) { window_stack.for_each_window_of_type_from_front_to_back( WindowType::Normal, [&](Window& window) { - if (window.is_frameless()) + if (window.is_frameless() || window.is_modal()) return IterationDecision::Continue; ++window_count; longest_title_width = max(longest_title_width, wm.font().width(window.computed_title()));