GMenuBar.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #include <LibGUI/GEventLoop.h>
  2. #include <LibGUI/GMenuBar.h>
  3. GMenuBar::GMenuBar()
  4. {
  5. }
  6. GMenuBar::~GMenuBar()
  7. {
  8. unrealize_menubar();
  9. }
  10. void GMenuBar::add_menu(NonnullOwnPtr<GMenu>&& menu)
  11. {
  12. m_menus.append(move(menu));
  13. }
  14. int GMenuBar::realize_menubar()
  15. {
  16. WSAPI_ClientMessage request;
  17. request.type = WSAPI_ClientMessage::Type::CreateMenubar;
  18. WSAPI_ServerMessage response = GWindowServerConnection::the().sync_request(request, WSAPI_ServerMessage::Type::DidCreateMenubar);
  19. return response.menu.menubar_id;
  20. }
  21. void GMenuBar::unrealize_menubar()
  22. {
  23. if (m_menubar_id == -1)
  24. return;
  25. WSAPI_ClientMessage request;
  26. request.type = WSAPI_ClientMessage::Type::DestroyMenubar;
  27. request.menu.menubar_id = m_menubar_id;
  28. GWindowServerConnection::the().sync_request(request, WSAPI_ServerMessage::Type::DidDestroyMenubar);
  29. m_menubar_id = -1;
  30. }
  31. void GMenuBar::notify_added_to_application(Badge<GApplication>)
  32. {
  33. ASSERT(m_menubar_id == -1);
  34. m_menubar_id = realize_menubar();
  35. ASSERT(m_menubar_id != -1);
  36. for (auto& menu : m_menus) {
  37. int menu_id = menu.realize_menu();
  38. ASSERT(menu_id != -1);
  39. WSAPI_ClientMessage request;
  40. request.type = WSAPI_ClientMessage::Type::AddMenuToMenubar;
  41. request.menu.menubar_id = m_menubar_id;
  42. request.menu.menu_id = menu_id;
  43. GWindowServerConnection::the().sync_request(request, WSAPI_ServerMessage::Type::DidAddMenuToMenubar);
  44. }
  45. WSAPI_ClientMessage request;
  46. request.type = WSAPI_ClientMessage::Type::SetApplicationMenubar;
  47. request.menu.menubar_id = m_menubar_id;
  48. GWindowServerConnection::the().sync_request(request, WSAPI_ServerMessage::Type::DidSetApplicationMenubar);
  49. }
  50. void GMenuBar::notify_removed_from_application(Badge<GApplication>)
  51. {
  52. unrealize_menubar();
  53. }