diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index d49ca8572b..c45b982054 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -25,6 +25,7 @@ class Menu; class Menubar; class MenuItem; class MouseEvent; +class WindowStack; enum WMEventMask { WindowRectChanges = 1 << 0, @@ -313,6 +314,10 @@ public: const Menubar* menubar() const { return m_menubar; } void set_menubar(Menubar*); + WindowStack* outer_stack() { return m_outer_stack; } + WindowStack const* outer_stack() const { return m_outer_stack; } + void set_outer_stack(Badge, WindowStack* stack) { m_outer_stack = stack; } + private: Window(ClientConnection&, WindowType, int window_id, bool modal, bool minimizable, bool frameless, bool resizable, bool fullscreen, bool accessory, Window* parent_window = nullptr); Window(Core::Object&, WindowType); @@ -394,6 +399,7 @@ private: int m_minimize_animation_step { -1 }; Optional m_progress; bool m_should_show_menubar { true }; + WindowStack* m_outer_stack { nullptr }; public: using List = IntrusiveList, &Window::m_list_node>; diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 5c566c7773..7382051b53 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -167,7 +167,7 @@ void WindowManager::add_window(Window& window) { bool is_first_window = m_window_stack.is_empty(); - m_window_stack.windows().append(window); + m_window_stack.add(window); if (window.is_fullscreen()) { Core::EventLoop::current().post_event(window, make(Screen::the().rect())); diff --git a/Userland/Services/WindowServer/WindowStack.cpp b/Userland/Services/WindowServer/WindowStack.cpp index 324e11fa4c..8d610ff5e4 100644 --- a/Userland/Services/WindowServer/WindowStack.cpp +++ b/Userland/Services/WindowServer/WindowStack.cpp @@ -18,12 +18,16 @@ WindowStack::~WindowStack() void WindowStack::add(Window& window) { + VERIFY(window.outer_stack() == nullptr); m_windows.append(window); + window.set_outer_stack({}, this); } void WindowStack::remove(Window& window) { + VERIFY(window.outer_stack() == this); m_windows.remove(window); + window.set_outer_stack({}, nullptr); } void WindowStack::move_to_front(Window& window)