Menubar.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Badge.h>
  7. #include <LibGUI/Menu.h>
  8. #include <LibGUI/MenuItem.h>
  9. #include <LibGUI/Menubar.h>
  10. #include <LibGUI/WindowServerConnection.h>
  11. namespace GUI {
  12. Menubar::Menubar()
  13. {
  14. }
  15. Menubar::~Menubar()
  16. {
  17. unrealize_menubar();
  18. }
  19. Menu& Menubar::add_menu(String name)
  20. {
  21. auto& menu = add<Menu>(move(name));
  22. m_menus.append(menu);
  23. return menu;
  24. }
  25. int Menubar::realize_menubar()
  26. {
  27. return WindowServerConnection::the().create_menubar();
  28. }
  29. void Menubar::unrealize_menubar()
  30. {
  31. if (m_menubar_id == -1)
  32. return;
  33. WindowServerConnection::the().async_destroy_menubar(m_menubar_id);
  34. m_menubar_id = -1;
  35. }
  36. void Menubar::notify_added_to_window(Badge<Window>)
  37. {
  38. VERIFY(m_menubar_id == -1);
  39. m_menubar_id = realize_menubar();
  40. VERIFY(m_menubar_id != -1);
  41. for (auto& menu : m_menus) {
  42. int menu_id = menu.realize_menu();
  43. VERIFY(menu_id != -1);
  44. WindowServerConnection::the().async_add_menu_to_menubar(m_menubar_id, menu_id);
  45. }
  46. }
  47. void Menubar::notify_removed_from_window(Badge<Window>)
  48. {
  49. unrealize_menubar();
  50. }
  51. }