فهرست منبع

WindowServer: Keep track of which WindowStack a Window is part of

Each Window now knows which WindowStack it's part of. We call this the
Window::outer_stack(), in preparation for supporting inner stacks. :^)
Andreas Kling 4 سال پیش
والد
کامیت
2b0e0b602c

+ 6 - 0
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>, 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<int> m_progress;
     bool m_should_show_menubar { true };
+    WindowStack* m_outer_stack { nullptr };
 
 public:
     using List = IntrusiveList<Window, RawPtr<Window>, &Window::m_list_node>;

+ 1 - 1
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<ResizeEvent>(Screen::the().rect()));

+ 4 - 0
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)