| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-06 15:34:26 +02:00
										 |  |  | #include <AK/String.h>
 | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  | #include <AK/Function.h>
 | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | #include <AK/Types.h>
 | 
					
						
							|  |  |  | #include <AK/WeakPtr.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CObject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2019-06-07 17:13:23 +02:00
										 |  |  |     enum Type { | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  |         Invalid = 0, | 
					
						
							|  |  |  |         Quit, | 
					
						
							|  |  |  |         Timer, | 
					
						
							| 
									
										
										
										
											2019-07-16 20:31:14 +02:00
										 |  |  |         NotifierRead, | 
					
						
							|  |  |  |         NotifierWrite, | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  |         DeferredInvoke, | 
					
						
							|  |  |  |         ChildAdded, | 
					
						
							|  |  |  |         ChildRemoved, | 
					
						
							| 
									
										
										
										
											2019-07-13 18:35:13 +02:00
										 |  |  |         Custom, | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  |     CEvent() {} | 
					
						
							|  |  |  |     explicit CEvent(unsigned type) | 
					
						
							|  |  |  |         : m_type(type) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     virtual ~CEvent() {} | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     unsigned type() const { return m_type; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-20 20:37:31 +02:00
										 |  |  |     bool is_accepted() const { return m_accepted; } | 
					
						
							|  |  |  |     void accept() { m_accepted = true; } | 
					
						
							|  |  |  |     void ignore() { m_accepted = false; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | private: | 
					
						
							|  |  |  |     unsigned m_type { Type::Invalid }; | 
					
						
							| 
									
										
										
										
											2019-09-20 20:37:31 +02:00
										 |  |  |     bool m_accepted { true }; | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CDeferredInvocationEvent : public CEvent { | 
					
						
							| 
									
										
										
										
											2019-04-10 17:30:34 +02:00
										 |  |  |     friend class CEventLoop; | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | public: | 
					
						
							|  |  |  |     CDeferredInvocationEvent(Function<void(CObject&)> invokee) | 
					
						
							|  |  |  |         : CEvent(CEvent::Type::DeferredInvoke) | 
					
						
							|  |  |  |         , m_invokee(move(invokee)) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     Function<void(CObject&)> m_invokee; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CTimerEvent final : public CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     explicit CTimerEvent(int timer_id) | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  |         : CEvent(CEvent::Timer) | 
					
						
							|  |  |  |         , m_timer_id(timer_id) | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-05-28 11:53:16 +02:00
										 |  |  |     ~CTimerEvent() {} | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int timer_id() const { return m_timer_id; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     int m_timer_id; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-16 20:31:14 +02:00
										 |  |  | class CNotifierReadEvent final : public CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     explicit CNotifierReadEvent(int fd) | 
					
						
							|  |  |  |         : CEvent(CEvent::NotifierRead) | 
					
						
							|  |  |  |         , m_fd(fd) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ~CNotifierReadEvent() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int fd() const { return m_fd; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     int m_fd; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CNotifierWriteEvent final : public CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     explicit CNotifierWriteEvent(int fd) | 
					
						
							|  |  |  |         : CEvent(CEvent::NotifierWrite) | 
					
						
							|  |  |  |         , m_fd(fd) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ~CNotifierWriteEvent() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int fd() const { return m_fd; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     int m_fd; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-10 17:01:54 +02:00
										 |  |  | class CChildEvent final : public CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     CChildEvent(Type, CObject& child); | 
					
						
							|  |  |  |     ~CChildEvent(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     CObject* child() { return m_child.ptr(); } | 
					
						
							|  |  |  |     const CObject* child() const { return m_child.ptr(); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     WeakPtr<CObject> m_child; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-07-13 18:35:13 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | class CCustomEvent : public CEvent { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     CCustomEvent(int custom_type, void* data = nullptr) | 
					
						
							|  |  |  |         : CEvent(CEvent::Type::Custom) | 
					
						
							|  |  |  |         , m_custom_type(custom_type) | 
					
						
							|  |  |  |         , m_data(data) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     ~CCustomEvent() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     int custom_type() const { return m_custom_type; } | 
					
						
							|  |  |  |     void* data() { return m_data; } | 
					
						
							|  |  |  |     const void* data() const { return m_data; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |     int m_custom_type { 0 }; | 
					
						
							|  |  |  |     void* m_data { nullptr }; | 
					
						
							|  |  |  | }; |