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