GMenuItem.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include <LibGUI/GAction.h>
  2. #include <LibGUI/GEventLoop.h>
  3. #include <LibGUI/GMenuItem.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, NonnullRefPtr<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. if (m_menu_id < 0)
  44. return;
  45. auto& action = *m_action;
  46. WSAPI_ClientMessage request;
  47. request.type = WSAPI_ClientMessage::Type::UpdateMenuItem;
  48. request.menu.menu_id = m_menu_id;
  49. request.menu.identifier = m_identifier;
  50. request.menu.enabled = action.is_enabled();
  51. request.menu.checkable = action.is_checkable();
  52. if (action.is_checkable())
  53. request.menu.checked = action.is_checked();
  54. ASSERT(action.text().length() < (ssize_t)sizeof(request.text));
  55. strcpy(request.text, action.text().characters());
  56. request.text_length = action.text().length();
  57. if (action.shortcut().is_valid()) {
  58. auto shortcut_text = action.shortcut().to_string();
  59. ASSERT(shortcut_text.length() < (ssize_t)sizeof(request.menu.shortcut_text));
  60. strcpy(request.menu.shortcut_text, shortcut_text.characters());
  61. request.menu.shortcut_text_length = shortcut_text.length();
  62. } else {
  63. request.menu.shortcut_text_length = 0;
  64. }
  65. GEventLoop::current().connection().sync_request(request, WSAPI_ServerMessage::Type::DidUpdateMenuItem);
  66. }