1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif
4
5 #include <stdlib.h>
6
7 #include "Ecore.h"
8 #include "ecore_private.h"
9
10 static Ecore_Event_Message_Handler *_event_msg_handler = NULL;
11
12 EAPI Ecore_Event_Handler *
ecore_event_handler_add(int type,Ecore_Event_Handler_Cb func,const void * data)13 ecore_event_handler_add(int type,
14 Ecore_Event_Handler_Cb func,
15 const void *data)
16 {
17 return ecore_event_message_handler_add(_event_msg_handler,
18 type, func, (void *)data);
19 }
20
21 EAPI Ecore_Event_Handler *
ecore_event_handler_prepend(int type,Ecore_Event_Handler_Cb func,const void * data)22 ecore_event_handler_prepend(int type,
23 Ecore_Event_Handler_Cb func,
24 const void *data)
25 {
26 return ecore_event_message_handler_prepend(_event_msg_handler,
27 type, func, (void *)data);
28 }
29
30 EAPI void *
ecore_event_handler_del(Ecore_Event_Handler * event_handler)31 ecore_event_handler_del(Ecore_Event_Handler *event_handler)
32 {
33 return ecore_event_message_handler_del(_event_msg_handler,
34 event_handler);
35 }
36
37 EAPI void *
ecore_event_handler_data_get(Ecore_Event_Handler * eh)38 ecore_event_handler_data_get(Ecore_Event_Handler *eh)
39 {
40 return ecore_event_message_handler_data_get(_event_msg_handler, eh);
41 }
42
43 EAPI void *
ecore_event_handler_data_set(Ecore_Event_Handler * eh,const void * data)44 ecore_event_handler_data_set(Ecore_Event_Handler *eh,
45 const void *data)
46 {
47 return ecore_event_message_handler_data_set(_event_msg_handler, eh,
48 (void *)data);
49 }
50
51 EAPI Ecore_Event *
ecore_event_add(int type,void * ev,Ecore_End_Cb func_free,void * data)52 ecore_event_add(int type,
53 void *ev,
54 Ecore_End_Cb func_free,
55 void *data)
56 {
57 Ecore_Event_Message *msg;
58 if (type <= ECORE_EVENT_NONE) return NULL;
59
60 msg = ecore_event_message_handler_message_type_add(_event_msg_handler);
61 if (msg)
62 {
63 ecore_event_message_data_set(msg, type, ev, func_free, data);
64 efl_loop_message_handler_message_send(_event_msg_handler, msg);
65 }
66 return (Ecore_Event *)msg;
67 }
68
69 EAPI void *
ecore_event_del(Ecore_Event * event)70 ecore_event_del(Ecore_Event *event)
71 {
72 void *data = NULL;
73 if (!event) return data;
74 ecore_event_message_data_get((Eo *)event, NULL, NULL, NULL, &data);
75 _efl_loop_message_unsend((Eo *)event);
76 return data;
77 }
78
79 EAPI int
ecore_event_type_new(void)80 ecore_event_type_new(void)
81 {
82 return ecore_event_message_handler_type_new(_event_msg_handler);
83 }
84
85 EAPI Ecore_Event_Filter *
ecore_event_filter_add(Ecore_Data_Cb func_start,Ecore_Filter_Cb func_filter,Ecore_End_Cb func_end,const void * data)86 ecore_event_filter_add(Ecore_Data_Cb func_start,
87 Ecore_Filter_Cb func_filter,
88 Ecore_End_Cb func_end,
89 const void *data)
90 {
91 return ecore_event_message_handler_filter_add(_event_msg_handler,
92 func_start, func_filter,
93 func_end, (void *)data);
94 }
95
96 EAPI void *
ecore_event_filter_del(Ecore_Event_Filter * ef)97 ecore_event_filter_del(Ecore_Event_Filter *ef)
98 {
99 return ecore_event_message_handler_filter_del(_event_msg_handler, ef);
100 }
101
102 EAPI int
ecore_event_current_type_get(void)103 ecore_event_current_type_get(void)
104 {
105 return ecore_event_message_handler_current_type_get(_event_msg_handler);
106 }
107
108 EAPI void *
ecore_event_current_event_get(void)109 ecore_event_current_event_get(void)
110 {
111 return ecore_event_message_handler_current_event_get(_event_msg_handler);
112 }
113
114 Eina_Bool
_ecore_event_init(void)115 _ecore_event_init(void)
116 {
117 const char *choice = getenv("EINA_MEMPOOL");
118 if ((!choice) || (!choice[0])) choice = "chained_mempool";
119
120 _event_msg_handler = efl_add(ECORE_EVENT_MESSAGE_HANDLER_CLASS, _mainloop_singleton);
121 efl_provider_register(_mainloop_singleton, ECORE_EVENT_MESSAGE_HANDLER_CLASS, _event_msg_handler);
122
123 if (!_event_msg_handler)
124 {
125 ERR("Cannot create legacy ecore event message handler");
126 return EINA_FALSE;
127 }
128 // init some core legacy event types in t he same order and numbering as before
129 // ECORE_EVENT_NONE 0
130 // no need to do as ev types start at 1
131
132 // ECORE_EVENT_SIGNAL_USER 1
133 ecore_event_message_handler_type_new(_event_msg_handler);
134 // ECORE_EVENT_SIGNAL_HUP 2
135 ecore_event_message_handler_type_new(_event_msg_handler);
136 // ECORE_EVENT_SIGNAL_EXIT 3
137 ecore_event_message_handler_type_new(_event_msg_handler);
138 // ECORE_EVENT_SIGNAL_POWER 4
139 ecore_event_message_handler_type_new(_event_msg_handler);
140 // ECORE_EVENT_SIGNAL_REALTIME 5
141 ecore_event_message_handler_type_new(_event_msg_handler);
142 // ECORE_EVENT_MEMORY_STATE 6
143 ecore_event_message_handler_type_new(_event_msg_handler);
144 // ECORE_EVENT_POWER_STATE 7
145 ecore_event_message_handler_type_new(_event_msg_handler);
146 // ECORE_EVENT_LOCALE_CHANGED 8
147 ecore_event_message_handler_type_new(_event_msg_handler);
148 // ECORE_EVENT_HOSTNAME_CHANGED 9
149 ecore_event_message_handler_type_new(_event_msg_handler);
150 // ECORE_EVENT_SYSTEM_TIMEDATE_CHANGED 10
151 ecore_event_message_handler_type_new(_event_msg_handler);
152 // ECORE_EVENT_COUNT 11
153 // no need to do as it was a count, nto an event
154
155 return EINA_TRUE;
156 }
157
158 void
_ecore_event_shutdown(void)159 _ecore_event_shutdown(void)
160 {
161 efl_loop_message_handler_message_clear(_event_msg_handler);
162 _event_msg_handler = NULL;
163 }
164
165 void *
_ecore_event_signal_user_new(void)166 _ecore_event_signal_user_new(void)
167 {
168 return calloc(1, sizeof(Ecore_Event_Signal_User));
169 }
170
171 void *
_ecore_event_signal_hup_new(void)172 _ecore_event_signal_hup_new(void)
173 {
174 return calloc(1, sizeof(Ecore_Event_Signal_Hup));
175 }
176
177 void *
_ecore_event_signal_exit_new(void)178 _ecore_event_signal_exit_new(void)
179 {
180 return calloc(1, sizeof(Ecore_Event_Signal_Exit));
181 }
182
183 void *
_ecore_event_signal_power_new(void)184 _ecore_event_signal_power_new(void)
185 {
186 return calloc(1, sizeof(Ecore_Event_Signal_Power));
187 }
188
189 void *
_ecore_event_signal_realtime_new(void)190 _ecore_event_signal_realtime_new(void)
191 {
192 return calloc(1, sizeof(Ecore_Event_Signal_Realtime));
193 }
194
195 EAPI void
ecore_event_type_flush_internal(int type,...)196 ecore_event_type_flush_internal(int type, ...)
197 {
198 va_list args;
199
200 if (type == ECORE_EVENT_NONE) return;
201 ecore_event_message_handler_type_flush(_event_msg_handler, type);
202
203 va_start(args, type);
204 for (;;)
205 {
206 type = va_arg(args, int);
207 if (type == ECORE_EVENT_NONE) break;
208 ecore_event_message_handler_type_flush(_event_msg_handler, type);
209 }
210 va_end(args);
211 }
212