1 #ifndef _ECORE_PRIVATE_H
2 #define _ECORE_PRIVATE_H
3 
4 #include <assert.h>
5 
6 #include "ecore_internal.h"
7 
8 #include "ecore_exe_eo.h"
9 #include "ecore_event_message.eo.h"
10 #include "ecore_event_message_handler.eo.h"
11 
12 #ifdef EAPI
13 # undef EAPI
14 #endif
15 
16 #ifdef _WIN32
17 # ifdef EFL_BUILD
18 #  ifdef DLL_EXPORT
19 #   define EAPI __declspec(dllexport)
20 #  else
21 #   define EAPI
22 #  endif
23 # else
24 #  define EAPI __declspec(dllimport)
25 # endif
26 #else
27 # ifdef __GNUC__
28 #  if __GNUC__ >= 4
29 #   define EAPI __attribute__ ((visibility("default")))
30 #  else
31 #   define EAPI
32 #  endif
33 # else
34 #  define EAPI
35 # endif
36 #endif
37 
38 extern int _ecore_log_dom;
39 #ifdef  _ECORE_DEFAULT_LOG_DOM
40 # undef _ECORE_DEFAULT_LOG_DOM
41 #endif
42 #define _ECORE_DEFAULT_LOG_DOM _ecore_log_dom
43 
44 #ifdef ECORE_DEFAULT_LOG_COLOR
45 # undef ECORE_DEFAULT_LOG_COLOR
46 #endif
47 #define ECORE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE
48 
49 #ifdef ERR
50 # undef ERR
51 #endif
52 #define ERR(...) EINA_LOG_DOM_ERR(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
53 
54 #ifdef DBG
55 # undef DBG
56 #endif
57 #define DBG(...) EINA_LOG_DOM_DBG(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
58 
59 #ifdef INF
60 # undef INF
61 #endif
62 #define INF(...) EINA_LOG_DOM_INFO(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
63 
64 #ifdef WRN
65 # undef WRN
66 #endif
67 #define WRN(...) EINA_LOG_DOM_WARN(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
68 
69 #ifdef CRI
70 # undef CRI
71 #endif
72 #define CRI(...) EINA_LOG_DOM_CRIT(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__)
73 
74 #ifndef PATH_MAX
75 # define PATH_MAX 4096
76 #endif
77 
78 #ifndef ABS
79 # define ABS(x)             ((x) < 0 ? -(x) : (x))
80 #endif
81 
82 #ifndef CLAMP
83 # define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x)))
84 #endif
85 
86 typedef struct _Ecore_Factorized_Idle Ecore_Factorized_Idle;
87 
88 typedef struct _Efl_Loop_Promise_Simple_Data Efl_Loop_Promise_Simple_Data;
89 
90 typedef struct _Efl_Loop_Timer_Data Efl_Loop_Timer_Data;
91 typedef struct _Efl_Loop_Data Efl_Loop_Data;
92 
93 typedef struct _Efl_Task_Data Efl_Task_Data;
94 typedef struct _Efl_Appthread_Data Efl_Appthread_Data;
95 
96 typedef struct _Message Message;
97 
98 struct _Message
99 {
100    EINA_INLIST;
101    Eo *handler;
102    Eo *message;
103    Eina_Bool delete_me;
104 };
105 
106 struct _Efl_Loop_Data
107 {
108    double               loop_time;
109 
110    Efl_Loop_Message_Handler *future_message_handler;
111 
112    Efl_Loop_Timer      *poll_high;
113    Efl_Loop_Timer      *poll_medium;
114    Efl_Loop_Timer      *poll_low;
115 
116    Eina_List           *exes; // only used in main loop (for now?)
117 
118    Eina_List           *fd_handlers_obj;
119 
120    Ecore_Fd_Handler    *fd_handlers;
121    Eina_List           *fd_handlers_with_prep;
122    Eina_List           *file_fd_handlers;
123    Eina_List           *always_fd_handlers;
124    Eina_List           *fd_handlers_with_buffer;
125    Eina_List           *fd_handlers_to_delete;
126    Ecore_Fd_Handler    *fd_handlers_to_call;
127    Ecore_Fd_Handler    *fd_handlers_to_call_current;
128 
129 # ifdef _WIN32
130    Ecore_Win32_Handler *win32_handlers;
131    Ecore_Win32_Handler *win32_handler_current;
132    Eina_List           *win32_handlers_to_delete;
133 # endif
134 
135    Eina_List           *thread_children;
136 
137    Eina_Inlist         *message_queue;
138    Eina_Inlist         *message_pending_queue;
139    unsigned int         message_walking;
140 
141    unsigned int         throttle;
142 
143    int                  epoll_fd;
144    pid_t                epoll_pid;
145    int                  timer_fd;
146 
147    double               last_check;
148    Eina_Inlist         *timers;
149    Eina_Inlist         *suspended;
150    Efl_Loop_Timer_Data *timer_current;
151    int                  timers_added;
152 
153    Eina_Value           exit_code;
154 
155    int                  idlers;
156    int                  in_loop;
157    unsigned int         loop_active;
158 
159    struct {
160       int               high;
161       int               medium;
162       int               low;
163    } pollers;
164 
165    struct {
166       char      **environ_ptr;
167       char      **environ_copy;
168    } env;
169 
170    Eina_Bool            do_quit : 1;
171    Eina_Bool            quit_on_last_thread_child_del : 1;
172 };
173 
174 struct _Efl_Task_Data
175 {
176    Eina_Stringshare  *command;
177    Eina_Array        *args;
178    Efl_Task_Priority  priority;
179    int                exit_code;
180    Efl_Task_Flags     flags;
181    Eina_Bool          command_dirty : 1;
182    Eina_Bool          exited : 1;
183 };
184 
185 struct _Efl_Appthread_Data
186 {
187    int read_listeners;
188    struct {
189       int in, out;
190       Eo *in_handler, *out_handler;
191       Eina_Bool can_read : 1;
192       Eina_Bool eos_read : 1;
193       Eina_Bool can_write : 1;
194    } fd, ctrl;
195    void *thdat;
196 };
197 
198 struct _Ecore_Animator
199 {
200    EINA_INLIST;
201 
202    Ecore_Task_Cb     func;
203    void             *data;
204 
205    double            start, run;
206    Ecore_Timeline_Cb run_func;
207    void             *run_data;
208 
209    void             *ee;
210 
211    Eina_Bool         delete_me : 1;
212    Eina_Bool         suspended : 1;
213    Eina_Bool         just_added : 1;
214 };
215 
216 typedef struct _Ecore_Evas_Object_Animator_Interface
217 {
218    Ecore_Animator *(*timeline_add)(void *obj, double runtime, Ecore_Timeline_Cb func, const void *data);
219    Ecore_Animator *(*add)(void *obj, Ecore_Task_Cb func, const void *data);
220    void (*freeze)(Ecore_Animator *animator);
221    void (*thaw)(Ecore_Animator *animator);
222    void *(*del)(Ecore_Animator *animator);
223 } Ecore_Evas_Object_Animator_Interface;
224 
225 EAPI void ecore_evas_object_animator_init(Ecore_Evas_Object_Animator_Interface *iface);
226 
227 #define EVAS_FRAME_QUEUING        1 /* for test */
228 
229 #define READBUFSIZ                65536
230 
231 #define ECORE_MAGIC_NONE          0x1234fedc
232 #define ECORE_MAGIC_EXE           0xf7e812f5
233 #define ECORE_MAGIC_TIMER         0xf7d713f4
234 #define ECORE_MAGIC_IDLER         0xf7c614f3
235 #define ECORE_MAGIC_IDLE_ENTERER  0xf7b515f2
236 #define ECORE_MAGIC_IDLE_EXITER   0xf7601afd
237 #define ECORE_MAGIC_FD_HANDLER    0xf7a416f1
238 #define ECORE_MAGIC_EVENT_HANDLER 0xf79317f0
239 #define ECORE_MAGIC_EVENT_FILTER  0xf78218ff
240 #define ECORE_MAGIC_EVENT         0xf77119fe
241 #define ECORE_MAGIC_ANIMATOR      0xf7643ea5
242 #define ECORE_MAGIC_POLLER        0xf7568127
243 #define ECORE_MAGIC_PIPE          0xf7458226
244 #define ECORE_MAGIC_WIN32_HANDLER 0xf7e8f1a3
245 #define ECORE_MAGIC_JOB           0x76543210
246 
247 typedef unsigned int Ecore_Magic;
248 #define ECORE_MAGIC               Ecore_Magic __magic
249 
250 #define ECORE_MAGIC_SET(d, m)      (d)->__magic = (m)
251 #define ECORE_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
252 #define ECORE_MAGIC_FAIL(d, m, fn) _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
253 
254 /* undef the following, we want our version */
255 #undef FREE
256 #define FREE(ptr)                  free(ptr); ptr = NULL;
257 
258 #undef IF_FREE
259 #define IF_FREE(ptr)               if (ptr) free(ptr); ptr = NULL;
260 
261 #undef IF_FN_DEL
262 #define IF_FN_DEL(_fn, ptr)        if (ptr) { _fn(ptr); ptr = NULL; }
263 
264 EAPI void
265 ecore_print_warning(const char *function,
266                     const char *sparam);
267 
268 /* convenience macros for checking pointer parameters for non-NULL */
269 #undef CHECK_PARAM_POINTER_RETURN
270 #define CHECK_PARAM_POINTER_RETURN(sparam, param, ret) \
271   if (!(param))                                        \
272     {                                                  \
273        ecore_print_warning(__func__, sparam);      \
274        return ret;                                     \
275     }
276 
277 #undef CHECK_PARAM_POINTER
278 #define CHECK_PARAM_POINTER(sparam, param)        \
279   if (!(param))                                   \
280     {                                             \
281        ecore_print_warning(__func__, sparam); \
282        return;                                    \
283     }
284 
285 EAPI void _ecore_magic_fail(const void *d,
286                             Ecore_Magic m,
287                             Ecore_Magic req_m,
288                             const char *fname);
289 
290 void         _ecore_time_init(void);
291 
292 void        *_efl_loop_timer_del(Ecore_Timer *timer);
293 void         _efl_loop_timer_enable_new(Eo *obj, Efl_Loop_Data *pd);
294 double       _efl_loop_timer_next_get(Eo *obj, Efl_Loop_Data *pd);
295 void         _efl_loop_timer_expired_timers_call(Eo *obj, Efl_Loop_Data *pd, double when);
296 int          _efl_loop_timers_exists(Eo *obj, Efl_Loop_Data *pd);
297 int          _efl_loop_timer_expired_call(Eo *obj, Efl_Loop_Data *pd, double when);
298 
299 Ecore_Factorized_Idle *_ecore_factorized_idle_add(const Efl_Callback_Array_Item*desc,
300                                                   Ecore_Task_Cb func,
301                                                   const void   *data);
302 void        *_ecore_factorized_idle_del(Ecore_Idler *idler);
303 void    _ecore_factorized_idle_process(void *data, const Efl_Event *event);
304 void    _ecore_factorized_idle_event_del(void *data, const Efl_Event *event);
305 
306 Eina_Bool    _ecore_event_init(void);
307 void         _ecore_event_shutdown(void);
308 int          _ecore_event_exist(void);
309 Ecore_Event *_ecore_event_add(int type,
310                               void *ev,
311                               Ecore_End_Cb func_free,
312                               void *data);
313 void         _ecore_event_call(void);
314 
315 Efl_Loop_Timer *_ecore_exe_doomsday_clock_get(Ecore_Exe *exe);
316 void            _ecore_exe_doomsday_clock_set(Ecore_Exe *exe, Efl_Loop_Timer *dc);
317 
318 void      *_ecore_event_signal_user_new(void);
319 void      *_ecore_event_signal_hup_new(void);
320 void      *_ecore_event_signal_exit_new(void);
321 void      *_ecore_event_signal_power_new(void);
322 void      *_ecore_event_signal_realtime_new(void);
323 
324 Ecore_Pipe *_ecore_pipe_add(Ecore_Pipe_Cb handler,
325                             const void   *data);
326 int         _ecore_pipe_wait(Ecore_Pipe *p,
327                              int message_count,
328                              double wait);
329 void       *_ecore_pipe_del(Ecore_Pipe *p);
330 
331 Ecore_Fd_Handler *_ecore_main_fd_handler_add(Eo *obj,
332                                              Efl_Loop_Data *pd,
333                                              Eo *handler,
334                                              int fd,
335                                              Ecore_Fd_Handler_Flags flags,
336                                              Ecore_Fd_Cb func,
337                                              const void *data,
338                                              Ecore_Fd_Cb buf_func,
339                                              const void *buf_data,
340                                              Eina_Bool is_file);
341 void      *_ecore_main_fd_handler_del(Eo *obj,
342                                       Efl_Loop_Data *pd,
343                                       Ecore_Fd_Handler *fd_handler);
344 Ecore_Win32_Handler *
345 _ecore_main_win32_handler_add(Eo                    *obj,
346                               Efl_Loop_Data         *pd,
347                               Eo                    *handler,
348                               void                  *h,
349                               Ecore_Win32_Handle_Cb  func,
350                               const void            *data);
351 void *
352 _ecore_main_win32_handler_del(Eo *obj,
353                               Efl_Loop_Data *pd,
354                               Ecore_Win32_Handler *win32_handler);
355 
356 void       _ecore_main_content_clear(Eo *obj, Efl_Loop_Data *pd);
357 void       _ecore_main_shutdown(void);
358 
359 #if defined (_WIN32) || defined (__lv2ppu__)
_ecore_signal_shutdown(void)360 static inline void _ecore_signal_shutdown(void) { }
361 
_ecore_signal_init(void)362 static inline void _ecore_signal_init(void) { }
363 
_ecore_signal_received_process(Eo * obj EINA_UNUSED,Efl_Loop_Data * pd EINA_UNUSED)364 static inline void _ecore_signal_received_process(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { }
365 
_ecore_signal_count_get(Eo * obj EINA_UNUSED,Efl_Loop_Data * pd EINA_UNUSED)366 static inline int _ecore_signal_count_get(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { return 0; }
367 
_ecore_signal_call(Eo * obj EINA_UNUSED,Efl_Loop_Data * pd EINA_UNUSED)368 static inline void _ecore_signal_call(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { }
369 
370 #else
371 #define ECORE_SIGNALS 1
372 typedef struct _Ecore_Signal_Pid_Info Ecore_Signal_Pid_Info;
373 
374 struct _Ecore_Signal_Pid_Info
375 {
376    pid_t pid;
377    int exit_code;
378    int exit_signal;
379    siginfo_t info;
380 };
381 
382 void _ecore_signal_shutdown(void);
383 void _ecore_signal_init(void);
384 void _ecore_signal_received_process(Eo *obj, Efl_Loop_Data *pd);
385 int  _ecore_signal_count_get(Eo *obj, Efl_Loop_Data *pd);
386 void _ecore_signal_call(Eo *obj, Efl_Loop_Data *pd);
387 void _ecore_signal_pid_lock(void);
388 void _ecore_signal_pid_unlock(void);
389 void _ecore_signal_pid_register(pid_t pid, int fd);
390 void _ecore_signal_pid_unregister(pid_t pid, int fd);
391 
392 #endif
393 
394 void       _ecore_exe_init(void);
395 void       _ecore_exe_shutdown(void);
396 #ifndef _WIN32
397 Ecore_Exe *_ecore_exe_find(pid_t pid);
398 void      *_ecore_exe_event_del_new(void);
399 void       _ecore_exe_event_del_free(void *data,
400                                      void *ev);
401 #endif
402 
403 void _ecore_animator_init(void);
404 void _ecore_animator_shutdown(void);
405 void _ecore_animator_run_reset(void);
406 Eina_Bool _ecore_animator_run_get(void);
407 Eina_Bool _ecore_animator_flush(void);
408 
409 void _ecore_poller_shutdown(void);
410 
411 void _ecore_fps_debug_init(void);
412 void _ecore_fps_debug_shutdown(void);
413 void _ecore_fps_debug_runtime_add(double t);
414 
415 void _ecore_thread_init(void);
416 void _ecore_thread_shutdown(void);
417 
418 void _ecore_glib_init(void);
419 void _ecore_glib_shutdown(void);
420 
421 void _ecore_job_init(void);
422 void _ecore_job_shutdown(void);
423 
424 void _ecore_main_loop_init(void);
425 void _ecore_main_loop_shutdown(void);
426 
427 void _ecore_main_loop_iterate(Eo *obj, Efl_Loop_Data *pd);
428 int  _ecore_main_loop_iterate_may_block(Eo *obj, Efl_Loop_Data *pd, int may_block);
429 void _ecore_main_loop_begin(Eo *obj, Efl_Loop_Data *pd);
430 void _ecore_main_loop_quit(Eo *obj, Efl_Loop_Data *pd);
431 
432 void _ecore_coroutine_init(void);
433 void _ecore_coroutine_shutdown(void);
434 
435 void _ecore_throttle(void);
436 
437 void _ecore_main_call_flush(void);
438 
439 void _ecore_main_timechanges_start(Eo *obj);
440 void _ecore_main_timechanges_stop(Eo *obj);
441 
442 Eina_Bool _ecore_event_do_filter(void *handler_pd, Eo *msg_handler, Eo *msg);
443 void _ecore_event_filters_call(Eo *obj, Efl_Loop_Data *pd);
444 void _efl_loop_messages_filter(Eo *obj, Efl_Loop_Data *pd, void *handler_pd);
445 void _efl_loop_messages_call(Eo *obj, Efl_Loop_Data *pd, void *func, void *data);
446 
447 void _efl_loop_message_send_info_set(Eo *obj, Eina_Inlist *node, Eo *loop, Efl_Loop_Data *loop_data);
448 void _efl_loop_message_unsend(Eo *obj);
449 
450 void _efl_thread_child_remove(Eo *loop, Efl_Loop_Data *pd, Eo *child);
451 
452 static inline Eina_Bool
_ecore_call_task_cb(Ecore_Task_Cb func,void * data)453 _ecore_call_task_cb(Ecore_Task_Cb func,
454                     void *data)
455 {
456    return func(data);
457 }
458 
459 static inline void *
_ecore_call_data_cb(Ecore_Data_Cb func,void * data)460 _ecore_call_data_cb(Ecore_Data_Cb func,
461                     void *data)
462 {
463    return func(data);
464 }
465 
466 static inline void
_ecore_call_end_cb(Ecore_End_Cb func,void * user_data,void * func_data)467 _ecore_call_end_cb(Ecore_End_Cb func,
468                    void *user_data,
469                    void *func_data)
470 {
471    func(user_data, func_data);
472 }
473 
474 static inline Eina_Bool
_ecore_call_filter_cb(Ecore_Filter_Cb func,void * data,void * loop_data,int type,void * event)475 _ecore_call_filter_cb(Ecore_Filter_Cb func,
476                       void *data,
477                       void *loop_data,
478                       int type,
479                       void *event)
480 {
481    return func(data, loop_data, type, event);
482 }
483 
484 static inline Eina_Bool
_ecore_call_handler_cb(Ecore_Event_Handler_Cb func,void * data,int type,void * event)485 _ecore_call_handler_cb(Ecore_Event_Handler_Cb func,
486                        void *data,
487                        int type,
488                        void *event)
489 {
490    return func(data, type, event);
491 }
492 
493 static inline void
_ecore_call_prep_cb(Ecore_Fd_Prep_Cb func,void * data,Ecore_Fd_Handler * fd_handler)494 _ecore_call_prep_cb(Ecore_Fd_Prep_Cb func,
495                     void *data,
496                     Ecore_Fd_Handler *fd_handler)
497 {
498    func(data, fd_handler);
499 }
500 
501 static inline Eina_Bool
_ecore_call_fd_cb(Ecore_Fd_Cb func,void * data,Ecore_Fd_Handler * fd_handler)502 _ecore_call_fd_cb(Ecore_Fd_Cb func,
503                   void *data,
504                   Ecore_Fd_Handler *fd_handler)
505 {
506    return func(data, fd_handler);
507 }
508 
509 extern int _ecore_fps_debug;
510 extern Eina_Bool _ecore_glib_always_integrate;
511 extern Ecore_Select_Function main_loop_select;
512 extern int in_main_loop;
513 
514 #ifdef HAVE_SYSTEMD
515 void _ecore_sd_init(void);
516 
517 extern int (*_ecore_sd_notify) (int unset_environment, const char *state);
518 #endif
519 
520 Eina_Bool ecore_mempool_init(void);
521 void ecore_mempool_shutdown(void);
522 #define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \
523   TYPE *Type##_calloc(unsigned int);          \
524   void Type##_mp_free(TYPE *e);
525 #define GENERIC_ALLOC_SIZE_DECLARE(TYPE)      \
526   size_t _ecore_sizeof_##TYPE = sizeof (TYPE);
527 
528 //GENERIC_ALLOC_FREE_HEADER(Ecore_Animator, ecore_animator);
529 //GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Handler, ecore_event_handler);
530 //GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Filter, ecore_event_filter);
531 //GENERIC_ALLOC_FREE_HEADER(Ecore_Event, ecore_event);
532 //GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Exiter, ecore_idle_exiter);
533 //GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Enterer, ecore_idle_enterer);
534 //GENERIC_ALLOC_FREE_HEADER(Ecore_Idler, ecore_idler);
535 //GENERIC_ALLOC_FREE_HEADER(Ecore_Job, ecore_job);
536 //GENERIC_ALLOC_FREE_HEADER(Ecore_Timer, ecore_timer);
537 //GENERIC_ALLOC_FREE_HEADER(Ecore_Poller, ecore_poller);
538 GENERIC_ALLOC_FREE_HEADER(Ecore_Pipe, ecore_pipe);
539 GENERIC_ALLOC_FREE_HEADER(Ecore_Fd_Handler, ecore_fd_handler);
540 GENERIC_ALLOC_FREE_HEADER(Efl_Loop_Promise_Simple_Data, efl_loop_promise_simple_data);
541 #ifdef _WIN32
542 GENERIC_ALLOC_FREE_HEADER(Ecore_Win32_Handler, ecore_win32_handler);
543 #endif
544 
545 #undef GENERIC_ALLOC_FREE_HEADER
546 
547 extern Eo *_mainloop_singleton;
548 extern Efl_Loop_Data *_mainloop_singleton_data;
549 #define ML_OBJ _mainloop_singleton
550 #define ML_DAT _mainloop_singleton_data
551 //#define ML_DAT efl_data_scope_get(ML_OBJ, EFL_LOOP_CLASS)
552 
553 extern Efl_Version _app_efl_version;
554 
555 // access to direct input cb
556 #define ECORE_EVAS_INTERNAL
557 
558 #define EFL_LOOP_DATA efl_data_scope_get(efl_main_loop_get(), EFL_LOOP_CLASS)
559 
560 #undef EAPI
561 #define EAPI
562 
563 #endif
564