diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index 567d1968bf..4bddc45eec 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -347,8 +347,8 @@ void WSWindowManager::remove_window(WSWindow& window) invalidate(window); m_windows.remove(&window); m_windows_in_order.remove(&window); - if (!active_window() && !m_windows.is_empty()) - set_active_window(*m_windows.begin()); + if (window.is_active()) + pick_new_active_window(); if (m_switcher.is_visible() && window.type() != WSWindowType::WindowSwitcher) m_switcher.refresh(); @@ -398,6 +398,17 @@ void WSWindowManager::notify_rect_changed(WSWindow& window, const Rect& old_rect void WSWindowManager::notify_minimization_state_changed(WSWindow& window) { tell_wm_listeners_window_state_changed(window); + + if (window.is_active() && window.is_minimized()) + pick_new_active_window(); +} + +void WSWindowManager::pick_new_active_window() +{ + for_each_visible_window_of_type_from_front_to_back(WSWindowType::Normal, [&] (WSWindow& candidate) { + set_active_window(&candidate); + return IterationDecision::Abort; + }); } void WSWindowManager::handle_menu_mouse_event(WSMenu& menu, const WSMouseEvent& event) diff --git a/Servers/WindowServer/WSWindowManager.h b/Servers/WindowServer/WSWindowManager.h index b67466405a..3f7298ea64 100644 --- a/Servers/WindowServer/WSWindowManager.h +++ b/Servers/WindowServer/WSWindowManager.h @@ -129,6 +129,7 @@ private: void tick_clock(); void tell_wm_listeners_window_state_changed(WSWindow&); void tell_wm_listener_about_window(WSWindow& listener, WSWindow&); + void pick_new_active_window(); WSScreen& m_screen; Rect m_screen_rect;