1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:37:43 +00:00

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.
This commit is contained in:
Andreas Kling 2019-03-10 01:07:01 +01:00
parent ed61fdbc32
commit 94df0c1ba6

View file

@ -871,18 +871,29 @@ void WSWindowManager::compose()
return false; return false;
}; };
auto any_opaque_window_above_this_one_contains_rect = [this] (const WSWindow& a_window, const Rect& r) { auto any_opaque_window_above_this_one_contains_rect = [this] (const WSWindow& a_window, const Rect& rect) -> bool {
for (auto* window = a_window.next(); window; window = window->next()) { bool found = false;
if (!window->is_visible()) bool checking = false;
continue; for_each_visible_window_from_back_to_front([&] (WSWindow& window) {
if (window->opacity() < 1.0f) if (&window == &a_window) {
continue; checking = true;
if (window->has_alpha_channel()) return IterationDecision::Continue;
continue; }
if (outer_window_rect(*window).contains(r)) if (!checking)
return true; return IterationDecision::Continue;
} if (!window.is_visible())
return false; 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) { auto any_dirty_rect_intersects_window = [&dirty_rects] (const WSWindow& window) {