From 96155009ddd7bba924e1d8fde2d28b7e32896750 Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 5 Jul 2021 10:53:09 -0600 Subject: [PATCH] WindowServer: Fix crash removing modal windows Calling Window::is_modal requires the window to be on a window stack, so we need to check this before removing it from the window stack. --- Userland/Services/WindowServer/WindowManager.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 9d548eed80..70572246c1 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -395,6 +395,7 @@ void WindowManager::remove_window(Window& window) check_hide_geometry_overlay(window); auto* active = active_window(); auto* active_input = active_input_window(); + bool was_modal = window.is_modal(); // This requires the window to be on a window stack still! window.window_stack().remove(window); if (active == &window || active_input == &window || (active && window.is_descendant_of(*active)) || (active_input && active_input != active && window.is_descendant_of(*active_input))) pick_new_active_window(&window); @@ -406,10 +407,10 @@ void WindowManager::remove_window(Window& window) Compositor::the().invalidate_occlusions(); - for_each_window_manager([&window](WMClientConnection& conn) { + for_each_window_manager([&](WMClientConnection& conn) { if (conn.window_id() < 0 || !(conn.event_mask() & WMEventMask::WindowRemovals)) return IterationDecision::Continue; - if (!window.is_internal() && !window.is_modal()) + if (!window.is_internal() && !was_modal) conn.async_window_removed(conn.window_id(), window.client_id(), window.window_id()); return IterationDecision::Continue; });