Change LGPL-2.1+ to LGPL-2.1-or-later
[platform/upstream/glib.git] / glib / gmain.h
1 /* gmain.h - the GLib Main loop
2  * Copyright (C) 1998-2000 Red Hat, Inc.
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef __G_MAIN_H__
21 #define __G_MAIN_H__
22
23 #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
24 #error "Only <glib.h> can be included directly."
25 #endif
26
27 #include <glib/gpoll.h>
28 #include <glib/gslist.h>
29 #include <glib/gthread.h>
30
31 G_BEGIN_DECLS
32
33 typedef enum /*< flags >*/
34 {
35   G_IO_IN       GLIB_SYSDEF_POLLIN,
36   G_IO_OUT      GLIB_SYSDEF_POLLOUT,
37   G_IO_PRI      GLIB_SYSDEF_POLLPRI,
38   G_IO_ERR      GLIB_SYSDEF_POLLERR,
39   G_IO_HUP      GLIB_SYSDEF_POLLHUP,
40   G_IO_NVAL     GLIB_SYSDEF_POLLNVAL
41 } GIOCondition;
42
43 /**
44  * GMainContextFlags:
45  * @G_MAIN_CONTEXT_FLAGS_NONE: Default behaviour.
46  * @G_MAIN_CONTEXT_FLAGS_OWNERLESS_POLLING: Assume that polling for events will
47  * free the thread to process other jobs. That's useful if you're using
48  * `g_main_context_{prepare,query,check,dispatch}` to integrate GMainContext in
49  * other event loops.
50  *
51  * Flags to pass to g_main_context_new_with_flags() which affect the behaviour
52  * of a #GMainContext.
53  *
54  * Since: 2.72
55  */
56 GLIB_AVAILABLE_TYPE_IN_2_72
57 typedef enum /*< flags >*/
58 {
59   G_MAIN_CONTEXT_FLAGS_NONE = 0,
60   G_MAIN_CONTEXT_FLAGS_OWNERLESS_POLLING = 1
61 } GMainContextFlags;
62
63
64 /**
65  * GMainContext:
66  *
67  * The `GMainContext` struct is an opaque data
68  * type representing a set of sources to be handled in a main loop.
69  */
70 typedef struct _GMainContext            GMainContext;
71
72 /**
73  * GMainLoop:
74  *
75  * The `GMainLoop` struct is an opaque data type
76  * representing the main event loop of a GLib or GTK application.
77  */
78 typedef struct _GMainLoop               GMainLoop;
79
80 /**
81  * GSource:
82  *
83  * The `GSource` struct is an opaque data type
84  * representing an event source.
85  */
86 typedef struct _GSource                 GSource;
87 typedef struct _GSourcePrivate          GSourcePrivate;
88
89 /**
90  * GSourceCallbackFuncs:
91  * @ref: Called when a reference is added to the callback object
92  * @unref: Called when a reference to the callback object is dropped
93  * @get: Called to extract the callback function and data from the
94  *     callback object.
95  *
96  * The `GSourceCallbackFuncs` struct contains
97  * functions for managing callback objects.
98  */
99 typedef struct _GSourceCallbackFuncs    GSourceCallbackFuncs;
100
101 /**
102  * GSourceFuncs:
103  * @prepare: Called before all the file descriptors are polled. If the
104  *     source can determine that it is ready here (without waiting for the
105  *     results of the poll() call) it should return %TRUE. It can also return
106  *     a @timeout_ value which should be the maximum timeout (in milliseconds)
107  *     which should be passed to the poll() call. The actual timeout used will
108  *     be -1 if all sources returned -1, or it will be the minimum of all
109  *     the @timeout_ values returned which were >= 0.  Since 2.36 this may
110  *     be %NULL, in which case the effect is as if the function always returns
111  *     %FALSE with a timeout of -1.  If @prepare returns a
112  *     timeout and the source also has a ready time set, then the
113  *     lower of the two will be used.
114  * @check: Called after all the file descriptors are polled. The source
115  *     should return %TRUE if it is ready to be dispatched. Note that some
116  *     time may have passed since the previous prepare function was called,
117  *     so the source should be checked again here.  Since 2.36 this may
118  *     be %NULL, in which case the effect is as if the function always returns
119  *     %FALSE.
120  * @dispatch: Called to dispatch the event source, after it has returned
121  *     %TRUE in either its @prepare or its @check function, or if a ready time
122  *     has been reached. The @dispatch function receives a callback function and
123  *     user data. The callback function may be %NULL if the source was never
124  *     connected to a callback using g_source_set_callback(). The @dispatch
125  *     function should call the callback function with @user_data and whatever
126  *     additional parameters are needed for this type of event source. The
127  *     return value of the @dispatch function should be %G_SOURCE_REMOVE if the
128  *     source should be removed or %G_SOURCE_CONTINUE to keep it.
129  * @finalize: Called when the source is finalized. At this point, the source
130  *     will have been destroyed, had its callback cleared, and have been removed
131  *     from its #GMainContext, but it will still have its final reference count,
132  *     so methods can be called on it from within this function.
133  *
134  * The `GSourceFuncs` struct contains a table of
135  * functions used to handle event sources in a generic manner.
136  *
137  * For idle sources, the prepare and check functions always return %TRUE
138  * to indicate that the source is always ready to be processed. The prepare
139  * function also returns a timeout value of 0 to ensure that the poll() call
140  * doesn't block (since that would be time wasted which could have been spent
141  * running the idle function).
142  *
143  * For timeout sources, the prepare and check functions both return %TRUE
144  * if the timeout interval has expired. The prepare function also returns
145  * a timeout value to ensure that the poll() call doesn't block too long
146  * and miss the next timeout.
147  *
148  * For file descriptor sources, the prepare function typically returns %FALSE,
149  * since it must wait until poll() has been called before it knows whether
150  * any events need to be processed. It sets the returned timeout to -1 to
151  * indicate that it doesn't mind how long the poll() call blocks. In the
152  * check function, it tests the results of the poll() call to see if the
153  * required condition has been met, and returns %TRUE if so.
154  */
155 typedef struct _GSourceFuncs            GSourceFuncs;
156
157 /**
158  * GPid:
159  *
160  * A type which is used to hold a process identification.
161  *
162  * On UNIX, processes are identified by a process id (an integer),
163  * while Windows uses process handles (which are pointers).
164  *
165  * GPid is used in GLib only for descendant processes spawned with
166  * the g_spawn functions.
167  */
168 /* defined in glibconfig.h */
169
170 /**
171  * G_PID_FORMAT:
172  *
173  * A format specifier that can be used in printf()-style format strings
174  * when printing a #GPid.
175  *
176  * Since: 2.50
177  */
178 /* defined in glibconfig.h */
179
180 /**
181  * GSourceFunc:
182  * @user_data: data passed to the function, set when the source was
183  *     created with one of the above functions
184  *
185  * Specifies the type of function passed to g_timeout_add(),
186  * g_timeout_add_full(), g_idle_add(), and g_idle_add_full().
187  *
188  * When calling g_source_set_callback(), you may need to cast a function of a
189  * different type to this type. Use G_SOURCE_FUNC() to avoid warnings about
190  * incompatible function types.
191  *
192  * Returns: %FALSE if the source should be removed. %G_SOURCE_CONTINUE and
193  * %G_SOURCE_REMOVE are more memorable names for the return value.
194  */
195 typedef gboolean (*GSourceFunc)       (gpointer user_data);
196
197 /**
198  * GSourceOnceFunc:
199  * @user_data: data passed to the function, set when the source was
200  *   created
201  *
202  * A source function that is only called once before being removed from the main
203  * context automatically.
204  *
205  * See: g_idle_add_once(), g_timeout_add_once()
206  *
207  * Since: 2.74
208  */
209 typedef void (* GSourceOnceFunc) (gpointer user_data);
210
211 /**
212  * G_SOURCE_FUNC:
213  * @f: a function pointer.
214  *
215  * Cast a function pointer to a #GSourceFunc, suppressing warnings from GCC 8
216  * onwards with `-Wextra` or `-Wcast-function-type` enabled about the function
217  * types being incompatible.
218  *
219  * For example, the correct type of callback for a source created by
220  * g_child_watch_source_new() is #GChildWatchFunc, which accepts more arguments
221  * than #GSourceFunc. Casting the function with `(GSourceFunc)` to call
222  * g_source_set_callback() will trigger a warning, even though it will be cast
223  * back to the correct type before it is called by the source.
224  *
225  * Since: 2.58
226  */
227 #define G_SOURCE_FUNC(f) ((GSourceFunc) (void (*)(void)) (f)) GLIB_AVAILABLE_MACRO_IN_2_58
228
229 /**
230  * GChildWatchFunc:
231  * @pid: the process id of the child process
232  * @wait_status: Status information about the child process, encoded
233  *               in a platform-specific manner
234  * @user_data: user data passed to g_child_watch_add()
235  *
236  * Prototype of a #GChildWatchSource callback, called when a child
237  * process has exited.
238  *
239  * To interpret @wait_status, see the documentation
240  * for g_spawn_check_wait_status(). In particular,
241  * on Unix platforms, note that it is usually not equal
242  * to the integer passed to `exit()` or returned from `main()`.
243  */
244 typedef void     (*GChildWatchFunc)   (GPid     pid,
245                                        gint     wait_status,
246                                        gpointer user_data);
247
248
249 /**
250  * GSourceDisposeFunc:
251  * @source: #GSource that is currently being disposed
252  *
253  * Dispose function for @source. See g_source_set_dispose_function() for
254  * details.
255  *
256  * Since: 2.64
257  */
258 GLIB_AVAILABLE_TYPE_IN_2_64
259 typedef void (*GSourceDisposeFunc)       (GSource *source);
260
261 struct _GSource
262 {
263   /*< private >*/
264   gpointer callback_data;
265   GSourceCallbackFuncs *callback_funcs;
266
267   const GSourceFuncs *source_funcs;
268   guint ref_count;
269
270   GMainContext *context;
271
272   gint priority;
273   guint flags;
274   guint source_id;
275
276   GSList *poll_fds;
277   
278   GSource *prev;
279   GSource *next;
280
281   char    *name;
282
283   GSourcePrivate *priv;
284 };
285
286 struct _GSourceCallbackFuncs
287 {
288   void (*ref)   (gpointer     cb_data);
289   void (*unref) (gpointer     cb_data);
290   void (*get)   (gpointer     cb_data,
291                  GSource     *source, 
292                  GSourceFunc *func,
293                  gpointer    *data);
294 };
295
296 /**
297  * GSourceDummyMarshal:
298  *
299  * This is just a placeholder for #GClosureMarshal,
300  * which cannot be used here for dependency reasons.
301  */
302 typedef void (*GSourceDummyMarshal) (void);
303
304 struct _GSourceFuncs
305 {
306   gboolean (*prepare)  (GSource    *source,
307                         gint       *timeout_);/* Can be NULL */
308   gboolean (*check)    (GSource    *source);/* Can be NULL */
309   gboolean (*dispatch) (GSource    *source,
310                         GSourceFunc callback,
311                         gpointer    user_data);
312   void     (*finalize) (GSource    *source); /* Can be NULL */
313
314   /*< private >*/
315   /* For use by g_source_set_closure */
316   GSourceFunc     closure_callback;        
317   GSourceDummyMarshal closure_marshal; /* Really is of type GClosureMarshal */
318 };
319
320 /* Standard priorities */
321
322 /**
323  * G_PRIORITY_HIGH:
324  *
325  * Use this for high priority event sources.
326  *
327  * It is not used within GLib or GTK.
328  */
329 #define G_PRIORITY_HIGH            -100
330
331 /**
332  * G_PRIORITY_DEFAULT:
333  *
334  * Use this for default priority event sources.
335  *
336  * In GLib this priority is used when adding timeout functions
337  * with g_timeout_add(). In GDK this priority is used for events
338  * from the X server.
339  */
340 #define G_PRIORITY_DEFAULT          0
341
342 /**
343  * G_PRIORITY_HIGH_IDLE:
344  *
345  * Use this for high priority idle functions.
346  *
347  * GTK uses %G_PRIORITY_HIGH_IDLE + 10 for resizing operations,
348  * and %G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is
349  * done to ensure that any pending resizes are processed before any
350  * pending redraws, so that widgets are not redrawn twice unnecessarily.)
351  */
352 #define G_PRIORITY_HIGH_IDLE        100
353
354 /**
355  * G_PRIORITY_DEFAULT_IDLE:
356  *
357  * Use this for default priority idle functions.
358  *
359  * In GLib this priority is used when adding idle functions with
360  * g_idle_add().
361  */
362 #define G_PRIORITY_DEFAULT_IDLE     200
363
364 /**
365  * G_PRIORITY_LOW:
366  *
367  * Use this for very low priority background tasks.
368  *
369  * It is not used within GLib or GTK.
370  */
371 #define G_PRIORITY_LOW              300
372
373 /**
374  * G_SOURCE_REMOVE:
375  *
376  * Use this macro as the return value of a #GSourceFunc to remove
377  * the #GSource from the main loop.
378  *
379  * Since: 2.32
380  */
381 #define G_SOURCE_REMOVE         FALSE
382
383 /**
384  * G_SOURCE_CONTINUE:
385  *
386  * Use this macro as the return value of a #GSourceFunc to leave
387  * the #GSource in the main loop.
388  *
389  * Since: 2.32
390  */
391 #define G_SOURCE_CONTINUE       TRUE
392
393 /* GMainContext: */
394
395 GLIB_AVAILABLE_IN_ALL
396 GMainContext *g_main_context_new       (void);
397 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
398 GLIB_AVAILABLE_IN_2_72
399 GMainContext *g_main_context_new_with_flags (GMainContextFlags flags);
400 G_GNUC_END_IGNORE_DEPRECATIONS
401 GLIB_AVAILABLE_IN_ALL
402 GMainContext *g_main_context_ref       (GMainContext *context);
403 GLIB_AVAILABLE_IN_ALL
404 void          g_main_context_unref     (GMainContext *context);
405 GLIB_AVAILABLE_IN_ALL
406 GMainContext *g_main_context_default   (void);
407
408 GLIB_AVAILABLE_IN_ALL
409 gboolean      g_main_context_iteration (GMainContext *context,
410                                         gboolean      may_block);
411 GLIB_AVAILABLE_IN_ALL
412 gboolean      g_main_context_pending   (GMainContext *context);
413
414 /* For implementation of legacy interfaces
415  */
416 GLIB_AVAILABLE_IN_ALL
417 GSource      *g_main_context_find_source_by_id              (GMainContext *context,
418                                                              guint         source_id);
419 GLIB_AVAILABLE_IN_ALL
420 GSource      *g_main_context_find_source_by_user_data       (GMainContext *context,
421                                                              gpointer      user_data);
422 GLIB_AVAILABLE_IN_ALL
423 GSource      *g_main_context_find_source_by_funcs_user_data (GMainContext *context,
424                                                              GSourceFuncs *funcs,
425                                                              gpointer      user_data);
426
427 /* Low level functions for implementing custom main loops.
428  */
429 GLIB_AVAILABLE_IN_ALL
430 void     g_main_context_wakeup  (GMainContext *context);
431 GLIB_AVAILABLE_IN_ALL
432 gboolean g_main_context_acquire (GMainContext *context);
433 GLIB_AVAILABLE_IN_ALL
434 void     g_main_context_release (GMainContext *context);
435 GLIB_AVAILABLE_IN_ALL
436 gboolean g_main_context_is_owner (GMainContext *context);
437 GLIB_DEPRECATED_IN_2_58_FOR(g_main_context_is_owner)
438 gboolean g_main_context_wait    (GMainContext *context,
439                                  GCond        *cond,
440                                  GMutex       *mutex);
441
442 GLIB_AVAILABLE_IN_ALL
443 gboolean g_main_context_prepare  (GMainContext *context,
444                                   gint         *priority);
445 GLIB_AVAILABLE_IN_ALL
446 gint     g_main_context_query    (GMainContext *context,
447                                   gint          max_priority,
448                                   gint         *timeout_,
449                                   GPollFD      *fds,
450                                   gint          n_fds);
451 GLIB_AVAILABLE_IN_ALL
452 gboolean     g_main_context_check    (GMainContext *context,
453                                       gint          max_priority,
454                                       GPollFD      *fds,
455                                       gint          n_fds);
456 GLIB_AVAILABLE_IN_ALL
457 void     g_main_context_dispatch (GMainContext *context);
458
459 GLIB_AVAILABLE_IN_ALL
460 void     g_main_context_set_poll_func (GMainContext *context,
461                                        GPollFunc     func);
462 GLIB_AVAILABLE_IN_ALL
463 GPollFunc g_main_context_get_poll_func (GMainContext *context);
464
465 /* Low level functions for use by source implementations
466  */
467 GLIB_AVAILABLE_IN_ALL
468 void     g_main_context_add_poll    (GMainContext *context,
469                                      GPollFD      *fd,
470                                      gint          priority);
471 GLIB_AVAILABLE_IN_ALL
472 void     g_main_context_remove_poll (GMainContext *context,
473                                      GPollFD      *fd);
474
475 GLIB_AVAILABLE_IN_ALL
476 gint     g_main_depth               (void);
477 GLIB_AVAILABLE_IN_ALL
478 GSource *g_main_current_source      (void);
479
480 /* GMainContexts for other threads
481  */
482 GLIB_AVAILABLE_IN_ALL
483 void          g_main_context_push_thread_default (GMainContext *context);
484 GLIB_AVAILABLE_IN_ALL
485 void          g_main_context_pop_thread_default  (GMainContext *context);
486 GLIB_AVAILABLE_IN_ALL
487 GMainContext *g_main_context_get_thread_default  (void);
488 GLIB_AVAILABLE_IN_ALL
489 GMainContext *g_main_context_ref_thread_default  (void);
490
491 /**
492  * GMainContextPusher:
493  *
494  * Opaque type. See g_main_context_pusher_new() for details.
495  *
496  * Since: 2.64
497  */
498 typedef void GMainContextPusher GLIB_AVAILABLE_TYPE_IN_2_64;
499
500 /**
501  * g_main_context_pusher_new:
502  * @main_context: (transfer none): a main context to push
503  *
504  * Push @main_context as the new thread-default main context for the current
505  * thread, using g_main_context_push_thread_default(), and return a new
506  * #GMainContextPusher. Pop with g_main_context_pusher_free(). Using
507  * g_main_context_pop_thread_default() on @main_context while a
508  * #GMainContextPusher exists for it can lead to undefined behaviour.
509  *
510  * Using two #GMainContextPushers in the same scope is not allowed, as it leads
511  * to an undefined pop order.
512  *
513  * This is intended to be used with g_autoptr().  Note that g_autoptr()
514  * is only available when using GCC or clang, so the following example
515  * will only work with those compilers:
516  * |[
517  * typedef struct
518  * {
519  *   ...
520  *   GMainContext *context;
521  *   ...
522  * } MyObject;
523  *
524  * static void
525  * my_object_do_stuff (MyObject *self)
526  * {
527  *   g_autoptr(GMainContextPusher) pusher = g_main_context_pusher_new (self->context);
528  *
529  *   // Code with main context as the thread default here
530  *
531  *   if (cond)
532  *     // No need to pop
533  *     return;
534  *
535  *   // Optionally early pop
536  *   g_clear_pointer (&pusher, g_main_context_pusher_free);
537  *
538  *   // Code with main context no longer the thread default here
539  * }
540  * ]|
541  *
542  * Returns: (transfer full): a #GMainContextPusher
543  * Since: 2.64
544  */
545 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
546 GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
547 static inline GMainContextPusher *
548 g_main_context_pusher_new (GMainContext *main_context)
549 {
550   g_main_context_push_thread_default (main_context);
551   return (GMainContextPusher *) main_context;
552 }
553 G_GNUC_END_IGNORE_DEPRECATIONS
554
555 /**
556  * g_main_context_pusher_free:
557  * @pusher: (transfer full): a #GMainContextPusher
558  *
559  * Pop @pusher’s main context as the thread default main context.
560  * See g_main_context_pusher_new() for details.
561  *
562  * This will pop the #GMainContext as the current thread-default main context,
563  * but will not call g_main_context_unref() on it.
564  *
565  * Since: 2.64
566  */
567 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
568 GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
569 static inline void
570 g_main_context_pusher_free (GMainContextPusher *pusher)
571 {
572   g_main_context_pop_thread_default ((GMainContext *) pusher);
573 }
574 G_GNUC_END_IGNORE_DEPRECATIONS
575
576 /* GMainLoop: */
577
578 GLIB_AVAILABLE_IN_ALL
579 GMainLoop *g_main_loop_new        (GMainContext *context,
580                                    gboolean      is_running);
581 GLIB_AVAILABLE_IN_ALL
582 void       g_main_loop_run        (GMainLoop    *loop);
583 GLIB_AVAILABLE_IN_ALL
584 void       g_main_loop_quit       (GMainLoop    *loop);
585 GLIB_AVAILABLE_IN_ALL
586 GMainLoop *g_main_loop_ref        (GMainLoop    *loop);
587 GLIB_AVAILABLE_IN_ALL
588 void       g_main_loop_unref      (GMainLoop    *loop);
589 GLIB_AVAILABLE_IN_ALL
590 gboolean   g_main_loop_is_running (GMainLoop    *loop);
591 GLIB_AVAILABLE_IN_ALL
592 GMainContext *g_main_loop_get_context (GMainLoop    *loop);
593
594 /* GSource: */
595
596 GLIB_AVAILABLE_IN_ALL
597 GSource *g_source_new             (GSourceFuncs   *source_funcs,
598                                    guint           struct_size);
599
600 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
601 GLIB_AVAILABLE_IN_2_64
602 void     g_source_set_dispose_function (GSource            *source,
603                                         GSourceDisposeFunc  dispose);
604 G_GNUC_END_IGNORE_DEPRECATIONS
605
606 GLIB_AVAILABLE_IN_ALL
607 GSource *g_source_ref             (GSource        *source);
608 GLIB_AVAILABLE_IN_ALL
609 void     g_source_unref           (GSource        *source);
610
611 GLIB_AVAILABLE_IN_ALL
612 guint    g_source_attach          (GSource        *source,
613                                    GMainContext   *context);
614 GLIB_AVAILABLE_IN_ALL
615 void     g_source_destroy         (GSource        *source);
616
617 GLIB_AVAILABLE_IN_ALL
618 void     g_source_set_priority    (GSource        *source,
619                                    gint            priority);
620 GLIB_AVAILABLE_IN_ALL
621 gint     g_source_get_priority    (GSource        *source);
622 GLIB_AVAILABLE_IN_ALL
623 void     g_source_set_can_recurse (GSource        *source,
624                                    gboolean        can_recurse);
625 GLIB_AVAILABLE_IN_ALL
626 gboolean g_source_get_can_recurse (GSource        *source);
627 GLIB_AVAILABLE_IN_ALL
628 guint    g_source_get_id          (GSource        *source);
629
630 GLIB_AVAILABLE_IN_ALL
631 GMainContext *g_source_get_context (GSource       *source);
632
633 GLIB_AVAILABLE_IN_ALL
634 void     g_source_set_callback    (GSource        *source,
635                                    GSourceFunc     func,
636                                    gpointer        data,
637                                    GDestroyNotify  notify);
638
639 GLIB_AVAILABLE_IN_ALL
640 void     g_source_set_funcs       (GSource        *source,
641                                    GSourceFuncs   *funcs);
642 GLIB_AVAILABLE_IN_ALL
643 gboolean g_source_is_destroyed    (GSource        *source);
644
645 GLIB_AVAILABLE_IN_ALL
646 void                 g_source_set_name       (GSource        *source,
647                                               const char     *name);
648 GLIB_AVAILABLE_IN_2_70
649 void                 g_source_set_static_name (GSource        *source,
650                                                const char     *name);
651 GLIB_AVAILABLE_IN_ALL
652 const char *         g_source_get_name       (GSource        *source);
653 GLIB_AVAILABLE_IN_ALL
654 void                 g_source_set_name_by_id (guint           tag,
655                                               const char     *name);
656
657 GLIB_AVAILABLE_IN_2_36
658 void                 g_source_set_ready_time (GSource        *source,
659                                               gint64          ready_time);
660 GLIB_AVAILABLE_IN_2_36
661 gint64               g_source_get_ready_time (GSource        *source);
662
663 #ifdef G_OS_UNIX
664 GLIB_AVAILABLE_IN_2_36
665 gpointer             g_source_add_unix_fd    (GSource        *source,
666                                               gint            fd,
667                                               GIOCondition    events);
668 GLIB_AVAILABLE_IN_2_36
669 void                 g_source_modify_unix_fd (GSource        *source,
670                                               gpointer        tag,
671                                               GIOCondition    new_events);
672 GLIB_AVAILABLE_IN_2_36
673 void                 g_source_remove_unix_fd (GSource        *source,
674                                               gpointer        tag);
675 GLIB_AVAILABLE_IN_2_36
676 GIOCondition         g_source_query_unix_fd  (GSource        *source,
677                                               gpointer        tag);
678 #endif
679
680 /* Used to implement g_source_connect_closure and internally*/
681 GLIB_AVAILABLE_IN_ALL
682 void g_source_set_callback_indirect (GSource              *source,
683                                      gpointer              callback_data,
684                                      GSourceCallbackFuncs *callback_funcs);
685
686 GLIB_AVAILABLE_IN_ALL
687 void     g_source_add_poll            (GSource        *source,
688                                        GPollFD        *fd);
689 GLIB_AVAILABLE_IN_ALL
690 void     g_source_remove_poll         (GSource        *source,
691                                        GPollFD        *fd);
692
693 GLIB_AVAILABLE_IN_ALL
694 void     g_source_add_child_source    (GSource        *source,
695                                        GSource        *child_source);
696 GLIB_AVAILABLE_IN_ALL
697 void     g_source_remove_child_source (GSource        *source,
698                                        GSource        *child_source);
699
700 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
701 GLIB_DEPRECATED_IN_2_28_FOR(g_source_get_time)
702 void     g_source_get_current_time (GSource        *source,
703                                     GTimeVal       *timeval);
704 G_GNUC_END_IGNORE_DEPRECATIONS
705
706 GLIB_AVAILABLE_IN_ALL
707 gint64   g_source_get_time         (GSource        *source);
708
709  /* void g_source_connect_closure (GSource        *source,
710                                   GClosure       *closure);
711  */
712
713 /* Specific source types
714  */
715 GLIB_AVAILABLE_IN_ALL
716 GSource *g_idle_source_new        (void);
717 GLIB_AVAILABLE_IN_ALL
718 GSource *g_child_watch_source_new (GPid pid);
719 GLIB_AVAILABLE_IN_ALL
720 GSource *g_timeout_source_new     (guint interval);
721 GLIB_AVAILABLE_IN_ALL
722 GSource *g_timeout_source_new_seconds (guint interval);
723
724 /* Miscellaneous functions
725  */
726 G_GNUC_BEGIN_IGNORE_DEPRECATIONS
727 GLIB_DEPRECATED_IN_2_62_FOR(g_get_real_time)
728 void   g_get_current_time                 (GTimeVal       *result);
729 G_GNUC_END_IGNORE_DEPRECATIONS
730
731 GLIB_AVAILABLE_IN_ALL
732 gint64 g_get_monotonic_time               (void);
733 GLIB_AVAILABLE_IN_ALL
734 gint64 g_get_real_time                    (void);
735
736
737 /* Source manipulation by ID */
738 GLIB_AVAILABLE_IN_ALL
739 gboolean g_source_remove                     (guint          tag);
740 GLIB_AVAILABLE_IN_ALL
741 gboolean g_source_remove_by_user_data        (gpointer       user_data);
742 GLIB_AVAILABLE_IN_ALL
743 gboolean g_source_remove_by_funcs_user_data  (GSourceFuncs  *funcs,
744                                               gpointer       user_data);
745
746 /**
747  * GClearHandleFunc:
748  * @handle_id: the handle ID to clear
749  *
750  * Specifies the type of function passed to g_clear_handle_id().
751  * The implementation is expected to free the resource identified
752  * by @handle_id; for instance, if @handle_id is a #GSource ID,
753  * g_source_remove() can be used.
754  *
755  * Since: 2.56
756  */
757 typedef void (* GClearHandleFunc) (guint handle_id);
758
759 GLIB_AVAILABLE_IN_2_56
760 void    g_clear_handle_id (guint           *tag_ptr,
761                            GClearHandleFunc clear_func);
762
763 #define g_clear_handle_id(tag_ptr, clear_func)             \
764   G_STMT_START {                                           \
765     G_STATIC_ASSERT (sizeof *(tag_ptr) == sizeof (guint)); \
766     guint *_tag_ptr = (guint *) (tag_ptr);                 \
767     guint _handle_id;                                      \
768                                                            \
769     _handle_id = *_tag_ptr;                                \
770     if (_handle_id > 0)                                    \
771       {                                                    \
772         *_tag_ptr = 0;                                     \
773         clear_func (_handle_id);                           \
774       }                                                    \
775   } G_STMT_END                                             \
776   GLIB_AVAILABLE_MACRO_IN_2_56
777
778 /* Idles, child watchers and timeouts */
779 GLIB_AVAILABLE_IN_ALL
780 guint    g_timeout_add_full         (gint            priority,
781                                      guint           interval,
782                                      GSourceFunc     function,
783                                      gpointer        data,
784                                      GDestroyNotify  notify);
785 GLIB_AVAILABLE_IN_ALL
786 guint    g_timeout_add              (guint           interval,
787                                      GSourceFunc     function,
788                                      gpointer        data);
789 GLIB_AVAILABLE_IN_2_74
790 guint    g_timeout_add_once         (guint           interval,
791                                      GSourceOnceFunc function,
792                                      gpointer        data);
793 GLIB_AVAILABLE_IN_ALL
794 guint    g_timeout_add_seconds_full (gint            priority,
795                                      guint           interval,
796                                      GSourceFunc     function,
797                                      gpointer        data,
798                                      GDestroyNotify  notify);
799 GLIB_AVAILABLE_IN_ALL
800 guint    g_timeout_add_seconds      (guint           interval,
801                                      GSourceFunc     function,
802                                      gpointer        data);
803 GLIB_AVAILABLE_IN_2_78
804 guint    g_timeout_add_seconds_once (guint           interval,
805                                      GSourceOnceFunc function,
806                                      gpointer        data);
807 GLIB_AVAILABLE_IN_ALL
808 guint    g_child_watch_add_full     (gint            priority,
809                                      GPid            pid,
810                                      GChildWatchFunc function,
811                                      gpointer        data,
812                                      GDestroyNotify  notify);
813 GLIB_AVAILABLE_IN_ALL
814 guint    g_child_watch_add          (GPid            pid,
815                                      GChildWatchFunc function,
816                                      gpointer        data);
817 GLIB_AVAILABLE_IN_ALL
818 guint    g_idle_add                 (GSourceFunc     function,
819                                      gpointer        data);
820 GLIB_AVAILABLE_IN_ALL
821 guint    g_idle_add_full            (gint            priority,
822                                      GSourceFunc     function,
823                                      gpointer        data,
824                                      GDestroyNotify  notify);
825 GLIB_AVAILABLE_IN_2_74
826 guint    g_idle_add_once            (GSourceOnceFunc function,
827                                      gpointer        data);
828 GLIB_AVAILABLE_IN_ALL
829 gboolean g_idle_remove_by_data      (gpointer        data);
830
831 GLIB_AVAILABLE_IN_ALL
832 void     g_main_context_invoke_full (GMainContext   *context,
833                                      gint            priority,
834                                      GSourceFunc     function,
835                                      gpointer        data,
836                                      GDestroyNotify  notify);
837 GLIB_AVAILABLE_IN_ALL
838 void     g_main_context_invoke      (GMainContext   *context,
839                                      GSourceFunc     function,
840                                      gpointer        data);
841
842 GLIB_AVAILABLE_STATIC_INLINE_IN_2_70
843 static inline int
844 g_steal_fd (int *fd_ptr)
845 {
846   int fd = *fd_ptr;
847   *fd_ptr = -1;
848   return fd;
849 }
850
851 /* Hook for GClosure / GSource integration. Don't touch */
852 GLIB_VAR GSourceFuncs g_timeout_funcs;
853 GLIB_VAR GSourceFuncs g_child_watch_funcs;
854 GLIB_VAR GSourceFuncs g_idle_funcs;
855 #ifdef G_OS_UNIX
856 GLIB_VAR GSourceFuncs g_unix_signal_funcs;
857 GLIB_VAR GSourceFuncs g_unix_fd_source_funcs;
858 #endif
859
860 G_END_DECLS
861
862 #endif /* __G_MAIN_H__ */