diff --git a/Userland/Services/WindowServer/ClientConnection.cpp b/Userland/Services/WindowServer/ClientConnection.cpp index 0042bf7cec..44dbdf3696 100644 --- a/Userland/Services/WindowServer/ClientConnection.cpp +++ b/Userland/Services/WindowServer/ClientConnection.cpp @@ -192,6 +192,18 @@ void ClientConnection::update_menu_item(i32 menu_id, i32 identifier, [[maybe_unu menu_item->set_checked(checked); } +void ClientConnection::remove_menu_item(i32 menu_id, i32 identifier) +{ + auto it = m_menus.find(menu_id); + if (it == m_menus.end()) { + did_misbehave("RemoveMenuItem: Bad menu ID"); + return; + } + auto& menu = *(*it).value; + if (!menu.remove_item_with_identifier(identifier)) + did_misbehave("RemoveMenuItem: Bad menu item identifier"); +} + void ClientConnection::flash_menubar_menu(i32 window_id, i32 menu_id) { auto itw = m_windows.find(window_id); diff --git a/Userland/Services/WindowServer/ClientConnection.h b/Userland/Services/WindowServer/ClientConnection.h index de95f21a80..bc3c85752b 100644 --- a/Userland/Services/WindowServer/ClientConnection.h +++ b/Userland/Services/WindowServer/ClientConnection.h @@ -97,6 +97,7 @@ private: virtual void add_menu_item(i32, i32, i32, String const&, bool, bool, bool, bool, String const&, Gfx::ShareableBitmap const&, bool) override; virtual void add_menu_separator(i32) override; virtual void update_menu_item(i32, i32, i32, String const&, bool, bool, bool, bool, String const&) override; + virtual void remove_menu_item(i32 menu_id, i32 identifier) override; virtual void flash_menubar_menu(i32, i32) override; virtual void create_window(i32, Gfx::IntRect const&, bool, bool, bool, bool, bool, bool, bool, bool, bool, bool, float, float, Gfx::IntSize const&, Gfx::IntSize const&, Gfx::IntSize const&, diff --git a/Userland/Services/WindowServer/Menu.cpp b/Userland/Services/WindowServer/Menu.cpp index b86a91daa9..70a6f74b85 100644 --- a/Userland/Services/WindowServer/Menu.cpp +++ b/Userland/Services/WindowServer/Menu.cpp @@ -562,6 +562,11 @@ MenuItem* Menu::item_with_identifier(unsigned identifier) return nullptr; } +bool Menu::remove_item_with_identifier(unsigned identifier) +{ + return m_items.remove_first_matching([&](auto& item) { return item->identifier() == identifier; }); +} + int Menu::item_index_at(const Gfx::IntPoint& position) { int i = 0; diff --git a/Userland/Services/WindowServer/Menu.h b/Userland/Services/WindowServer/Menu.h index a2f72c7e12..210afed6f5 100644 --- a/Userland/Services/WindowServer/Menu.h +++ b/Userland/Services/WindowServer/Menu.h @@ -97,6 +97,7 @@ public: const Gfx::Font& font() const; MenuItem* item_with_identifier(unsigned); + bool remove_item_with_identifier(unsigned); void redraw(); void redraw(MenuItem const&); diff --git a/Userland/Services/WindowServer/WindowServer.ipc b/Userland/Services/WindowServer/WindowServer.ipc index bc9d702b52..53849dd3ba 100644 --- a/Userland/Services/WindowServer/WindowServer.ipc +++ b/Userland/Services/WindowServer/WindowServer.ipc @@ -24,6 +24,7 @@ endpoint WindowServer add_menu_separator(i32 menu_id) =| update_menu_item(i32 menu_id, i32 identifier, i32 submenu_id, [UTF8] String text, bool enabled, bool checkable, bool checked, bool is_default, [UTF8] String shortcut) =| + remove_menu_item(i32 menu_id, i32 identifier) =| flash_menubar_menu(i32 window_id, i32 menu_id) =| create_window(