#ifndef _ECORE_PRIVATE_H #define _ECORE_PRIVATE_H #include #include "ecore_internal.h" #include "ecore_exe_eo.h" #include "ecore_event_message.eo.h" #include "ecore_event_message_handler.eo.h" #ifdef EAPI # undef EAPI #endif #ifdef _WIN32 # ifdef EFL_BUILD # ifdef DLL_EXPORT # define EAPI __declspec(dllexport) # else # define EAPI # endif # else # define EAPI __declspec(dllimport) # endif #else # ifdef __GNUC__ # if __GNUC__ >= 4 # define EAPI __attribute__ ((visibility("default"))) # else # define EAPI # endif # else # define EAPI # endif #endif extern int _ecore_log_dom; #ifdef _ECORE_DEFAULT_LOG_DOM # undef _ECORE_DEFAULT_LOG_DOM #endif #define _ECORE_DEFAULT_LOG_DOM _ecore_log_dom #ifdef ECORE_DEFAULT_LOG_COLOR # undef ECORE_DEFAULT_LOG_COLOR #endif #define ECORE_DEFAULT_LOG_COLOR EINA_COLOR_BLUE #ifdef ERR # undef ERR #endif #define ERR(...) EINA_LOG_DOM_ERR(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__) #ifdef DBG # undef DBG #endif #define DBG(...) EINA_LOG_DOM_DBG(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__) #ifdef INF # undef INF #endif #define INF(...) EINA_LOG_DOM_INFO(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__) #ifdef WRN # undef WRN #endif #define WRN(...) EINA_LOG_DOM_WARN(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__) #ifdef CRI # undef CRI #endif #define CRI(...) EINA_LOG_DOM_CRIT(_ECORE_DEFAULT_LOG_DOM, __VA_ARGS__) #ifndef PATH_MAX # define PATH_MAX 4096 #endif #ifndef ABS # define ABS(x) ((x) < 0 ? -(x) : (x)) #endif #ifndef CLAMP # define CLAMP(x, min, max) (((x) > (max)) ? (max) : (((x) < (min)) ? (min) : (x))) #endif typedef struct _Ecore_Factorized_Idle Ecore_Factorized_Idle; typedef struct _Efl_Loop_Promise_Simple_Data Efl_Loop_Promise_Simple_Data; typedef struct _Efl_Loop_Timer_Data Efl_Loop_Timer_Data; typedef struct _Efl_Loop_Data Efl_Loop_Data; typedef struct _Efl_Task_Data Efl_Task_Data; typedef struct _Efl_Appthread_Data Efl_Appthread_Data; typedef struct _Message Message; struct _Message { EINA_INLIST; Eo *handler; Eo *message; Eina_Bool delete_me; }; struct _Efl_Loop_Data { double loop_time; Efl_Loop_Message_Handler *future_message_handler; Efl_Loop_Timer *poll_high; Efl_Loop_Timer *poll_medium; Efl_Loop_Timer *poll_low; Eina_List *exes; // only used in main loop (for now?) Eina_List *fd_handlers_obj; Ecore_Fd_Handler *fd_handlers; Eina_List *fd_handlers_with_prep; Eina_List *file_fd_handlers; Eina_List *always_fd_handlers; Eina_List *fd_handlers_with_buffer; Eina_List *fd_handlers_to_delete; Ecore_Fd_Handler *fd_handlers_to_call; Ecore_Fd_Handler *fd_handlers_to_call_current; # ifdef _WIN32 Ecore_Win32_Handler *win32_handlers; Ecore_Win32_Handler *win32_handler_current; Eina_List *win32_handlers_to_delete; # endif Eina_List *thread_children; Eina_Inlist *message_queue; Eina_Inlist *message_pending_queue; unsigned int message_walking; unsigned int throttle; int epoll_fd; pid_t epoll_pid; int timer_fd; double last_check; Eina_Inlist *timers; Eina_Inlist *suspended; Efl_Loop_Timer_Data *timer_current; int timers_added; Eina_Value exit_code; int idlers; int in_loop; unsigned int loop_active; struct { int high; int medium; int low; } pollers; struct { char **environ_ptr; char **environ_copy; } env; Eina_Bool do_quit : 1; Eina_Bool quit_on_last_thread_child_del : 1; }; struct _Efl_Task_Data { Eina_Stringshare *command; Eina_Array *args; Efl_Task_Priority priority; int exit_code; Efl_Task_Flags flags; Eina_Bool command_dirty : 1; Eina_Bool exited : 1; }; struct _Efl_Appthread_Data { int read_listeners; struct { int in, out; Eo *in_handler, *out_handler; Eina_Bool can_read : 1; Eina_Bool eos_read : 1; Eina_Bool can_write : 1; } fd, ctrl; void *thdat; }; struct _Ecore_Animator { EINA_INLIST; Ecore_Task_Cb func; void *data; double start, run; Ecore_Timeline_Cb run_func; void *run_data; void *ee; Eina_Bool delete_me : 1; Eina_Bool suspended : 1; Eina_Bool just_added : 1; }; typedef struct _Ecore_Evas_Object_Animator_Interface { Ecore_Animator *(*timeline_add)(void *obj, double runtime, Ecore_Timeline_Cb func, const void *data); Ecore_Animator *(*add)(void *obj, Ecore_Task_Cb func, const void *data); void (*freeze)(Ecore_Animator *animator); void (*thaw)(Ecore_Animator *animator); void *(*del)(Ecore_Animator *animator); } Ecore_Evas_Object_Animator_Interface; EAPI void ecore_evas_object_animator_init(Ecore_Evas_Object_Animator_Interface *iface); #define EVAS_FRAME_QUEUING 1 /* for test */ #define READBUFSIZ 65536 #define ECORE_MAGIC_NONE 0x1234fedc #define ECORE_MAGIC_EXE 0xf7e812f5 #define ECORE_MAGIC_TIMER 0xf7d713f4 #define ECORE_MAGIC_IDLER 0xf7c614f3 #define ECORE_MAGIC_IDLE_ENTERER 0xf7b515f2 #define ECORE_MAGIC_IDLE_EXITER 0xf7601afd #define ECORE_MAGIC_FD_HANDLER 0xf7a416f1 #define ECORE_MAGIC_EVENT_HANDLER 0xf79317f0 #define ECORE_MAGIC_EVENT_FILTER 0xf78218ff #define ECORE_MAGIC_EVENT 0xf77119fe #define ECORE_MAGIC_ANIMATOR 0xf7643ea5 #define ECORE_MAGIC_POLLER 0xf7568127 #define ECORE_MAGIC_PIPE 0xf7458226 #define ECORE_MAGIC_WIN32_HANDLER 0xf7e8f1a3 #define ECORE_MAGIC_JOB 0x76543210 typedef unsigned int Ecore_Magic; #define ECORE_MAGIC Ecore_Magic __magic #define ECORE_MAGIC_SET(d, m) (d)->__magic = (m) #define ECORE_MAGIC_CHECK(d, m) ((d) && ((d)->__magic == (m))) #define ECORE_MAGIC_FAIL(d, m, fn) _ecore_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn)); /* undef the following, we want our version */ #undef FREE #define FREE(ptr) free(ptr); ptr = NULL; #undef IF_FREE #define IF_FREE(ptr) if (ptr) free(ptr); ptr = NULL; #undef IF_FN_DEL #define IF_FN_DEL(_fn, ptr) if (ptr) { _fn(ptr); ptr = NULL; } EAPI void ecore_print_warning(const char *function, const char *sparam); /* convenience macros for checking pointer parameters for non-NULL */ #undef CHECK_PARAM_POINTER_RETURN #define CHECK_PARAM_POINTER_RETURN(sparam, param, ret) \ if (!(param)) \ { \ ecore_print_warning(__func__, sparam); \ return ret; \ } #undef CHECK_PARAM_POINTER #define CHECK_PARAM_POINTER(sparam, param) \ if (!(param)) \ { \ ecore_print_warning(__func__, sparam); \ return; \ } EAPI void _ecore_magic_fail(const void *d, Ecore_Magic m, Ecore_Magic req_m, const char *fname); void _ecore_time_init(void); void *_efl_loop_timer_del(Ecore_Timer *timer); void _efl_loop_timer_enable_new(Eo *obj, Efl_Loop_Data *pd); double _efl_loop_timer_next_get(Eo *obj, Efl_Loop_Data *pd); void _efl_loop_timer_expired_timers_call(Eo *obj, Efl_Loop_Data *pd, double when); int _efl_loop_timers_exists(Eo *obj, Efl_Loop_Data *pd); int _efl_loop_timer_expired_call(Eo *obj, Efl_Loop_Data *pd, double when); Ecore_Factorized_Idle *_ecore_factorized_idle_add(const Efl_Callback_Array_Item*desc, Ecore_Task_Cb func, const void *data); void *_ecore_factorized_idle_del(Ecore_Idler *idler); void _ecore_factorized_idle_process(void *data, const Efl_Event *event); void _ecore_factorized_idle_event_del(void *data, const Efl_Event *event); Eina_Bool _ecore_event_init(void); void _ecore_event_shutdown(void); int _ecore_event_exist(void); Ecore_Event *_ecore_event_add(int type, void *ev, Ecore_End_Cb func_free, void *data); void _ecore_event_call(void); Efl_Loop_Timer *_ecore_exe_doomsday_clock_get(Ecore_Exe *exe); void _ecore_exe_doomsday_clock_set(Ecore_Exe *exe, Efl_Loop_Timer *dc); void *_ecore_event_signal_user_new(void); void *_ecore_event_signal_hup_new(void); void *_ecore_event_signal_exit_new(void); void *_ecore_event_signal_power_new(void); void *_ecore_event_signal_realtime_new(void); Ecore_Pipe *_ecore_pipe_add(Ecore_Pipe_Cb handler, const void *data); int _ecore_pipe_wait(Ecore_Pipe *p, int message_count, double wait); void *_ecore_pipe_del(Ecore_Pipe *p); Ecore_Fd_Handler *_ecore_main_fd_handler_add(Eo *obj, Efl_Loop_Data *pd, Eo *handler, int fd, Ecore_Fd_Handler_Flags flags, Ecore_Fd_Cb func, const void *data, Ecore_Fd_Cb buf_func, const void *buf_data, Eina_Bool is_file); void *_ecore_main_fd_handler_del(Eo *obj, Efl_Loop_Data *pd, Ecore_Fd_Handler *fd_handler); Ecore_Win32_Handler * _ecore_main_win32_handler_add(Eo *obj, Efl_Loop_Data *pd, Eo *handler, void *h, Ecore_Win32_Handle_Cb func, const void *data); void * _ecore_main_win32_handler_del(Eo *obj, Efl_Loop_Data *pd, Ecore_Win32_Handler *win32_handler); void _ecore_main_content_clear(Eo *obj, Efl_Loop_Data *pd); void _ecore_main_shutdown(void); #if defined (_WIN32) || defined (__lv2ppu__) static inline void _ecore_signal_shutdown(void) { } static inline void _ecore_signal_init(void) { } static inline void _ecore_signal_received_process(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { } static inline int _ecore_signal_count_get(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { return 0; } static inline void _ecore_signal_call(Eo *obj EINA_UNUSED, Efl_Loop_Data *pd EINA_UNUSED) { } #else #define ECORE_SIGNALS 1 typedef struct _Ecore_Signal_Pid_Info Ecore_Signal_Pid_Info; struct _Ecore_Signal_Pid_Info { pid_t pid; int exit_code; int exit_signal; siginfo_t info; }; void _ecore_signal_shutdown(void); void _ecore_signal_init(void); void _ecore_signal_received_process(Eo *obj, Efl_Loop_Data *pd); int _ecore_signal_count_get(Eo *obj, Efl_Loop_Data *pd); void _ecore_signal_call(Eo *obj, Efl_Loop_Data *pd); void _ecore_signal_pid_lock(void); void _ecore_signal_pid_unlock(void); void _ecore_signal_pid_register(pid_t pid, int fd); void _ecore_signal_pid_unregister(pid_t pid, int fd); #endif void _ecore_exe_init(void); void _ecore_exe_shutdown(void); #ifndef _WIN32 Ecore_Exe *_ecore_exe_find(pid_t pid); void *_ecore_exe_event_del_new(void); void _ecore_exe_event_del_free(void *data, void *ev); #endif void _ecore_animator_init(void); void _ecore_animator_shutdown(void); void _ecore_animator_run_reset(void); Eina_Bool _ecore_animator_run_get(void); Eina_Bool _ecore_animator_flush(void); void _ecore_poller_shutdown(void); void _ecore_fps_debug_init(void); void _ecore_fps_debug_shutdown(void); void _ecore_fps_debug_runtime_add(double t); void _ecore_thread_init(void); void _ecore_thread_shutdown(void); void _ecore_glib_init(void); void _ecore_glib_shutdown(void); void _ecore_job_init(void); void _ecore_job_shutdown(void); void _ecore_main_loop_init(void); void _ecore_main_loop_shutdown(void); void _ecore_main_loop_iterate(Eo *obj, Efl_Loop_Data *pd); int _ecore_main_loop_iterate_may_block(Eo *obj, Efl_Loop_Data *pd, int may_block); void _ecore_main_loop_begin(Eo *obj, Efl_Loop_Data *pd); void _ecore_main_loop_quit(Eo *obj, Efl_Loop_Data *pd); void _ecore_coroutine_init(void); void _ecore_coroutine_shutdown(void); void _ecore_throttle(void); void _ecore_main_call_flush(void); void _ecore_main_timechanges_start(Eo *obj); void _ecore_main_timechanges_stop(Eo *obj); Eina_Bool _ecore_event_do_filter(void *handler_pd, Eo *msg_handler, Eo *msg); void _ecore_event_filters_call(Eo *obj, Efl_Loop_Data *pd); void _efl_loop_messages_filter(Eo *obj, Efl_Loop_Data *pd, void *handler_pd); void _efl_loop_messages_call(Eo *obj, Efl_Loop_Data *pd, void *func, void *data); void _efl_loop_message_send_info_set(Eo *obj, Eina_Inlist *node, Eo *loop, Efl_Loop_Data *loop_data); void _efl_loop_message_unsend(Eo *obj); void _efl_thread_child_remove(Eo *loop, Efl_Loop_Data *pd, Eo *child); static inline Eina_Bool _ecore_call_task_cb(Ecore_Task_Cb func, void *data) { return func(data); } static inline void * _ecore_call_data_cb(Ecore_Data_Cb func, void *data) { return func(data); } static inline void _ecore_call_end_cb(Ecore_End_Cb func, void *user_data, void *func_data) { func(user_data, func_data); } static inline Eina_Bool _ecore_call_filter_cb(Ecore_Filter_Cb func, void *data, void *loop_data, int type, void *event) { return func(data, loop_data, type, event); } static inline Eina_Bool _ecore_call_handler_cb(Ecore_Event_Handler_Cb func, void *data, int type, void *event) { return func(data, type, event); } static inline void _ecore_call_prep_cb(Ecore_Fd_Prep_Cb func, void *data, Ecore_Fd_Handler *fd_handler) { func(data, fd_handler); } static inline Eina_Bool _ecore_call_fd_cb(Ecore_Fd_Cb func, void *data, Ecore_Fd_Handler *fd_handler) { return func(data, fd_handler); } extern int _ecore_fps_debug; extern Eina_Bool _ecore_glib_always_integrate; extern Ecore_Select_Function main_loop_select; extern int in_main_loop; #ifdef HAVE_SYSTEMD void _ecore_sd_init(void); extern int (*_ecore_sd_notify) (int unset_environment, const char *state); #endif Eina_Bool ecore_mempool_init(void); void ecore_mempool_shutdown(void); #define GENERIC_ALLOC_FREE_HEADER(TYPE, Type) \ TYPE *Type##_calloc(unsigned int); \ void Type##_mp_free(TYPE *e); #define GENERIC_ALLOC_SIZE_DECLARE(TYPE) \ size_t _ecore_sizeof_##TYPE = sizeof (TYPE); //GENERIC_ALLOC_FREE_HEADER(Ecore_Animator, ecore_animator); //GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Handler, ecore_event_handler); //GENERIC_ALLOC_FREE_HEADER(Ecore_Event_Filter, ecore_event_filter); //GENERIC_ALLOC_FREE_HEADER(Ecore_Event, ecore_event); //GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Exiter, ecore_idle_exiter); //GENERIC_ALLOC_FREE_HEADER(Ecore_Idle_Enterer, ecore_idle_enterer); //GENERIC_ALLOC_FREE_HEADER(Ecore_Idler, ecore_idler); //GENERIC_ALLOC_FREE_HEADER(Ecore_Job, ecore_job); //GENERIC_ALLOC_FREE_HEADER(Ecore_Timer, ecore_timer); //GENERIC_ALLOC_FREE_HEADER(Ecore_Poller, ecore_poller); GENERIC_ALLOC_FREE_HEADER(Ecore_Pipe, ecore_pipe); GENERIC_ALLOC_FREE_HEADER(Ecore_Fd_Handler, ecore_fd_handler); GENERIC_ALLOC_FREE_HEADER(Efl_Loop_Promise_Simple_Data, efl_loop_promise_simple_data); #ifdef _WIN32 GENERIC_ALLOC_FREE_HEADER(Ecore_Win32_Handler, ecore_win32_handler); #endif #undef GENERIC_ALLOC_FREE_HEADER extern Eo *_mainloop_singleton; extern Efl_Loop_Data *_mainloop_singleton_data; #define ML_OBJ _mainloop_singleton #define ML_DAT _mainloop_singleton_data //#define ML_DAT efl_data_scope_get(ML_OBJ, EFL_LOOP_CLASS) extern Efl_Version _app_efl_version; // access to direct input cb #define ECORE_EVAS_INTERNAL #define EFL_LOOP_DATA efl_data_scope_get(efl_main_loop_get(), EFL_LOOP_CLASS) #undef EAPI #define EAPI #endif