GMenuBar.cpp 1.3 KB

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