b79a9cd0987bcb99e1f06482f90578a0eb56ab70
[framework/uifw/ecore.git] / src / lib / ecore / Ecore.h
1 #ifndef _ECORE_H
2 #define _ECORE_H
3
4 #ifdef EAPI
5 # undef EAPI
6 #endif
7
8 #ifdef _WIN32
9 # ifdef EFL_ECORE_BUILD
10 #  ifdef DLL_EXPORT
11 #   define EAPI __declspec(dllexport)
12 #  else
13 #   define EAPI
14 #  endif /* ! DLL_EXPORT */
15 # else
16 #  define EAPI __declspec(dllimport)
17 # endif /* ! EFL_ECORE_BUILD */
18 #else
19 # ifdef __GNUC__
20 #  if __GNUC__ >= 4
21 #   define EAPI __attribute__ ((visibility("default")))
22 #  else
23 #   define EAPI
24 #  endif
25 # else
26 #  define EAPI
27 # endif
28 #endif /* ! _WIN32 */
29
30 /**
31  * @file Ecore.h
32  * @brief The file that provides the program utility, main loop and timer
33  *        functions.
34  *
35  * This header provides the Ecore event handling loop.  For more
36  * details, see @ref Ecore_Main_Loop_Group.
37  *
38  * For the main loop to be of any use, you need to be able to add events
39  * and event handlers.  Events for file descriptor events are covered in
40  * @ref Ecore_FD_Handler_Group.
41  *
42  * Time functions are covered in @ref Ecore_Time_Group.
43  *
44  * There is also provision for callbacks for when the loop enters or
45  * exits an idle state. See @ref Idle_Group for more information.
46  *
47  * Functions are also provided for spawning child processes using fork.
48  * See @ref Ecore_Exe_Basic_Group and @ref Ecore_Exe_Signal_Group for
49  * more details.
50  */
51
52 #ifndef _ECORE_PRIVATE_H
53 #include <sys/types.h>
54 #include <signal.h>
55 #endif
56
57 #ifndef TRUE
58 #define TRUE 1
59 #endif
60
61 #ifndef FALSE
62 #define FALSE 0
63 #endif
64
65 #ifdef __cplusplus
66 extern "C" {
67 #endif
68
69 #define ECORE_CALLBACK_CANCEL 0 /**< Return value to remove a callback */
70 #define ECORE_CALLBACK_RENEW 1  /**< Return value to keep a callback */
71
72 #define ECORE_EVENT_NONE            0
73 #define ECORE_EVENT_SIGNAL_USER     1 /**< User signal event */
74 #define ECORE_EVENT_SIGNAL_HUP      2 /**< Hup signal event */
75 #define ECORE_EVENT_SIGNAL_EXIT     3 /**< Exit signal event */
76 #define ECORE_EVENT_SIGNAL_POWER    4 /**< Power signal event */
77 #define ECORE_EVENT_SIGNAL_REALTIME 5 /**< Realtime signal event */
78 #define ECORE_EVENT_COUNT           6
79
80    EAPI extern int ECORE_EXE_EVENT_ADD; /**< A child process has been added */
81    EAPI extern int ECORE_EXE_EVENT_DEL; /**< A child process has been deleted (it exited, naming consistant with the rest of ecore). */
82    EAPI extern int ECORE_EXE_EVENT_DATA; /**< Data from a child process. */
83    EAPI extern int ECORE_EXE_EVENT_ERROR; /**< Errors from a child process. */
84
85 #ifndef _ECORE_PRIVATE_H
86    enum _Ecore_Fd_Handler_Flags
87      {
88         ECORE_FD_READ = 1, /**< Fd Read mask */
89         ECORE_FD_WRITE = 2, /**< Fd Write mask */
90         ECORE_FD_ERROR = 4 /**< Fd Error mask */
91      };
92    typedef enum _Ecore_Fd_Handler_Flags Ecore_Fd_Handler_Flags;
93
94    enum _Ecore_Exe_Flags /* flags for executing a child with its stdin and/or stdout piped back */
95      {
96         ECORE_EXE_PIPE_READ = 1, /**< Exe Pipe Read mask */
97         ECORE_EXE_PIPE_WRITE = 2, /**< Exe Pipe Write mask */
98         ECORE_EXE_PIPE_ERROR = 4, /**< Exe Pipe error mask */
99         ECORE_EXE_PIPE_READ_LINE_BUFFERED = 8, /**< Reads are buffered until a newline and delivered 1 event per line */
100         ECORE_EXE_PIPE_ERROR_LINE_BUFFERED = 16, /**< Errors are buffered until a newline and delivered 1 event per line */
101         ECORE_EXE_PIPE_AUTO = 32, /**< stdout and stderr are buffered automatically */
102         ECORE_EXE_RESPAWN = 64, /**< FIXME: Exe is restarted if it dies */
103         ECORE_EXE_USE_SH = 128, /**< Use /bin/sh to run the command. */
104         ECORE_EXE_NOT_LEADER = 256 /**< Do not use setsid() to have the executed process be its own session leader */
105      };
106    typedef enum _Ecore_Exe_Flags Ecore_Exe_Flags;
107
108    enum _Ecore_Poller_Type /* Poller types */
109      {
110         ECORE_POLLER_CORE = 0 /**< The core poller interval */
111      };
112    typedef enum _Ecore_Poller_Type Ecore_Poller_Type;
113
114 #ifndef _WIN32
115    typedef void Ecore_Exe; /**< A handle for spawned processes */
116 #endif
117    typedef void Ecore_Timer; /**< A handle for timers */
118    typedef void Ecore_Idler; /**< A handle for idlers */
119    typedef void Ecore_Idle_Enterer; /**< A handle for idle enterers */
120    typedef void Ecore_Idle_Exiter; /**< A handle for idle exiters */
121    typedef void Ecore_Fd_Handler; /**< A handle for Fd hanlders */
122    typedef void Ecore_Event_Handler; /**< A handle for an event handler */
123    typedef void Ecore_Event_Filter; /**< A handle for an event filter */
124    typedef void Ecore_Event; /**< A handle for an event */
125    typedef void Ecore_Animator; /**< A handle for animators */
126    typedef void Ecore_Poller; /**< A handle for pollers */
127 #endif
128    typedef struct _Ecore_Event_Signal_User     Ecore_Event_Signal_User; /**< User signal event */
129    typedef struct _Ecore_Event_Signal_Hup      Ecore_Event_Signal_Hup; /**< Hup signal event */
130    typedef struct _Ecore_Event_Signal_Exit     Ecore_Event_Signal_Exit; /**< Exit signal event */
131    typedef struct _Ecore_Event_Signal_Power    Ecore_Event_Signal_Power; /**< Power signal event */
132    typedef struct _Ecore_Event_Signal_Realtime Ecore_Event_Signal_Realtime; /**< Realtime signal event */
133    typedef struct _Ecore_Exe_Event_Add         Ecore_Exe_Event_Add; /**< Spawned Exe add event */
134    typedef struct _Ecore_Exe_Event_Del         Ecore_Exe_Event_Del; /**< Spawned Exe exit event */
135    typedef struct _Ecore_Exe_Event_Data_Line   Ecore_Exe_Event_Data_Line; /**< Lines from a child process */
136    typedef struct _Ecore_Exe_Event_Data        Ecore_Exe_Event_Data; /**< Data from a child process */
137
138    struct _Ecore_Event_Signal_User /** User signal event */
139      {
140         int   number; /**< The signal number. Either 1 or 2 */
141         void *ext_data; /**< Extension data - not used */
142
143 #ifndef _WIN32
144         siginfo_t data; /**< Signal info */
145 #endif
146      };
147
148    struct _Ecore_Event_Signal_Hup /** Hup signal event */
149      {
150         void *ext_data; /**< Extension data - not used */
151
152 #ifndef _WIN32
153         siginfo_t data; /**< Signal info */
154 #endif
155      };
156
157    struct _Ecore_Event_Signal_Exit /** Exit request event */
158      {
159         unsigned int   interrupt : 1; /**< Set if the exit request was an interrupt  signal*/
160         unsigned int   quit      : 1; /**< set if the exit request was a quit signal */
161         unsigned int   terminate : 1; /**< Set if the exit request was a terminate singal */
162         void          *ext_data;        /**< Extension data - not used */
163
164 #ifndef _WIN32
165         siginfo_t data; /**< Signal info */
166 #endif
167      };
168
169    struct _Ecore_Event_Signal_Power /** Power event */
170      {
171         void *ext_data; /**< Extension data - not used */
172
173 #ifndef _WIN32
174         siginfo_t data; /**< Signal info */
175 #endif
176      };
177
178    struct _Ecore_Event_Signal_Realtime /** Realtime event */
179      {
180         int num; /**< The realtime signal's number */
181
182 #ifndef _WIN32
183         siginfo_t data; /**< Signal info */
184 #endif
185      };
186
187 #ifndef _WIN32
188    struct _Ecore_Exe_Event_Add /** Process add event */
189      {
190         Ecore_Exe *exe; /**< The handle to the added process */
191         void      *ext_data; /**< Extension data - not used */
192      };
193
194    struct _Ecore_Exe_Event_Del /** Process exit event */
195      {
196         pid_t         pid; /**< The process ID of the process that exited */
197         int           exit_code; /**< The exit code of the process */
198         Ecore_Exe    *exe; /**< The handle to the exited process, or NULL if not found */
199         int           exit_signal; /** < The signal that caused the process to exit */
200         unsigned int  exited    : 1; /** < set to 1 if the process exited of its own accord */
201         unsigned int  signalled : 1; /** < set to 1 id the process exited due to uncaught signal */
202         void         *ext_data; /**< Extension data - not used */
203         siginfo_t     data; /**< Signal info */
204      };
205
206    struct _Ecore_Exe_Event_Data_Line /**< Lines from a child process */
207       {
208          char *line;
209          int   size;
210       };
211
212    struct _Ecore_Exe_Event_Data /** Data from a child process event */
213      {
214         Ecore_Exe *exe; /**< The handle to the process */
215         void *data; /**< the raw binary data from the child process that was recieved */
216         int   size; /**< the size of this data in bytes */
217         Ecore_Exe_Event_Data_Line *lines; /**< an array of line data if line buffered, the last one has it's line member set to NULL */
218      };
219 #endif
220
221    EAPI int  ecore_init(void);
222    EAPI int  ecore_shutdown(void);
223
224    EAPI void ecore_app_args_set(int argc, const char **argv);
225    EAPI void ecore_app_args_get(int *argc, char ***argv);
226    EAPI void ecore_app_restart(void);
227
228    EAPI Ecore_Event_Handler *ecore_event_handler_add(int type, int (*func) (void *data, int type, void *event), const void *data);
229    EAPI void                *ecore_event_handler_del(Ecore_Event_Handler *event_handler);
230    EAPI Ecore_Event         *ecore_event_add(int type, void *ev, void (*func_free) (void *data, void *ev), void *data);
231    EAPI void                *ecore_event_del(Ecore_Event *event);
232    EAPI int                  ecore_event_type_new(void);
233    EAPI Ecore_Event_Filter  *ecore_event_filter_add(void * (*func_start) (void *data), int (*func_filter) (void *data, void *loop_data, int type, void *event), void (*func_end) (void *data, void *loop_data), const void *data);
234    EAPI void                *ecore_event_filter_del(Ecore_Event_Filter *ef);
235    EAPI int                  ecore_event_current_type_get(void);
236    EAPI void                *ecore_event_current_event_get(void);
237
238
239 #ifndef _WIN32
240    EAPI Ecore_Exe  *ecore_exe_run(const char *exe_cmd, const void *data);
241    EAPI Ecore_Exe  *ecore_exe_pipe_run(const char *exe_cmd, Ecore_Exe_Flags flags, const void *data);
242    EAPI int         ecore_exe_send(Ecore_Exe *exe, void *data, int size);
243    EAPI void        ecore_exe_close_stdin(Ecore_Exe *exe);
244    EAPI void        ecore_exe_auto_limits_set(Ecore_Exe *exe, int start_bytes, int end_bytes, int start_lines, int end_lines);
245    EAPI Ecore_Exe_Event_Data *ecore_exe_event_data_get(Ecore_Exe *exe, Ecore_Exe_Flags flags);
246    EAPI void        ecore_exe_event_data_free(Ecore_Exe_Event_Data *data);
247    EAPI void       *ecore_exe_free(Ecore_Exe *exe);
248    EAPI pid_t       ecore_exe_pid_get(Ecore_Exe *exe);
249    EAPI void        ecore_exe_tag_set(Ecore_Exe *exe, const char *tag);
250    EAPI char       *ecore_exe_tag_get(Ecore_Exe *exe);
251    EAPI char       *ecore_exe_cmd_get(Ecore_Exe *exe);
252    EAPI void       *ecore_exe_data_get(Ecore_Exe *exe);
253    EAPI void        ecore_exe_pause(Ecore_Exe *exe);
254    EAPI void        ecore_exe_continue(Ecore_Exe *exe);
255    EAPI void        ecore_exe_interrupt(Ecore_Exe *exe);
256    EAPI void        ecore_exe_quit(Ecore_Exe *exe);
257    EAPI void        ecore_exe_terminate(Ecore_Exe *exe);
258    EAPI void        ecore_exe_kill(Ecore_Exe *exe);
259    EAPI void        ecore_exe_signal(Ecore_Exe *exe, int num);
260    EAPI void        ecore_exe_hup(Ecore_Exe *exe);
261 #endif
262
263    EAPI Ecore_Idler *ecore_idler_add(int (*func) (void *data), const void *data);
264    EAPI void        *ecore_idler_del(Ecore_Idler *idler);
265
266    EAPI Ecore_Idle_Enterer *ecore_idle_enterer_add(int (*func) (void *data), const void *data);
267    EAPI Ecore_Idle_Enterer *ecore_idle_enterer_before_add(int (*func) (void *data), const void *data);
268    EAPI void               *ecore_idle_enterer_del(Ecore_Idle_Enterer *idle_enterer);
269
270    EAPI Ecore_Idle_Exiter *ecore_idle_exiter_add(int (*func) (void *data), const void *data);
271    EAPI void              *ecore_idle_exiter_del(Ecore_Idle_Exiter *idle_exiter);
272
273    EAPI void              ecore_main_loop_iterate(void);
274    EAPI void              ecore_main_loop_begin(void);
275    EAPI void              ecore_main_loop_quit(void);
276    EAPI Ecore_Fd_Handler *ecore_main_fd_handler_add(int fd, Ecore_Fd_Handler_Flags flags, int (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data, int (*buf_func) (void *buf_data, Ecore_Fd_Handler *fd_handler), const void *buf_data);
277    EAPI void              ecore_main_fd_handler_prepare_callback_set(Ecore_Fd_Handler *fd_handler, void (*func) (void *data, Ecore_Fd_Handler *fd_handler), const void *data);
278    EAPI void             *ecore_main_fd_handler_del(Ecore_Fd_Handler *fd_handler);
279    EAPI int               ecore_main_fd_handler_fd_get(Ecore_Fd_Handler *fd_handler);
280    EAPI int               ecore_main_fd_handler_active_get(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
281    EAPI void              ecore_main_fd_handler_active_set(Ecore_Fd_Handler *fd_handler, Ecore_Fd_Handler_Flags flags);
282
283    EAPI double ecore_time_get(void);
284
285    EAPI Ecore_Timer *ecore_timer_add(double in, int (*func) (void *data), const void *data);
286    EAPI void        *ecore_timer_del(Ecore_Timer *timer);
287    EAPI void         ecore_timer_interval_set(Ecore_Timer *timer, double in);
288    EAPI void         ecore_timer_freeze(Ecore_Timer *timer);
289    EAPI void         ecore_timer_thaw(Ecore_Timer *timer);
290    EAPI void         ecore_timer_delay(Ecore_Timer *timer, double add);
291    EAPI double       ecore_timer_pending_get(Ecore_Timer *timer);
292
293    EAPI Ecore_Animator *ecore_animator_add(int (*func) (void *data), const void *data);
294    EAPI void           *ecore_animator_del(Ecore_Animator *animator);
295    EAPI void            ecore_animator_frametime_set(double frametime);
296    EAPI double          ecore_animator_frametime_get(void);
297
298    EAPI void          ecore_poller_poll_interval_set(Ecore_Poller_Type type, double poll_time);
299    EAPI double        ecore_poller_poll_interval_get(Ecore_Poller_Type type);
300    EAPI Ecore_Poller *ecore_poller_add(Ecore_Poller_Type type, int interval, int (*func) (void *data), const void *data);
301    EAPI void         *ecore_poller_del(Ecore_Poller *poller);
302
303
304 #ifdef __cplusplus
305 }
306 #endif
307 #endif