
As a consequence, move to use an explicit handshake() method rather than calling virtuals from the constructor. This seemed to not bother AClientConnection, but LibGUI crashes (rightfully) because of it.
61 lines
1.8 KiB
C++
61 lines
1.8 KiB
C++
#include <LibGUI/GEventLoop.h>
|
|
#include <LibGUI/GMenuBar.h>
|
|
|
|
GMenuBar::GMenuBar()
|
|
{
|
|
}
|
|
|
|
GMenuBar::~GMenuBar()
|
|
{
|
|
unrealize_menubar();
|
|
}
|
|
|
|
void GMenuBar::add_menu(OwnPtr<GMenu>&& menu)
|
|
{
|
|
m_menus.append(move(menu));
|
|
}
|
|
|
|
int GMenuBar::realize_menubar()
|
|
{
|
|
WSAPI_ClientMessage request;
|
|
request.type = WSAPI_ClientMessage::Type::CreateMenubar;
|
|
WSAPI_ServerMessage response = GEventLoop::current().connection().sync_request(request, WSAPI_ServerMessage::Type::DidCreateMenubar);
|
|
return response.menu.menubar_id;
|
|
}
|
|
|
|
void GMenuBar::unrealize_menubar()
|
|
{
|
|
if (m_menubar_id == -1)
|
|
return;
|
|
WSAPI_ClientMessage request;
|
|
request.type = WSAPI_ClientMessage::Type::DestroyMenubar;
|
|
request.menu.menubar_id = m_menubar_id;
|
|
GEventLoop::current().connection().sync_request(request, WSAPI_ServerMessage::Type::DidDestroyMenubar);
|
|
m_menubar_id = -1;
|
|
}
|
|
|
|
void GMenuBar::notify_added_to_application(Badge<GApplication>)
|
|
{
|
|
ASSERT(m_menubar_id == -1);
|
|
m_menubar_id = realize_menubar();
|
|
ASSERT(m_menubar_id != -1);
|
|
for (auto& menu : m_menus) {
|
|
ASSERT(menu);
|
|
int menu_id = menu->realize_menu();
|
|
ASSERT(menu_id != -1);
|
|
WSAPI_ClientMessage request;
|
|
request.type = WSAPI_ClientMessage::Type::AddMenuToMenubar;
|
|
request.menu.menubar_id = m_menubar_id;
|
|
request.menu.menu_id = menu_id;
|
|
GEventLoop::current().connection().sync_request(request, WSAPI_ServerMessage::Type::DidAddMenuToMenubar);
|
|
}
|
|
WSAPI_ClientMessage request;
|
|
request.type = WSAPI_ClientMessage::Type::SetApplicationMenubar;
|
|
request.menu.menubar_id = m_menubar_id;
|
|
GEventLoop::current().connection().sync_request(request, WSAPI_ServerMessage::Type::DidSetApplicationMenubar);
|
|
}
|
|
|
|
void GMenuBar::notify_removed_from_application(Badge<GApplication>)
|
|
{
|
|
unrealize_menubar();
|
|
}
|