From 94df0c1ba61d8b862acd9adb4410c6ba862122cd Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 10 Mar 2019 01:07:01 +0100 Subject: [PATCH] WindowServer: Fix bug where window content could bleed through menus. We have to iterate using for_each_visible_window_from_back_to_front() if we want every window in the correct order. --- WindowServer/WSWindowManager.cpp | 35 +++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 1a0fed5faff..31c1178e0fe 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -871,18 +871,29 @@ void WSWindowManager::compose() return false; }; - auto any_opaque_window_above_this_one_contains_rect = [this] (const WSWindow& a_window, const Rect& r) { - for (auto* window = a_window.next(); window; window = window->next()) { - if (!window->is_visible()) - continue; - if (window->opacity() < 1.0f) - continue; - if (window->has_alpha_channel()) - continue; - if (outer_window_rect(*window).contains(r)) - return true; - } - return false; + auto any_opaque_window_above_this_one_contains_rect = [this] (const WSWindow& a_window, const Rect& rect) -> bool { + bool found = false; + bool checking = false; + for_each_visible_window_from_back_to_front([&] (WSWindow& window) { + if (&window == &a_window) { + checking = true; + return IterationDecision::Continue; + } + if (!checking) + return IterationDecision::Continue; + if (!window.is_visible()) + return IterationDecision::Continue;; + if (window.opacity() < 1.0f) + return IterationDecision::Continue;; + if (window.has_alpha_channel()) + return IterationDecision::Continue;; + if (outer_window_rect(window).contains(rect)) { + found = true; + return IterationDecision::Abort; + } + return IterationDecision::Continue; + }); + return found; }; auto any_dirty_rect_intersects_window = [&dirty_rects] (const WSWindow& window) {