1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 18:47:44 +00:00

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.
This commit is contained in:
Andreas Kling 2021-05-09 21:18:34 +02:00
parent 62b76a7c95
commit 5aa9f128fc
2 changed files with 17 additions and 28 deletions

View file

@ -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) { if (!m_window_menu)
m_window_menu->item((int)item).set_text(item == PopupMenuItem::Minimize ? (m_minimized ? "Unminimize" : "Minimize") : (m_maximized ? "Restore" : "Maximize")); return;
m_window_menu->redraw();
}
}
void Window::update_menu_item_enabled(PopupMenuItem item) m_window_menu_minimize_item->set_text(m_minimized ? "&Unminimize" : "Mi&nimize");
{ m_window_menu_minimize_item->set_enabled(m_minimizable);
if (m_window_menu) {
m_window_menu->item((int)item).set_enabled(item == PopupMenuItem::Minimize ? m_minimizable : m_resizable); m_window_menu_maximize_item->set_text(m_maximized ? "&Restore" : "Ma&ximize");
m_window_menu->redraw(); m_window_menu_maximize_item->set_enabled(m_resizable);
}
} }
void Window::set_minimized(bool minimized) void Window::set_minimized(bool minimized)
@ -268,7 +264,7 @@ void Window::set_minimized(bool minimized)
if (minimized && !m_minimizable) if (minimized && !m_minimizable)
return; return;
m_minimized = minimized; m_minimized = minimized;
update_menu_item_text(PopupMenuItem::Minimize); update_window_menu_items();
Compositor::the().invalidate_occlusions(); Compositor::the().invalidate_occlusions();
Compositor::the().invalidate_screen(frame().render_rect()); Compositor::the().invalidate_screen(frame().render_rect());
if (!blocking_modal_window()) if (!blocking_modal_window())
@ -283,7 +279,7 @@ void Window::set_minimizable(bool minimizable)
if (m_minimizable == minimizable) if (m_minimizable == minimizable)
return; return;
m_minimizable = minimizable; 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 // 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<Gfx::IntPoint> fixed_point)
return; return;
m_tiled = WindowTileType::None; m_tiled = WindowTileType::None;
m_maximized = maximized; m_maximized = maximized;
update_menu_item_text(PopupMenuItem::Maximize); update_window_menu_items();
if (maximized) { if (maximized) {
m_unmaximized_rect = m_rect; m_unmaximized_rect = m_rect;
set_rect(WindowManager::the().maximized_window_rect(*this)); set_rect(WindowManager::the().maximized_window_rect(*this));
@ -390,7 +386,7 @@ void Window::set_resizable(bool resizable)
if (m_resizable == resizable) if (m_resizable == resizable)
return; return;
m_resizable = resizable; 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() // 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 = Menu::construct(nullptr, -1, "(Window Menu)");
m_window_menu->set_window_menu_of(*this); m_window_menu->set_window_menu_of(*this);
auto minimize_item = make<MenuItem>(*m_window_menu, (unsigned)WindowMenuAction::MinimizeOrUnminimize, m_minimized ? "&Unminimize" : "Mi&nimize"); auto minimize_item = make<MenuItem>(*m_window_menu, (unsigned)WindowMenuAction::MinimizeOrUnminimize, "");
m_window_menu_minimize_item = minimize_item.ptr(); m_window_menu_minimize_item = minimize_item.ptr();
m_window_menu->add_item(move(minimize_item)); m_window_menu->add_item(move(minimize_item));
auto maximize_item = make<MenuItem>(*m_window_menu, (unsigned)WindowMenuAction::MaximizeOrRestore, m_maximized ? "&Restore" : "Ma&ximize"); auto maximize_item = make<MenuItem>(*m_window_menu, (unsigned)WindowMenuAction::MaximizeOrRestore, "");
m_window_menu_maximize_item = maximize_item.ptr(); m_window_menu_maximize_item = maximize_item.ptr();
m_window_menu->add_item(move(maximize_item)); 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_close_item->set_default(true);
m_window_menu->add_item(move(close_item)); 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) { m_window_menu->on_item_activation = [&](auto& item) {
handle_window_menu_action(static_cast<WindowMenuAction>(item.identifier())); handle_window_menu_action(static_cast<WindowMenuAction>(item.identifier()));
}; };
update_window_menu_items();
} }
} }

View file

@ -46,11 +46,6 @@ enum class WindowTileType {
BottomRight BottomRight
}; };
enum class PopupMenuItem {
Minimize = 0,
Maximize,
};
enum class WindowMenuAction { enum class WindowMenuAction {
MinimizeOrUnminimize = 0, MinimizeOrUnminimize = 0,
MaximizeOrRestore, MaximizeOrRestore,
@ -327,11 +322,10 @@ private:
virtual void event(Core::Event&) override; virtual void event(Core::Event&) override;
void handle_mouse_event(const MouseEvent&); void handle_mouse_event(const MouseEvent&);
void handle_keydown_event(const KeyEvent&); 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_child_window(Window&);
void add_accessory_window(Window&); void add_accessory_window(Window&);
void ensure_window_menu(); void ensure_window_menu();
void update_window_menu_items();
void modal_unparented(); void modal_unparented();
ClientConnection* m_client { nullptr }; ClientConnection* m_client { nullptr };