GMenuItem.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <LibGUI/GMenuItem.h>
  2. #include <LibGUI/GAction.h>
  3. #include <LibGUI/GEventLoop.h>
  4. #include <WindowServer/WSAPITypes.h>
  5. GMenuItem::GMenuItem(unsigned menu_id, Type type)
  6. : m_type(type)
  7. , m_menu_id(menu_id)
  8. {
  9. }
  10. GMenuItem::GMenuItem(unsigned menu_id, Retained<GAction>&& action)
  11. : m_type(Action)
  12. , m_menu_id(menu_id)
  13. , m_action(move(action))
  14. {
  15. m_action->register_menu_item({ }, *this);
  16. m_enabled = m_action->is_enabled();
  17. m_checkable = m_action->is_checkable();
  18. if (m_checkable)
  19. m_checked = m_action->is_checked();
  20. }
  21. GMenuItem::~GMenuItem()
  22. {
  23. if (m_action)
  24. m_action->unregister_menu_item({ }, *this);
  25. }
  26. void GMenuItem::set_enabled(bool enabled)
  27. {
  28. if (m_enabled == enabled)
  29. return;
  30. m_enabled = enabled;
  31. update_window_server();
  32. }
  33. void GMenuItem::set_checked(bool checked)
  34. {
  35. ASSERT(is_checkable());
  36. if (m_checked == checked)
  37. return;
  38. m_checked = checked;
  39. update_window_server();
  40. }
  41. void GMenuItem::update_window_server()
  42. {
  43. auto& action = *m_action;
  44. WSAPI_ClientMessage request;
  45. request.type = WSAPI_ClientMessage::Type::UpdateMenuItem;
  46. request.menu.menu_id = m_menu_id;
  47. request.menu.identifier = m_identifier;
  48. request.menu.enabled = action.is_enabled();
  49. request.menu.checkable = action.is_checkable();
  50. if (action.is_checkable())
  51. request.menu.checked = action.is_checked();
  52. ASSERT(action.text().length() < (ssize_t)sizeof(request.text));
  53. strcpy(request.text, action.text().characters());
  54. request.text_length = action.text().length();
  55. if (action.shortcut().is_valid()) {
  56. auto shortcut_text = action.shortcut().to_string();
  57. ASSERT(shortcut_text.length() < (ssize_t)sizeof(request.menu.shortcut_text));
  58. strcpy(request.menu.shortcut_text, shortcut_text.characters());
  59. request.menu.shortcut_text_length = shortcut_text.length();
  60. } else {
  61. request.menu.shortcut_text_length = 0;
  62. }
  63. GEventLoop::current().sync_request(request, WSAPI_ServerMessage::Type::DidUpdateMenuItem);
  64. }