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