diff --git a/Libraries/LibGUI/Menu.cpp b/Libraries/LibGUI/Menu.cpp index e8f7cf99e5..5ded8931fd 100644 --- a/Libraries/LibGUI/Menu.cpp +++ b/Libraries/LibGUI/Menu.cpp @@ -102,6 +102,27 @@ void Menu::dismiss() WindowServerConnection::the().post_message(Messages::WindowServer::DismissMenu(m_menu_id)); } +template +static int ensure_realized_icon(IconContainerType& container) +{ + int icon_buffer_id = -1; + if (container.icon()) { + ASSERT(container.icon()->format() == Gfx::BitmapFormat::RGBA32); + ASSERT(container.icon()->size() == Gfx::IntSize(16, 16)); + if (container.icon()->shbuf_id() == -1) { + auto shared_buffer = SharedBuffer::create_with_size(container.icon()->size_in_bytes()); + ASSERT(shared_buffer); + auto shared_icon = Gfx::Bitmap::create_with_shared_buffer(Gfx::BitmapFormat::RGBA32, *shared_buffer, container.icon()->size()); + memcpy(shared_buffer->data(), container.icon()->bits(0), container.icon()->size_in_bytes()); + shared_buffer->seal(); + shared_buffer->share_with(WindowServerConnection::the().server_pid()); + container.set_icon(shared_icon); + } + icon_buffer_id = container.icon()->shbuf_id(); + } + return icon_buffer_id; +} + int Menu::realize_menu(RefPtr default_action) { unrealize_menu(); @@ -127,21 +148,7 @@ int Menu::realize_menu(RefPtr default_action) } if (item.type() == MenuItem::Type::Action) { auto& action = *item.action(); - int icon_buffer_id = -1; - if (action.icon()) { - ASSERT(action.icon()->format() == Gfx::BitmapFormat::RGBA32); - ASSERT(action.icon()->size() == Gfx::IntSize(16, 16)); - if (action.icon()->shbuf_id() == -1) { - auto shared_buffer = SharedBuffer::create_with_size(action.icon()->size_in_bytes()); - ASSERT(shared_buffer); - auto shared_icon = Gfx::Bitmap::create_with_shared_buffer(Gfx::BitmapFormat::RGBA32, *shared_buffer, action.icon()->size()); - memcpy(shared_buffer->data(), action.icon()->bits(0), action.icon()->size_in_bytes()); - shared_buffer->seal(); - shared_buffer->share_with(WindowServerConnection::the().server_pid()); - action.set_icon(shared_icon); - } - icon_buffer_id = action.icon()->shbuf_id(); - } + int icon_buffer_id = ensure_realized_icon(action); auto shortcut_text = action.shortcut().is_valid() ? action.shortcut().to_string() : String(); bool exclusive = action.group() && action.group()->is_exclusive() && action.is_checkable(); bool is_default = (default_action.ptr() == &action);