| 
									
										
										
										
											2019-02-12 14:09:48 +01:00
										 |  |  | #include <LibGUI/GAction.h>
 | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | #include <LibGUI/GEventLoop.h>
 | 
					
						
							| 
									
										
										
										
											2019-08-28 21:11:53 +02:00
										 |  |  | #include <LibGUI/GMenu.h>
 | 
					
						
							| 
									
										
										
										
											2019-06-07 11:46:02 +02:00
										 |  |  | #include <LibGUI/GMenuItem.h>
 | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | #include <WindowServer/WSAPITypes.h>
 | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | GMenuItem::GMenuItem(unsigned menu_id, Type type) | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  |     : m_type(type) | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     , m_menu_id(menu_id) | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 18:37:47 +02:00
										 |  |  | GMenuItem::GMenuItem(unsigned menu_id, NonnullRefPtr<GAction>&& action) | 
					
						
							| 
									
										
										
										
											2019-02-12 14:09:48 +01:00
										 |  |  |     : m_type(Action) | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     , m_menu_id(menu_id) | 
					
						
							| 
									
										
										
										
											2019-02-12 14:09:48 +01:00
										 |  |  |     , m_action(move(action)) | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-06-07 11:46:02 +02:00
										 |  |  |     m_action->register_menu_item({}, *this); | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     m_enabled = m_action->is_enabled(); | 
					
						
							| 
									
										
										
										
											2019-04-26 21:09:56 +02:00
										 |  |  |     m_checkable = m_action->is_checkable(); | 
					
						
							|  |  |  |     if (m_checkable) | 
					
						
							|  |  |  |         m_checked = m_action->is_checked(); | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-28 21:11:53 +02:00
										 |  |  | GMenuItem::GMenuItem(unsigned menu_id, NonnullOwnPtr<GMenu>&& submenu) | 
					
						
							|  |  |  |     : m_type(Submenu) | 
					
						
							|  |  |  |     , m_menu_id(menu_id) | 
					
						
							|  |  |  |     , m_submenu(move(submenu)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | GMenuItem::~GMenuItem() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     if (m_action) | 
					
						
							| 
									
										
										
										
											2019-06-07 11:46:02 +02:00
										 |  |  |         m_action->unregister_menu_item({}, *this); | 
					
						
							| 
									
										
										
										
											2019-02-11 14:43:43 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | void GMenuItem::set_enabled(bool enabled) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (m_enabled == enabled) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     m_enabled = enabled; | 
					
						
							|  |  |  |     update_window_server(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-26 21:09:56 +02:00
										 |  |  | void GMenuItem::set_checked(bool checked) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     ASSERT(is_checkable()); | 
					
						
							|  |  |  |     if (m_checked == checked) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     m_checked = checked; | 
					
						
							|  |  |  |     update_window_server(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | void GMenuItem::update_window_server() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-05-23 19:31:00 -07:00
										 |  |  |     if (m_menu_id < 0) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     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(); | 
					
						
							| 
									
										
										
										
											2019-04-26 21:09:56 +02:00
										 |  |  |     request.menu.checkable = action.is_checkable(); | 
					
						
							|  |  |  |     if (action.is_checkable()) | 
					
						
							|  |  |  |         request.menu.checked = action.is_checked(); | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  |     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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 20:57:27 +02:00
										 |  |  |     GWindowServerConnection::the().sync_request(request, WSAPI_ServerMessage::Type::DidUpdateMenuItem); | 
					
						
							| 
									
										
										
										
											2019-04-12 02:53:27 +02:00
										 |  |  | } |