From 1374195a0dfeaf0e5a453df744b76e2c598f02b2 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 4 Apr 2019 13:33:09 +0200 Subject: [PATCH] WindowServer: Broadcast the full window list to new WM listener clients. --- Servers/WindowServer/WSWindowManager.cpp | 8 ++++++++ Servers/WindowServer/WSWindowManager.h | 10 ++++++++++ 2 files changed, 18 insertions(+) diff --git a/Servers/WindowServer/WSWindowManager.cpp b/Servers/WindowServer/WSWindowManager.cpp index abd164f20f..c88c1bcab2 100644 --- a/Servers/WindowServer/WSWindowManager.cpp +++ b/Servers/WindowServer/WSWindowManager.cpp @@ -493,6 +493,14 @@ void WSWindowManager::add_window(WSWindow& window) if (m_switcher.is_visible() && window.type() != WSWindowType::WindowSwitcher) m_switcher.refresh(); + if (window.listens_to_wm_events()) { + for_each_window([&window] (WSWindow& other_window) { + if (&window != &other_window && other_window.client()) + WSMessageLoop::the().post_message(window, make(other_window.client()->client_id(), other_window.window_id(), other_window.title(), other_window.rect(), other_window.is_active())); + return IterationDecision::Continue; + }); + } + for_each_window_listening_to_wm_events([&window] (WSWindow& listener) { if (window.client()) WSMessageLoop::the().post_message(listener, make(window.client()->client_id(), window.window_id(), window.title(), window.rect(), window.is_active())); diff --git a/Servers/WindowServer/WSWindowManager.h b/Servers/WindowServer/WSWindowManager.h index e6d99d32bd..b5d4189f15 100644 --- a/Servers/WindowServer/WSWindowManager.h +++ b/Servers/WindowServer/WSWindowManager.h @@ -113,6 +113,7 @@ private: template IterationDecision for_each_visible_window_from_front_to_back(Callback); template IterationDecision for_each_visible_window_from_back_to_front(Callback); template void for_each_window_listening_to_wm_events(Callback); + template void for_each_window(Callback); template void for_each_active_menubar_menu(Callback); void close_current_menu(); virtual void on_message(const WSMessage&) override; @@ -278,3 +279,12 @@ void WSWindowManager::for_each_window_listening_to_wm_events(Callback callback) return; } } + +template +void WSWindowManager::for_each_window(Callback callback) +{ + for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { + if (callback(*window) == IterationDecision::Abort) + return; + } +}