From 191073000efdd41b5e991c481e20dc966e39ea80 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 19 May 2020 19:14:20 +0200 Subject: [PATCH] WindowServer: Remove WindowManager::invalidate(Window) API's Instead, we now tell Windows to invalidate themselves. Window will then pass on the requests to Compositor. My basic idea here is that WindowManager should do window management, dealing with incoming events, moving, resizing, etc. Compositor should deal with painting the window stack in the right order with the least amount of effort. :^) --- Services/WindowServer/ClientConnection.cpp | 4 +- Services/WindowServer/Window.cpp | 20 +++++++++- Services/WindowServer/WindowFrame.cpp | 2 +- Services/WindowServer/WindowManager.cpp | 44 +++++----------------- Services/WindowServer/WindowManager.h | 2 - Services/WindowServer/WindowSwitcher.cpp | 2 +- 6 files changed, 32 insertions(+), 42 deletions(-) diff --git a/Services/WindowServer/ClientConnection.cpp b/Services/WindowServer/ClientConnection.cpp index ae1000f2fb..e476124b9d 100644 --- a/Services/WindowServer/ClientConnection.cpp +++ b/Services/WindowServer/ClientConnection.cpp @@ -471,7 +471,7 @@ void ClientConnection::destroy_window(Window& window, Vector& destroyed_win if (window.type() == WindowType::MenuApplet) AppletManager::the().remove_applet(window); - WindowManager::the().invalidate(window); + window.invalidate(); remove_child(window); m_windows.remove(window.window_id()); } @@ -520,7 +520,7 @@ void ClientConnection::handle(const Messages::WindowServer::DidFinishPainting& m } auto& window = *(*it).value; for (auto& rect : message.rects()) - WindowManager::the().invalidate(window, rect); + window.invalidate(rect); WindowSwitcher::the().refresh_if_needed(); } diff --git a/Services/WindowServer/Window.cpp b/Services/WindowServer/Window.cpp index 6f33fb1e3b..874f518ef5 100644 --- a/Services/WindowServer/Window.cpp +++ b/Services/WindowServer/Window.cpp @@ -25,7 +25,9 @@ */ #include "Window.h" +#include "AppletManager.h" #include "ClientConnection.h" +#include "Compositor.h" #include "Event.h" #include "EventLoop.h" #include "Screen.h" @@ -347,12 +349,26 @@ void Window::set_visible(bool b) void Window::invalidate() { - WindowManager::the().invalidate(*this); + Compositor::the().invalidate(frame().rect()); } void Window::invalidate(const Gfx::Rect& rect) { - WindowManager::the().invalidate(*this, rect); + if (type() == WindowType::MenuApplet) { + AppletManager::the().invalidate_applet(*this, rect); + return; + } + + if (rect.is_empty()) { + invalidate(); + return; + } + auto outer_rect = frame().rect(); + auto inner_rect = rect; + inner_rect.move_by(position()); + // FIXME: This seems slightly wrong; the inner rect shouldn't intersect the border part of the outer rect. + inner_rect.intersect(outer_rect); + Compositor::the().invalidate(inner_rect); } bool Window::is_active() const diff --git a/Services/WindowServer/WindowFrame.cpp b/Services/WindowServer/WindowFrame.cpp index 2d6b8cad73..8d102032cf 100644 --- a/Services/WindowServer/WindowFrame.cpp +++ b/Services/WindowServer/WindowFrame.cpp @@ -314,7 +314,7 @@ Gfx::Rect WindowFrame::rect() const void WindowFrame::invalidate_title_bar() { - WindowManager::the().invalidate(title_bar_rect().translated(rect().location())); + Compositor::the().invalidate(title_bar_rect().translated(rect().location())); } void WindowFrame::notify_window_rect_changed(const Gfx::Rect& old_rect, const Gfx::Rect& new_rect) diff --git a/Services/WindowServer/WindowManager.cpp b/Services/WindowServer/WindowManager.cpp index 500e026c58..7924d237ae 100644 --- a/Services/WindowServer/WindowManager.cpp +++ b/Services/WindowServer/WindowManager.cpp @@ -207,7 +207,7 @@ void WindowManager::move_to_front_and_make_active(Window& window) return; if (m_windows_in_order.tail() != &window) - invalidate(window); + window.invalidate(); m_windows_in_order.remove(&window); m_windows_in_order.append(&window); @@ -229,7 +229,7 @@ void WindowManager::move_to_front_and_make_active(Window& window) void WindowManager::remove_window(Window& window) { - invalidate(window); + window.invalidate(); m_windows_in_order.remove(&window); if (window.is_active()) pick_new_active_window(); @@ -380,7 +380,7 @@ void WindowManager::start_window_move(Window& window, const MouseEvent& event) m_move_window = window.make_weak_ptr(); m_move_origin = event.position(); m_move_window_origin = window.position(); - invalidate(window); + window.invalidate(); } void WindowManager::start_window_resize(Window& window, const Gfx::Point& position, MouseButton button) @@ -411,7 +411,7 @@ void WindowManager::start_window_resize(Window& window, const Gfx::Point& positi m_resize_origin = position; m_resize_window_original_rect = window.rect(); - invalidate(window); + window.invalidate(); } void WindowManager::start_window_resize(Window& window, const MouseEvent& event) @@ -428,7 +428,7 @@ bool WindowManager::process_ongoing_window_move(MouseEvent& event, Window*& hove dbg() << "[WM] Finish moving Window{" << m_move_window << "}"; #endif - invalidate(*m_move_window); + m_move_window->invalidate(); if (m_move_window->rect().contains(event.position())) hovered_window = m_move_window; if (m_move_window->is_resizable()) { @@ -505,7 +505,7 @@ bool WindowManager::process_ongoing_window_resize(const MouseEvent& event, Windo dbg() << "[WM] Finish resizing Window{" << m_resize_window << "}"; #endif Core::EventLoop::current().post_event(*m_resize_window, make(m_resize_window->rect(), m_resize_window->rect())); - invalidate(*m_resize_window); + m_resize_window->invalidate(); if (m_resize_window->rect().contains(event.position())) hovered_window = m_resize_window; m_resize_window = nullptr; @@ -1006,10 +1006,10 @@ void WindowManager::set_highlight_window(Window* window) if (window == m_highlight_window) return; if (auto* previous_highlight_window = m_highlight_window.ptr()) - invalidate(*previous_highlight_window); + previous_highlight_window->invalidate(); m_highlight_window = window ? window->make_weak_ptr() : nullptr; if (m_highlight_window) - invalidate(*m_highlight_window); + m_highlight_window->invalidate(); } static bool window_type_can_become_active(WindowType type) @@ -1036,7 +1036,7 @@ void WindowManager::set_active_window(Window* window) if (previously_active_window) { previously_active_client = previously_active_window->client(); Core::EventLoop::current().post_event(*previously_active_window, make(Event::WindowDeactivated)); - invalidate(*previously_active_window); + previously_active_window->invalidate(); m_active_window = nullptr; m_active_input_window = nullptr; tell_wm_listeners_window_state_changed(*previously_active_window); @@ -1046,7 +1046,7 @@ void WindowManager::set_active_window(Window* window) m_active_window = window->make_weak_ptr(); active_client = m_active_window->client(); Core::EventLoop::current().post_event(*m_active_window, make(Event::WindowActivated)); - invalidate(*m_active_window); + m_active_window->invalidate(); auto* client = window->client(); ASSERT(client); @@ -1088,30 +1088,6 @@ void WindowManager::invalidate(const Gfx::Rect& rect) Compositor::the().invalidate(rect); } -void WindowManager::invalidate(const Window& window) -{ - invalidate(window.frame().rect()); -} - -void WindowManager::invalidate(const Window& window, const Gfx::Rect& rect) -{ - if (window.type() == WindowType::MenuApplet) { - AppletManager::the().invalidate_applet(window, rect); - return; - } - - if (rect.is_empty()) { - invalidate(window); - return; - } - auto outer_rect = window.frame().rect(); - auto inner_rect = rect; - inner_rect.move_by(window.position()); - // FIXME: This seems slightly wrong; the inner rect shouldn't intersect the border part of the outer rect. - inner_rect.intersect(outer_rect); - invalidate(inner_rect); -} - const ClientConnection* WindowManager::active_client() const { if (m_active_window) diff --git a/Services/WindowServer/WindowManager.h b/Services/WindowServer/WindowManager.h index 0a561ab157..a3bb68d084 100644 --- a/Services/WindowServer/WindowManager.h +++ b/Services/WindowServer/WindowManager.h @@ -130,8 +130,6 @@ public: const Cursor& move_cursor() const { return *m_move_cursor; } const Cursor& drag_cursor() const { return *m_drag_cursor; } - void invalidate(const Window&); - void invalidate(const Window&, const Gfx::Rect&); void invalidate(const Gfx::Rect&); void invalidate(); void flush(const Gfx::Rect&); diff --git a/Services/WindowServer/WindowSwitcher.cpp b/Services/WindowServer/WindowSwitcher.cpp index 8a214ee52b..bd4170ce64 100644 --- a/Services/WindowServer/WindowSwitcher.cpp +++ b/Services/WindowServer/WindowSwitcher.cpp @@ -162,7 +162,7 @@ void WindowSwitcher::select_window_at_index(int index) void WindowSwitcher::redraw() { draw(); - WindowManager::the().invalidate(m_rect); + Compositor::the().invalidate(m_rect); } Gfx::Rect WindowSwitcher::item_rect(int index) const