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

WindowServer: Use window menu actions when clicking frame buttons

This keeps the minimize/maximize/restore/close implementation
consistent with the window menu actions.
This commit is contained in:
Tom 2021-04-27 21:24:32 -06:00 committed by Linus Groh
parent 7345b502ab
commit 31c3382577
4 changed files with 54 additions and 29 deletions

View file

@ -41,15 +41,32 @@ public:
const MenuItem& item(int index) const { return m_items.at(index); } const MenuItem& item(int index) const { return m_items.at(index); }
MenuItem& item(int index) { return m_items.at(index); } MenuItem& item(int index) { return m_items.at(index); }
MenuItem* item_by_identifier(unsigned identifier)
{
MenuItem* found_item = nullptr;
for_each_item([&](auto& item) {
if (item.identifier() == identifier) {
found_item = &item;
return IterationDecision::Break;
}
return IterationDecision::Continue;
});
return found_item;
}
void add_item(NonnullOwnPtr<MenuItem>); void add_item(NonnullOwnPtr<MenuItem>);
String name() const { return m_name; } String name() const { return m_name; }
template<typename Callback> template<typename Callback>
void for_each_item(Callback callback) const IterationDecision for_each_item(Callback callback)
{ {
for (auto& item : m_items) for (auto& item : m_items) {
callback(item); IterationDecision decision = callback(item);
if (decision != IterationDecision::Continue)
return decision;
}
return IterationDecision::Continue;
} }
Gfx::IntRect rect_in_window_menubar() const { return m_rect_in_window_menubar; } Gfx::IntRect rect_in_window_menubar() const { return m_rect_in_window_menubar; }

View file

@ -656,33 +656,40 @@ void Window::ensure_window_menu()
m_window_menu->item((int)PopupMenuItem::Maximize).set_enabled(m_resizable); 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) {
switch (static_cast<WindowMenuAction>(item.identifier())) { handle_window_menu_action(static_cast<WindowMenuAction>(item.identifier()));
case WindowMenuAction::MinimizeOrUnminimize:
WindowManager::the().minimize_windows(*this, !m_minimized);
if (!m_minimized)
WindowManager::the().move_to_front_and_make_active(*this);
break;
case WindowMenuAction::MaximizeOrRestore:
WindowManager::the().maximize_windows(*this, !m_maximized);
WindowManager::the().move_to_front_and_make_active(*this);
break;
case WindowMenuAction::Close:
request_close();
break;
case WindowMenuAction::ToggleMenubarVisibility:
frame().invalidate();
item.set_checked(!item.is_checked());
m_should_show_menubar = item.is_checked();
frame().invalidate();
recalculate_rect();
Compositor::the().invalidate_occlusions();
Compositor::the().invalidate_screen();
break;
}
}; };
} }
} }
void Window::handle_window_menu_action(WindowMenuAction action)
{
switch (action) {
case WindowMenuAction::MinimizeOrUnminimize:
WindowManager::the().minimize_windows(*this, !m_minimized);
if (!m_minimized)
WindowManager::the().move_to_front_and_make_active(*this);
break;
case WindowMenuAction::MaximizeOrRestore:
WindowManager::the().maximize_windows(*this, !m_maximized);
WindowManager::the().move_to_front_and_make_active(*this);
break;
case WindowMenuAction::Close:
request_close();
break;
case WindowMenuAction::ToggleMenubarVisibility: {
auto& item = *m_window_menu->item_by_identifier((unsigned)action);
frame().invalidate();
item.set_checked(!item.is_checked());
m_should_show_menubar = item.is_checked();
frame().invalidate();
recalculate_rect();
Compositor::the().invalidate_occlusions();
Compositor::the().invalidate_screen();
break;
}
}
}
void Window::popup_window_menu(const Gfx::IntPoint& position, WindowMenuDefaultAction default_action) void Window::popup_window_menu(const Gfx::IntPoint& position, WindowMenuDefaultAction default_action)
{ {
ensure_window_menu(); ensure_window_menu();

View file

@ -77,6 +77,7 @@ public:
virtual ~Window() override; virtual ~Window() override;
void popup_window_menu(const Gfx::IntPoint&, WindowMenuDefaultAction); void popup_window_menu(const Gfx::IntPoint&, WindowMenuDefaultAction);
void handle_window_menu_action(WindowMenuAction);
void window_menu_activate_default(); void window_menu_activate_default();
void request_close(); void request_close();

View file

@ -65,14 +65,14 @@ WindowFrame::WindowFrame(Window& window)
: m_window(window) : m_window(window)
{ {
auto button = make<Button>(*this, [this](auto&) { auto button = make<Button>(*this, [this](auto&) {
m_window.request_close(); m_window.handle_window_menu_action(WindowMenuAction::Close);
}); });
m_close_button = button.ptr(); m_close_button = button.ptr();
m_buttons.append(move(button)); m_buttons.append(move(button));
if (window.is_resizable()) { if (window.is_resizable()) {
auto button = make<Button>(*this, [this](auto&) { auto button = make<Button>(*this, [this](auto&) {
WindowManager::the().maximize_windows(m_window, !m_window.is_maximized()); m_window.handle_window_menu_action(WindowMenuAction::MaximizeOrRestore);
}); });
button->on_middle_click = [&](auto&) { button->on_middle_click = [&](auto&) {
m_window.set_vertically_maximized(); m_window.set_vertically_maximized();
@ -83,7 +83,7 @@ WindowFrame::WindowFrame(Window& window)
if (window.is_minimizable()) { if (window.is_minimizable()) {
auto button = make<Button>(*this, [this](auto&) { auto button = make<Button>(*this, [this](auto&) {
WindowManager::the().minimize_windows(m_window, true); m_window.handle_window_menu_action(WindowMenuAction::MinimizeOrUnminimize);
}); });
m_minimize_button = button.ptr(); m_minimize_button = button.ptr();
m_buttons.append(move(button)); m_buttons.append(move(button));