From 5aa9f128fca5a377d88323e7e4a5dc57efdae547 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 9 May 2021 21:18:34 +0200 Subject: [PATCH] WindowServer: Simplify the way we update items in the window menu Instead of trying to update only the little bit that changes, let's have a function that updates all the window menu items in one go. It's just a couple of string and boolean assignment, and the real cost is performing the subsequent menu redraw, which remains the same. --- Userland/Services/WindowServer/Window.cpp | 37 ++++++++++------------- Userland/Services/WindowServer/Window.h | 8 +---- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/Userland/Services/WindowServer/Window.cpp b/Userland/Services/WindowServer/Window.cpp index 1a55d476dd..3168b7d292 100644 --- a/Userland/Services/WindowServer/Window.cpp +++ b/Userland/Services/WindowServer/Window.cpp @@ -245,20 +245,16 @@ void Window::handle_mouse_event(const MouseEvent& event) } } -void Window::update_menu_item_text(PopupMenuItem item) +void Window::update_window_menu_items() { - if (m_window_menu) { - m_window_menu->item((int)item).set_text(item == PopupMenuItem::Minimize ? (m_minimized ? "Unminimize" : "Minimize") : (m_maximized ? "Restore" : "Maximize")); - m_window_menu->redraw(); - } -} + if (!m_window_menu) + return; -void Window::update_menu_item_enabled(PopupMenuItem item) -{ - if (m_window_menu) { - m_window_menu->item((int)item).set_enabled(item == PopupMenuItem::Minimize ? m_minimizable : m_resizable); - m_window_menu->redraw(); - } + m_window_menu_minimize_item->set_text(m_minimized ? "&Unminimize" : "Mi&nimize"); + m_window_menu_minimize_item->set_enabled(m_minimizable); + + m_window_menu_maximize_item->set_text(m_maximized ? "&Restore" : "Ma&ximize"); + m_window_menu_maximize_item->set_enabled(m_resizable); } void Window::set_minimized(bool minimized) @@ -268,7 +264,7 @@ void Window::set_minimized(bool minimized) if (minimized && !m_minimizable) return; m_minimized = minimized; - update_menu_item_text(PopupMenuItem::Minimize); + update_window_menu_items(); Compositor::the().invalidate_occlusions(); Compositor::the().invalidate_screen(frame().render_rect()); if (!blocking_modal_window()) @@ -283,7 +279,7 @@ void Window::set_minimizable(bool minimizable) if (m_minimizable == minimizable) return; m_minimizable = minimizable; - update_menu_item_enabled(PopupMenuItem::Minimize); + update_window_menu_items(); // TODO: Hide/show (or alternatively change enabled state of) window minimize button dynamically depending on value of m_minimizable } @@ -353,7 +349,7 @@ void Window::set_maximized(bool maximized, Optional fixed_point) return; m_tiled = WindowTileType::None; m_maximized = maximized; - update_menu_item_text(PopupMenuItem::Maximize); + update_window_menu_items(); if (maximized) { m_unmaximized_rect = m_rect; set_rect(WindowManager::the().maximized_window_rect(*this)); @@ -390,7 +386,7 @@ void Window::set_resizable(bool resizable) if (m_resizable == resizable) return; m_resizable = resizable; - update_menu_item_enabled(PopupMenuItem::Maximize); + update_window_menu_items(); // TODO: Hide/show (or alternatively change enabled state of) window maximize button dynamically depending on value of is_resizable() } @@ -635,11 +631,11 @@ void Window::ensure_window_menu() m_window_menu = Menu::construct(nullptr, -1, "(Window Menu)"); m_window_menu->set_window_menu_of(*this); - auto minimize_item = make(*m_window_menu, (unsigned)WindowMenuAction::MinimizeOrUnminimize, m_minimized ? "&Unminimize" : "Mi&nimize"); + auto minimize_item = make(*m_window_menu, (unsigned)WindowMenuAction::MinimizeOrUnminimize, ""); m_window_menu_minimize_item = minimize_item.ptr(); m_window_menu->add_item(move(minimize_item)); - auto maximize_item = make(*m_window_menu, (unsigned)WindowMenuAction::MaximizeOrRestore, m_maximized ? "&Restore" : "Ma&ximize"); + auto maximize_item = make(*m_window_menu, (unsigned)WindowMenuAction::MaximizeOrRestore, ""); m_window_menu_maximize_item = maximize_item.ptr(); m_window_menu->add_item(move(maximize_item)); @@ -656,12 +652,11 @@ void Window::ensure_window_menu() m_window_menu_close_item->set_default(true); m_window_menu->add_item(move(close_item)); - m_window_menu->item((int)PopupMenuItem::Minimize).set_enabled(m_minimizable); - m_window_menu->item((int)PopupMenuItem::Maximize).set_enabled(m_resizable); - m_window_menu->on_item_activation = [&](auto& item) { handle_window_menu_action(static_cast(item.identifier())); }; + + update_window_menu_items(); } } diff --git a/Userland/Services/WindowServer/Window.h b/Userland/Services/WindowServer/Window.h index a1785bf648..c66f9a921f 100644 --- a/Userland/Services/WindowServer/Window.h +++ b/Userland/Services/WindowServer/Window.h @@ -46,11 +46,6 @@ enum class WindowTileType { BottomRight }; -enum class PopupMenuItem { - Minimize = 0, - Maximize, -}; - enum class WindowMenuAction { MinimizeOrUnminimize = 0, MaximizeOrRestore, @@ -327,11 +322,10 @@ private: virtual void event(Core::Event&) override; void handle_mouse_event(const MouseEvent&); void handle_keydown_event(const KeyEvent&); - void update_menu_item_text(PopupMenuItem item); - void update_menu_item_enabled(PopupMenuItem item); void add_child_window(Window&); void add_accessory_window(Window&); void ensure_window_menu(); + void update_window_menu_items(); void modal_unparented(); ClientConnection* m_client { nullptr };