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

WindowServer+LibGUI: Notify clients when menus become visible/hidden

This will allow clients to react to these events.
This commit is contained in:
Andreas Kling 2021-04-05 14:32:34 +02:00
parent 0315741815
commit 9b740f218b
8 changed files with 49 additions and 9 deletions

View file

@ -151,10 +151,10 @@ Window& Menu::ensure_menu_window()
}
auto window = Window::construct(*this, WindowType::Menu);
window->set_visible(false);
window->set_rect(0, 0, width, window_height);
m_menu_window = move(window);
draw();
return *m_menu_window;
}
@ -291,7 +291,8 @@ void Menu::update_for_new_hovered_item(bool make_input)
hovered_item()->submenu()->do_popup(hovered_item()->rect().top_right().translated(menu_window()->rect().location()), make_input, true);
} else {
MenuManager::the().close_everyone_not_in_lineage(*this);
ensure_menu_window().set_visible(true);
ensure_menu_window();
set_visible(true);
}
redraw();
}
@ -593,7 +594,7 @@ void Menu::do_popup(const Gfx::IntPoint& position, bool make_input, bool as_subm
}
window.move_to(adjusted_pos);
window.set_visible(true);
set_visible(true);
MenuManager::the().open_menu(*this, make_input);
WindowManager::the().did_popup_a_menu({});
}
@ -612,4 +613,15 @@ bool Menu::is_menu_ancestor_of(const Menu& other) const
return false;
}
void Menu::set_visible(bool visible)
{
if (!menu_window())
return;
if (visible == menu_window()->is_visible())
return;
menu_window()->set_visible(visible);
if (m_client)
m_client->post_message(Messages::WindowClient::MenuVisibilityDidChange(m_menu_id, visible));
}
}

View file

@ -111,6 +111,8 @@ public:
void close();
void set_visible(bool);
void popup(const Gfx::IntPoint&);
void do_popup(const Gfx::IntPoint&, bool make_input, bool as_submenu = false);

View file

@ -242,8 +242,7 @@ void MenuManager::close_everyone()
{
for (auto& menu : m_open_menu_stack) {
VERIFY(menu);
if (menu->menu_window())
menu->menu_window()->set_visible(false);
menu->set_visible(false);
menu->clear_hovered_item();
}
m_open_menu_stack.clear();
@ -270,8 +269,7 @@ void MenuManager::close_menus(const Vector<Menu*>& menus)
for (auto& menu : menus) {
if (menu == m_current_menu)
clear_current_menu();
if (menu->menu_window())
menu->menu_window()->set_visible(false);
menu->set_visible(false);
menu->clear_hovered_item();
m_open_menu_stack.remove_first_matching([&](auto& entry) {
return entry == menu;
@ -332,7 +330,7 @@ void MenuManager::open_menu(Menu& menu, bool as_current_menu)
menu.redraw_if_theme_changed();
if (!menu.menu_window())
menu.ensure_menu_window();
menu.menu_window()->set_visible(true);
menu.set_visible(true);
}
if (m_open_menu_stack.find_if([&menu](auto& other) { return &menu == other.ptr(); }).is_end())

View file

@ -19,6 +19,7 @@ endpoint WindowClient = 4
WindowResized(i32 window_id, Gfx::IntRect new_rect) =|
MenuItemActivated(i32 menu_id, i32 identifier) =|
MenuVisibilityDidChange(i32 menu_id, bool visible) =|
ScreenRectChanged(Gfx::IntRect rect) =|