From d0dbb014a027b868ad2a76a4544e31e27704f541 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Thu, 3 Jun 2021 03:23:01 -0700 Subject: [PATCH] WindowServer: Switch Window to IntrusiveList from InlineLinkedList Another small step towards unifying IntrusiveList / InlineLinkedList. --- Userland/Services/WindowServer/Window.h | 11 +++---- .../Services/WindowServer/WindowManager.cpp | 22 +++++++------ .../Services/WindowServer/WindowManager.h | 32 +++++++++++-------- 3 files changed, 36 insertions(+), 29 deletions(-) diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index 401607e056..08189b0460 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -64,9 +64,7 @@ enum class WindowMenuDefaultAction { Restore }; -class Window final - : public Core::Object - , public InlineLinkedListNode { +class Window final : public Core::Object { C_OBJECT(Window); public: @@ -264,9 +262,7 @@ public: Gfx::IntRect tiled_rect(WindowTileType) const; void recalculate_rect(); - // For InlineLinkedList. - Window* m_next { nullptr }; - Window* m_prev { nullptr }; + IntrusiveListNode m_list_node; void detach_client(Badge); @@ -399,6 +395,9 @@ private: int m_minimize_animation_step { -1 }; Optional m_progress; bool m_should_show_menubar { true }; + +public: + using List = IntrusiveList, &Window::m_list_node>; }; } diff --git a/Userland/Services/WindowServer/WindowManager.cpp b/Userland/Services/WindowServer/WindowManager.cpp index 694e6fb672..ba0fe5fdf1 100644 --- a/Userland/Services/WindowServer/WindowManager.cpp +++ b/Userland/Services/WindowServer/WindowManager.cpp @@ -176,7 +176,7 @@ void WindowManager::add_window(Window& window) { bool is_first_window = m_windows_in_order.is_empty(); - m_windows_in_order.append(&window); + m_windows_in_order.append(window); if (window.is_fullscreen()) { Core::EventLoop::current().post_event(window, make(Screen::the().rect())); @@ -228,10 +228,10 @@ void WindowManager::move_to_front_and_make_active(Window& window) void WindowManager::do_move_to_front(Window& window, bool make_active, bool make_input) { - if (m_windows_in_order.tail() != &window) + if (m_windows_in_order.last() != &window) window.invalidate(); - m_windows_in_order.remove(&window); - m_windows_in_order.append(&window); + m_windows_in_order.remove(window); + m_windows_in_order.append(window); if (make_active) set_active_window(&window, make_input); @@ -252,7 +252,7 @@ void WindowManager::do_move_to_front(Window& window, bool make_active, bool make void WindowManager::remove_window(Window& window) { - m_windows_in_order.remove(&window); + m_windows_in_order.remove(window); auto* active = active_window(); auto* active_input = active_input_window(); if (active == &window || active_input == &window || (active && window.is_descendant_of(*active)) || (active_input && active_input != active && window.is_descendant_of(*active_input))) @@ -1092,13 +1092,15 @@ void WindowManager::process_mouse_event(MouseEvent& event, Window*& hovered_wind set_active_window(nullptr); } - for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { - if (received_mouse_event == window) + auto reverse_iterator = m_windows_in_order.rbegin(); + for (; reverse_iterator != m_windows_in_order.rend(); ++reverse_iterator) { + auto& window = *reverse_iterator; + if (received_mouse_event == &window) continue; - if (!window->global_cursor_tracking() || !window->is_visible() || window->is_minimized() || window->blocking_modal_window()) + if (!window.global_cursor_tracking() || !window.is_visible() || window.is_minimized() || window.blocking_modal_window()) continue; - auto translated_event = event.translated(-window->position()); - deliver_mouse_event(*window, translated_event, false); + auto translated_event = event.translated(-window.position()); + deliver_mouse_event(window, translated_event, false); } if (event_window_with_frame != m_resize_candidate.ptr()) diff --git a/Userland/Services/WindowServer/WindowManager.h b/Userland/Services/WindowServer/WindowManager.h index 36b7378e40..4bd6ceabc7 100644 --- a/Userland/Services/WindowServer/WindowManager.h +++ b/Userland/Services/WindowServer/WindowManager.h @@ -284,7 +284,7 @@ private: RefPtr m_wait_cursor; RefPtr m_crosshair_cursor; - InlineLinkedList m_windows_in_order; + Window::List m_windows_in_order; struct DoubleClickInfo { struct ClickMetadata { @@ -411,16 +411,18 @@ IterationDecision WindowManager::for_each_visible_window_of_type_from_front_to_b return IterationDecision::Break; } - for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { - if (!window->is_visible()) + auto reverse_iterator = m_windows_in_order.rbegin(); + for (; reverse_iterator != m_windows_in_order.rend(); ++reverse_iterator) { + auto& window = *reverse_iterator; + if (!window.is_visible()) continue; - if (window->is_minimized()) + if (window.is_minimized()) continue; - if (window->type() != type) + if (window.type() != type) continue; - if (!ignore_highlight && window == m_highlight_window) + if (!ignore_highlight && &window == m_highlight_window) continue; - if (callback(*window) == IterationDecision::Break) + if (callback(window) == IterationDecision::Break) return IterationDecision::Break; } return IterationDecision::Continue; @@ -463,8 +465,10 @@ void WindowManager::for_each_window_manager(Callback callback) template void WindowManager::for_each_window(Callback callback) { - for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { - if (callback(*window) == IterationDecision::Break) + auto reverse_iterator = m_windows_in_order.rbegin(); + for (; reverse_iterator != m_windows_in_order.rend(); ++reverse_iterator) { + auto& window = *reverse_iterator; + if (callback(window) == IterationDecision::Break) return; } } @@ -477,12 +481,14 @@ IterationDecision WindowManager::for_each_window_of_type_from_front_to_back(Wind return IterationDecision::Break; } - for (auto* window = m_windows_in_order.tail(); window; window = window->prev()) { - if (window->type() != type) + auto reverse_iterator = m_windows_in_order.rbegin(); + for (; reverse_iterator != m_windows_in_order.rend(); ++reverse_iterator) { + auto& window = *reverse_iterator; + if (window.type() != type) continue; - if (!ignore_highlight && window == m_highlight_window) + if (!ignore_highlight && &window == m_highlight_window) continue; - if (callback(*window) == IterationDecision::Break) + if (callback(window) == IterationDecision::Break) return IterationDecision::Break; } return IterationDecision::Continue;