1 | /* gmain.h - the GLib Main loop |
---|
2 | * Copyright (C) 1998-2000 Red Hat, Inc. |
---|
3 | * |
---|
4 | * This library is free software; you can redistribute it and/or |
---|
5 | * modify it under the terms of the GNU Library General Public |
---|
6 | * License as published by the Free Software Foundation; either |
---|
7 | * version 2 of the License, or (at your option) any later version. |
---|
8 | * |
---|
9 | * This library is distributed in the hope that it will be useful, |
---|
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
12 | * Library General Public License for more details. |
---|
13 | * |
---|
14 | * You should have received a copy of the GNU Library General Public |
---|
15 | * License along with this library; if not, write to the |
---|
16 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
---|
17 | * Boston, MA 02111-1307, USA. |
---|
18 | */ |
---|
19 | |
---|
20 | #ifndef __G_MAIN_H__ |
---|
21 | #define __G_MAIN_H__ |
---|
22 | |
---|
23 | #include <glib/gslist.h> |
---|
24 | #include <glib/gthread.h> |
---|
25 | |
---|
26 | G_BEGIN_DECLS |
---|
27 | |
---|
28 | typedef struct _GMainContext GMainContext; /* Opaque */ |
---|
29 | typedef struct _GMainLoop GMainLoop; /* Opaque */ |
---|
30 | typedef struct _GSource GSource; |
---|
31 | typedef struct _GSourceCallbackFuncs GSourceCallbackFuncs; |
---|
32 | typedef struct _GSourceFuncs GSourceFuncs; |
---|
33 | |
---|
34 | typedef gboolean (*GSourceFunc) (gpointer data); |
---|
35 | typedef void (*GChildWatchFunc) (GPid pid, |
---|
36 | gint status, |
---|
37 | gpointer data); |
---|
38 | struct _GSource |
---|
39 | { |
---|
40 | /*< private >*/ |
---|
41 | gpointer callback_data; |
---|
42 | GSourceCallbackFuncs *callback_funcs; |
---|
43 | |
---|
44 | GSourceFuncs *source_funcs; |
---|
45 | guint ref_count; |
---|
46 | |
---|
47 | GMainContext *context; |
---|
48 | |
---|
49 | gint priority; |
---|
50 | guint flags; |
---|
51 | guint source_id; |
---|
52 | |
---|
53 | GSList *poll_fds; |
---|
54 | |
---|
55 | GSource *prev; |
---|
56 | GSource *next; |
---|
57 | |
---|
58 | gpointer reserved1; |
---|
59 | gpointer reserved2; |
---|
60 | }; |
---|
61 | |
---|
62 | struct _GSourceCallbackFuncs |
---|
63 | { |
---|
64 | void (*ref) (gpointer cb_data); |
---|
65 | void (*unref) (gpointer cb_data); |
---|
66 | void (*get) (gpointer cb_data, |
---|
67 | GSource *source, |
---|
68 | GSourceFunc *func, |
---|
69 | gpointer *data); |
---|
70 | }; |
---|
71 | |
---|
72 | typedef void (*GSourceDummyMarshal) (void); |
---|
73 | |
---|
74 | struct _GSourceFuncs |
---|
75 | { |
---|
76 | gboolean (*prepare) (GSource *source, |
---|
77 | gint *timeout_); |
---|
78 | gboolean (*check) (GSource *source); |
---|
79 | gboolean (*dispatch) (GSource *source, |
---|
80 | GSourceFunc callback, |
---|
81 | gpointer user_data); |
---|
82 | void (*finalize) (GSource *source); /* Can be NULL */ |
---|
83 | |
---|
84 | /* For use by g_source_set_closure */ |
---|
85 | GSourceFunc closure_callback; |
---|
86 | GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */ |
---|
87 | }; |
---|
88 | |
---|
89 | /* Any definitions using GPollFD or GPollFunc are primarily |
---|
90 | * for Unix and not guaranteed to be the compatible on all |
---|
91 | * operating systems on which GLib runs. Right now, the |
---|
92 | * GLib does use these functions on Win32 as well, but interprets |
---|
93 | * them in a fairly different way than on Unix. If you use |
---|
94 | * these definitions, you are should be prepared to recode |
---|
95 | * for different operating systems. |
---|
96 | * |
---|
97 | * |
---|
98 | * On Win32, the fd in a GPollFD should be Win32 HANDLE (*not* a file |
---|
99 | * descriptor as provided by the C runtime) that can be used by |
---|
100 | * MsgWaitForMultipleObjects. This does *not* include file handles |
---|
101 | * from CreateFile, SOCKETs, nor pipe handles. (But you can use |
---|
102 | * WSAEventSelect to signal events when a SOCKET is readable). |
---|
103 | * |
---|
104 | * On Win32, fd can also be the special value G_WIN32_MSG_HANDLE to |
---|
105 | * indicate polling for messages. |
---|
106 | * |
---|
107 | * But note that G_WIN32_MSG_HANDLE GPollFDs should not be used by GDK |
---|
108 | * (GTK) programs, as GDK itself wants to read messages and convert them |
---|
109 | * to GDK events. |
---|
110 | * |
---|
111 | * So, unless you really know what you are doing, it's best not to try |
---|
112 | * to use the main loop polling stuff for your own needs on |
---|
113 | * Win32. It's really only written for the GIMP's needs so |
---|
114 | * far. |
---|
115 | */ |
---|
116 | typedef struct _GPollFD GPollFD; |
---|
117 | typedef gint (*GPollFunc) (GPollFD *ufds, |
---|
118 | guint nfsd, |
---|
119 | gint timeout_); |
---|
120 | |
---|
121 | struct _GPollFD |
---|
122 | { |
---|
123 | gint fd; |
---|
124 | gushort events; |
---|
125 | gushort revents; |
---|
126 | }; |
---|
127 | |
---|
128 | /* Standard priorities */ |
---|
129 | |
---|
130 | #define G_PRIORITY_HIGH -100 |
---|
131 | #define G_PRIORITY_DEFAULT 0 |
---|
132 | #define G_PRIORITY_HIGH_IDLE 100 |
---|
133 | #define G_PRIORITY_DEFAULT_IDLE 200 |
---|
134 | #define G_PRIORITY_LOW 300 |
---|
135 | |
---|
136 | /* GMainContext: */ |
---|
137 | |
---|
138 | GMainContext *g_main_context_new (void); |
---|
139 | void g_main_context_ref (GMainContext *context); |
---|
140 | void g_main_context_unref (GMainContext *context); |
---|
141 | GMainContext *g_main_context_default (void); |
---|
142 | |
---|
143 | gboolean g_main_context_iteration (GMainContext *context, |
---|
144 | gboolean may_block); |
---|
145 | gboolean g_main_context_pending (GMainContext *context); |
---|
146 | |
---|
147 | /* For implementation of legacy interfaces |
---|
148 | */ |
---|
149 | GSource *g_main_context_find_source_by_id (GMainContext *context, |
---|
150 | guint source_id); |
---|
151 | GSource *g_main_context_find_source_by_user_data (GMainContext *context, |
---|
152 | gpointer user_data); |
---|
153 | GSource *g_main_context_find_source_by_funcs_user_data (GMainContext *context, |
---|
154 | GSourceFuncs *funcs, |
---|
155 | gpointer user_data); |
---|
156 | |
---|
157 | /* Low level functions for implementing custom main loops. |
---|
158 | */ |
---|
159 | void g_main_context_wakeup (GMainContext *context); |
---|
160 | gboolean g_main_context_acquire (GMainContext *context); |
---|
161 | void g_main_context_release (GMainContext *context); |
---|
162 | gboolean g_main_context_wait (GMainContext *context, |
---|
163 | GCond *cond, |
---|
164 | GMutex *mutex); |
---|
165 | |
---|
166 | gboolean g_main_context_prepare (GMainContext *context, |
---|
167 | gint *priority); |
---|
168 | gint g_main_context_query (GMainContext *context, |
---|
169 | gint max_priority, |
---|
170 | gint *timeout_, |
---|
171 | GPollFD *fds, |
---|
172 | gint n_fds); |
---|
173 | gint g_main_context_check (GMainContext *context, |
---|
174 | gint max_priority, |
---|
175 | GPollFD *fds, |
---|
176 | gint n_fds); |
---|
177 | void g_main_context_dispatch (GMainContext *context); |
---|
178 | |
---|
179 | void g_main_context_set_poll_func (GMainContext *context, |
---|
180 | GPollFunc func); |
---|
181 | GPollFunc g_main_context_get_poll_func (GMainContext *context); |
---|
182 | |
---|
183 | /* Low level functions for use by source implementations |
---|
184 | */ |
---|
185 | void g_main_context_add_poll (GMainContext *context, |
---|
186 | GPollFD *fd, |
---|
187 | gint priority); |
---|
188 | void g_main_context_remove_poll (GMainContext *context, |
---|
189 | GPollFD *fd); |
---|
190 | |
---|
191 | int g_main_depth (void); |
---|
192 | |
---|
193 | /* GMainLoop: */ |
---|
194 | |
---|
195 | GMainLoop *g_main_loop_new (GMainContext *context, |
---|
196 | gboolean is_running); |
---|
197 | void g_main_loop_run (GMainLoop *loop); |
---|
198 | void g_main_loop_quit (GMainLoop *loop); |
---|
199 | GMainLoop *g_main_loop_ref (GMainLoop *loop); |
---|
200 | void g_main_loop_unref (GMainLoop *loop); |
---|
201 | gboolean g_main_loop_is_running (GMainLoop *loop); |
---|
202 | GMainContext *g_main_loop_get_context (GMainLoop *loop); |
---|
203 | |
---|
204 | /* GSource: */ |
---|
205 | |
---|
206 | GSource *g_source_new (GSourceFuncs *source_funcs, |
---|
207 | guint struct_size); |
---|
208 | GSource *g_source_ref (GSource *source); |
---|
209 | void g_source_unref (GSource *source); |
---|
210 | |
---|
211 | guint g_source_attach (GSource *source, |
---|
212 | GMainContext *context); |
---|
213 | void g_source_destroy (GSource *source); |
---|
214 | |
---|
215 | void g_source_set_priority (GSource *source, |
---|
216 | gint priority); |
---|
217 | gint g_source_get_priority (GSource *source); |
---|
218 | void g_source_set_can_recurse (GSource *source, |
---|
219 | gboolean can_recurse); |
---|
220 | gboolean g_source_get_can_recurse (GSource *source); |
---|
221 | guint g_source_get_id (GSource *source); |
---|
222 | |
---|
223 | GMainContext *g_source_get_context (GSource *source); |
---|
224 | |
---|
225 | void g_source_set_callback (GSource *source, |
---|
226 | GSourceFunc func, |
---|
227 | gpointer data, |
---|
228 | GDestroyNotify notify); |
---|
229 | |
---|
230 | |
---|
231 | /* Used to implement g_source_connect_closure and internally*/ |
---|
232 | void g_source_set_callback_indirect (GSource *source, |
---|
233 | gpointer callback_data, |
---|
234 | GSourceCallbackFuncs *callback_funcs); |
---|
235 | |
---|
236 | void g_source_add_poll (GSource *source, |
---|
237 | GPollFD *fd); |
---|
238 | void g_source_remove_poll (GSource *source, |
---|
239 | GPollFD *fd); |
---|
240 | |
---|
241 | void g_source_get_current_time (GSource *source, |
---|
242 | GTimeVal *timeval); |
---|
243 | |
---|
244 | /* void g_source_connect_closure (GSource *source, |
---|
245 | GClosure *closure); |
---|
246 | */ |
---|
247 | |
---|
248 | /* Specific source types |
---|
249 | */ |
---|
250 | GSource *g_idle_source_new (void); |
---|
251 | GSource *g_child_watch_source_new (GPid pid); |
---|
252 | GSource *g_timeout_source_new (guint interval); |
---|
253 | |
---|
254 | /* Miscellaneous functions |
---|
255 | */ |
---|
256 | void g_get_current_time (GTimeVal *result); |
---|
257 | |
---|
258 | /* ============== Compat main loop stuff ================== */ |
---|
259 | |
---|
260 | #ifndef G_DISABLE_DEPRECATED |
---|
261 | |
---|
262 | /* Legacy names for GMainLoop functions |
---|
263 | */ |
---|
264 | #define g_main_new(is_running) g_main_loop_new (NULL, is_running); |
---|
265 | #define g_main_run(loop) g_main_loop_run(loop) |
---|
266 | #define g_main_quit(loop) g_main_loop_quit(loop) |
---|
267 | #define g_main_destroy(loop) g_main_loop_unref(loop) |
---|
268 | #define g_main_is_running(loop) g_main_loop_is_running(loop) |
---|
269 | |
---|
270 | /* Functions to manipulate the default main loop |
---|
271 | */ |
---|
272 | |
---|
273 | #define g_main_iteration(may_block) g_main_context_iteration (NULL, may_block) |
---|
274 | #define g_main_pending() g_main_context_pending (NULL) |
---|
275 | |
---|
276 | #define g_main_set_poll_func(func) g_main_context_set_poll_func (NULL, func) |
---|
277 | |
---|
278 | #endif /* G_DISABLE_DEPRECATED */ |
---|
279 | |
---|
280 | /* Source manipulation by ID */ |
---|
281 | gboolean g_source_remove (guint tag); |
---|
282 | gboolean g_source_remove_by_user_data (gpointer user_data); |
---|
283 | gboolean g_source_remove_by_funcs_user_data (GSourceFuncs *funcs, |
---|
284 | gpointer user_data); |
---|
285 | |
---|
286 | /* Idles, child watchers and timeouts */ |
---|
287 | guint g_timeout_add_full (gint priority, |
---|
288 | guint interval, |
---|
289 | GSourceFunc function, |
---|
290 | gpointer data, |
---|
291 | GDestroyNotify notify); |
---|
292 | guint g_timeout_add (guint interval, |
---|
293 | GSourceFunc function, |
---|
294 | gpointer data); |
---|
295 | guint g_child_watch_add_full (gint priority, |
---|
296 | GPid pid, |
---|
297 | GChildWatchFunc function, |
---|
298 | gpointer data, |
---|
299 | GDestroyNotify notify); |
---|
300 | guint g_child_watch_add (GPid pid, |
---|
301 | GChildWatchFunc function, |
---|
302 | gpointer data); |
---|
303 | guint g_idle_add (GSourceFunc function, |
---|
304 | gpointer data); |
---|
305 | guint g_idle_add_full (gint priority, |
---|
306 | GSourceFunc function, |
---|
307 | gpointer data, |
---|
308 | GDestroyNotify notify); |
---|
309 | gboolean g_idle_remove_by_data (gpointer data); |
---|
310 | |
---|
311 | /* Hook for GClosure / GSource integration. Don't touch */ |
---|
312 | GLIB_VAR GSourceFuncs g_timeout_funcs; |
---|
313 | GLIB_VAR GSourceFuncs g_child_watch_funcs; |
---|
314 | GLIB_VAR GSourceFuncs g_idle_funcs; |
---|
315 | |
---|
316 | G_END_DECLS |
---|
317 | |
---|
318 | #endif /* __G_MAIN_H__ */ |
---|