Browse Source

WindowServer: Pick a new active window when the active window is minimized.

Also use the same logic when the active window is removed.
Andreas Kling 6 years ago
parent
commit
d89d759c36
2 changed files with 14 additions and 2 deletions
  1. 13 2
      Servers/WindowServer/WSWindowManager.cpp
  2. 1 0
      Servers/WindowServer/WSWindowManager.h

+ 13 - 2
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)

+ 1 - 0
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;