mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-07-22 09:57:52 +02:00
Move main loop docs inline
This commit is contained in:
@@ -2,99 +2,12 @@
|
||||
The Main Event Loop
|
||||
|
||||
<!-- ##### SECTION Short_Description ##### -->
|
||||
manages all available sources of events
|
||||
|
||||
|
||||
<!-- ##### SECTION Long_Description ##### -->
|
||||
<para>
|
||||
The main event loop manages all the available sources of events for
|
||||
GLib and GTK+ applications. These events can come from any number of
|
||||
different types of sources such as file descriptors (plain files,
|
||||
pipes or sockets) and timeouts. New types of event sources can also
|
||||
be added using g_source_attach().
|
||||
</para>
|
||||
<para>
|
||||
To allow multiple independent sets of sources to be handled in
|
||||
different threads, each source is associated with a #GMainContext.
|
||||
A #GMainContext can only be running in a single thread, but
|
||||
sources can be added to it and removed from it from other threads.
|
||||
</para>
|
||||
<para>
|
||||
Each event source is assigned a priority. The default priority,
|
||||
#G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher
|
||||
priorities. Values greater than 0 denote lower priorities. Events
|
||||
from high priority sources are always processed before events from
|
||||
lower priority sources.
|
||||
</para>
|
||||
<para>
|
||||
Idle functions can also be added, and assigned a priority. These will
|
||||
be run whenever no events with a higher priority are ready to be
|
||||
processed.
|
||||
</para>
|
||||
<para>
|
||||
The #GMainLoop data type represents a main event loop. A #GMainLoop
|
||||
is created with g_main_loop_new(). After adding the initial event sources,
|
||||
g_main_loop_run() is called. This continuously checks for new events from
|
||||
each of the event sources and dispatches them. Finally, the
|
||||
processing of an event from one of the sources leads to a call to
|
||||
g_main_loop_quit() to exit the main loop, and g_main_loop_run() returns.
|
||||
</para>
|
||||
<para>
|
||||
It is possible to create new instances of #GMainLoop recursively.
|
||||
This is often used in GTK+ applications when showing modal dialog
|
||||
boxes. Note that event sources are associated with a particular
|
||||
#GMainContext, and will be checked and dispatched for all main
|
||||
loops associated with that #GMainContext.
|
||||
</para>
|
||||
<para>
|
||||
GTK+ contains wrappers of some of these functions, e.g. gtk_main(),
|
||||
gtk_main_quit() and gtk_events_pending().
|
||||
</para>
|
||||
<refsect2>
|
||||
<title>Creating new sources types</title>
|
||||
<para>
|
||||
One of the unusual features of the GTK+ main loop functionality
|
||||
is that new types of event source can be created and used in
|
||||
addition to the builtin type of event source. A new event source
|
||||
type is used for handling GDK events. A new source type is
|
||||
created by <firstterm>deriving</firstterm> from the #GSource
|
||||
structure. The derived type of source is represented by a
|
||||
structure that has the #GSource structure as a first element,
|
||||
and other elements specific to the new source type. To create
|
||||
an instance of the new source type, call g_source_new() passing
|
||||
in the size of the derived structure and a table of functions.
|
||||
These #GSourceFuncs determine the behavior of the new source
|
||||
types.
|
||||
</para>
|
||||
<para>
|
||||
New source types basically interact with the main context
|
||||
in two ways. Their prepare function in #GSourceFuncs can set
|
||||
a timeout to determine the maximum amount of time that the
|
||||
main loop will sleep before checking the source again. In
|
||||
addition, or as well, the source can add file descriptors to
|
||||
the set that the main context checks using g_source_add_poll().
|
||||
</para>
|
||||
</refsect2>
|
||||
<refsect2>
|
||||
<title>Customizing the main loop iteration</title>
|
||||
<para>
|
||||
Single iterations of a #GMainContext can be run with
|
||||
g_main_context_iteration(). In some cases, more detailed control
|
||||
of exactly how the details of the main loop work is desired,
|
||||
for instance, when integrating the #GMainLoop with an external
|
||||
main loop. In such cases, you can call the component functions
|
||||
of g_main_context_iteration() directly. These functions
|
||||
are g_main_context_prepare(), g_main_context_query(),
|
||||
g_main_context_check() and g_main_context_dispatch().
|
||||
</para>
|
||||
<para>
|
||||
The operation of these functions can best be seen in terms
|
||||
of a state diagram, as shown in <xref linkend="mainloop-states"/>.
|
||||
</para>
|
||||
<figure id="mainloop-states">
|
||||
<title>States of a Main Context</title>
|
||||
<graphic fileref="mainloop-states.gif" format="GIF"></graphic>
|
||||
</figure>
|
||||
</refsect2>
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
<!-- ##### SECTION See_Also ##### -->
|
||||
<para>
|
||||
@@ -109,8 +22,7 @@ manages all available sources of events
|
||||
|
||||
<!-- ##### STRUCT GMainLoop ##### -->
|
||||
<para>
|
||||
The <structname>GMainLoop</structname> struct is an opaque data type
|
||||
representing the main event loop of a GLib or GTK+ application.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
@@ -177,102 +89,82 @@ representing the main event loop of a GLib or GTK+ application.
|
||||
|
||||
<!-- ##### MACRO g_main_new ##### -->
|
||||
<para>
|
||||
Creates a new #GMainLoop for the default main loop.
|
||||
|
||||
</para>
|
||||
|
||||
@is_running: set to %TRUE to indicate that the loop is running. This is not
|
||||
very important since calling g_main_run() will set this to %TRUE anyway.
|
||||
@Returns: a new #GMainLoop.
|
||||
@Deprecated: 2.2: Use g_main_loop_new() instead.
|
||||
@is_running:
|
||||
|
||||
|
||||
<!-- ##### MACRO g_main_destroy ##### -->
|
||||
<para>
|
||||
Frees the memory allocated for the #GMainLoop.
|
||||
|
||||
</para>
|
||||
|
||||
@loop: a #GMainLoop.
|
||||
@Deprecated: 2.2: Use g_main_loop_unref() instead.
|
||||
@loop:
|
||||
|
||||
|
||||
<!-- ##### MACRO g_main_run ##### -->
|
||||
<para>
|
||||
Runs a main loop until it stops running.
|
||||
|
||||
</para>
|
||||
|
||||
@loop: a #GMainLoop.
|
||||
@Deprecated: 2.2: Use g_main_loop_run() instead.
|
||||
@loop:
|
||||
|
||||
|
||||
<!-- ##### MACRO g_main_quit ##### -->
|
||||
<para>
|
||||
Stops the #GMainLoop. If g_main_run() was called to run the #GMainLoop,
|
||||
it will now return.
|
||||
|
||||
</para>
|
||||
|
||||
@loop: a #GMainLoop.
|
||||
@Deprecated: 2.2: Use g_main_loop_quit() instead.
|
||||
@loop:
|
||||
|
||||
|
||||
<!-- ##### MACRO g_main_is_running ##### -->
|
||||
<para>
|
||||
Checks if the main loop is running.
|
||||
|
||||
</para>
|
||||
|
||||
@loop: a #GMainLoop.
|
||||
@Returns: %TRUE if the main loop is running.
|
||||
@Deprecated: 2.2: USe g_main_loop_is_running() instead.
|
||||
@loop:
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PRIORITY_HIGH ##### -->
|
||||
<para>
|
||||
Use this for high priority event sources.
|
||||
It is not used within GLib or GTK+.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PRIORITY_DEFAULT ##### -->
|
||||
<para>
|
||||
Use this for default priority event sources.
|
||||
In GLib this priority is used when adding timeout functions with
|
||||
g_timeout_add().
|
||||
In GDK this priority is used for events from the X server.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PRIORITY_HIGH_IDLE ##### -->
|
||||
<para>
|
||||
Use this for high priority idle functions.
|
||||
GTK+ uses #G_PRIORITY_HIGH_IDLE + 10 for resizing operations, and
|
||||
#G_PRIORITY_HIGH_IDLE + 20 for redrawing operations. (This is done to
|
||||
ensure that any pending resizes are processed before any pending redraws,
|
||||
so that widgets are not redrawn twice unnecessarily.)
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PRIORITY_DEFAULT_IDLE ##### -->
|
||||
<para>
|
||||
Use this for default priority idle functions.
|
||||
In GLib this priority is used when adding idle functions with g_idle_add().
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### MACRO G_PRIORITY_LOW ##### -->
|
||||
<para>
|
||||
Use this for very low priority background tasks.
|
||||
It is not used within GLib or GTK+.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
|
||||
<!-- ##### STRUCT GMainContext ##### -->
|
||||
<para>
|
||||
The <structname>GMainContext</structname> struct is an opaque data type
|
||||
representing a set of sources to be handled in a main loop.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
@@ -323,15 +215,10 @@ representing a set of sources to be handled in a main loop.
|
||||
|
||||
<!-- ##### MACRO g_main_iteration ##### -->
|
||||
<para>
|
||||
Runs a single iteration for the default #GMainContext.
|
||||
|
||||
</para>
|
||||
|
||||
@may_block: set to %TRUE if it should block (i.e. wait) until an event source
|
||||
becomes ready. It will return after an event source has been processed.
|
||||
If set to %FALSE it will return immediately if no event source is ready to be
|
||||
processed.
|
||||
@Returns: %TRUE if more events are pending.
|
||||
@Deprecated: 2.2: Use g_main_context_iteration() instead.
|
||||
@may_block:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_main_context_pending ##### -->
|
||||
@@ -345,12 +232,9 @@ processed.
|
||||
|
||||
<!-- ##### MACRO g_main_pending ##### -->
|
||||
<para>
|
||||
Checks if any events are pending for the default #GMainContext
|
||||
(i.e. ready to be processed).
|
||||
|
||||
</para>
|
||||
|
||||
@Returns: %TRUE if any events are pending.
|
||||
@Deprecated: 2.2: Use g_main_context_pending() instead.
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_main_context_find_source_by_id ##### -->
|
||||
@@ -492,17 +376,13 @@ Checks if any events are pending for the default #GMainContext
|
||||
|
||||
<!-- ##### USER_FUNCTION GPollFunc ##### -->
|
||||
<para>
|
||||
Specifies the type of function passed to g_main_context_set_poll_func().
|
||||
The semantics of the function should match those of the
|
||||
<function>poll()</function> system call.
|
||||
|
||||
</para>
|
||||
|
||||
@ufds: an array of #GPollFD elements.
|
||||
@nfsd: the number of elements in @ufds.
|
||||
@timeout_: the maximum time to wait for an event of the file descriptors.
|
||||
A negative value indicates an infinite timeout.
|
||||
@Returns: the number of #GPollFD elements which have events or errors reported,
|
||||
or -1 if an error occurred.
|
||||
@ufds:
|
||||
@nfsd:
|
||||
@timeout_:
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_main_context_add_poll ##### -->
|
||||
@@ -544,12 +424,10 @@ or -1 if an error occurred.
|
||||
|
||||
<!-- ##### MACRO g_main_set_poll_func ##### -->
|
||||
<para>
|
||||
Sets the function to use for the handle polling of file descriptors
|
||||
for the default main context.
|
||||
|
||||
</para>
|
||||
|
||||
@func: the function to call to poll all file descriptors.
|
||||
@Deprecated: 2.2: Use g_main_context_set_poll_func() instead.
|
||||
@func:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_main_context_get_thread_default ##### -->
|
||||
@@ -680,22 +558,18 @@ for the default main context.
|
||||
|
||||
<!-- ##### TYPEDEF GPid ##### -->
|
||||
<para>
|
||||
A type which is used to hold a process identification.
|
||||
On Unix, processes are identified by a process id (an
|
||||
integer), while Windows uses process handles (which are
|
||||
pointers).
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
<!-- ##### USER_FUNCTION GChildWatchFunc ##### -->
|
||||
<para>
|
||||
The type of functions to be called when a child exists.
|
||||
|
||||
</para>
|
||||
|
||||
@pid: the process id of the child process
|
||||
@status: Status information about the child process,
|
||||
see waitpid(2) for more information about this field
|
||||
@data: user data passed to g_child_watch_add()
|
||||
@pid:
|
||||
@status:
|
||||
@data:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION g_child_watch_source_new ##### -->
|
||||
@@ -734,32 +608,6 @@ The type of functions to be called when a child exists.
|
||||
<!-- ##### STRUCT GPollFD ##### -->
|
||||
<para>
|
||||
|
||||
<informaltable pgwide="1" frame="none" role="struct">
|
||||
<tgroup cols="2"><colspec colwidth="2*"/><colspec colwidth="8*"/>
|
||||
<tbody>
|
||||
|
||||
<row>
|
||||
<entry>#gint fd;</entry>
|
||||
<entry>the file descriptor to poll (or a <type>HANDLE</type> on Win32 platforms).</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry>#gushort events;</entry>
|
||||
<entry>a bitwise combination of flags from #GIOCondition, specifying which
|
||||
events should be polled for. Typically for reading from a file descriptor
|
||||
you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and for writing you would use
|
||||
%G_IO_OUT | %G_IO_ERR.
|
||||
</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry>#gushort revents;</entry>
|
||||
<entry>a bitwise combination of flags from #GIOCondition, returned from the
|
||||
<function>poll()</function> function to indicate which events occurred.
|
||||
</entry>
|
||||
</row>
|
||||
</tbody></tgroup></informaltable>
|
||||
|
||||
</para>
|
||||
|
||||
@fd:
|
||||
@@ -787,8 +635,7 @@ you would use %G_IO_IN | %G_IO_HUP | %G_IO_ERR, and for writing you would use
|
||||
|
||||
<!-- ##### STRUCT GSource ##### -->
|
||||
<para>
|
||||
The <structname>GSource</structname> struct is an opaque data type representing
|
||||
an event source.
|
||||
|
||||
</para>
|
||||
|
||||
|
||||
@@ -803,63 +650,24 @@ for dependency reasons.
|
||||
|
||||
<!-- ##### STRUCT GSourceFuncs ##### -->
|
||||
<para>
|
||||
The #GSourceFuncs struct contains a table of functions used to handle
|
||||
event sources in a generic manner.
|
||||
</para>
|
||||
<para>
|
||||
For idle sources, the prepare and check functions always return %TRUE to
|
||||
indicate that the source is always ready to be processed.
|
||||
The prepare function also returns a timeout value of 0 to ensure that the
|
||||
poll() call doesn't block (since that would be time
|
||||
wasted which could have been spent running the idle function).
|
||||
</para>
|
||||
<para>
|
||||
For timeout sources, the prepare and check functions both return %TRUE if the
|
||||
timeout interval has expired. The prepare function also returns a timeout
|
||||
value to ensure that the poll() call doesn't block too
|
||||
long and miss the next timeout.
|
||||
</para>
|
||||
<para>
|
||||
For file descriptor sources, the prepare function typically returns %FALSE,
|
||||
since it must wait until poll() has been called before
|
||||
it knows whether any events need to be processed. It sets the returned
|
||||
timeout to -1 to indicate that it doesn't mind how long the
|
||||
poll() call blocks.
|
||||
In the check function, it tests the results of the poll()
|
||||
call to see if the required condition has been met, and returns %TRUE if so.
|
||||
|
||||
</para>
|
||||
|
||||
@prepare: Called before all the file descriptors are polled.
|
||||
If the source can determine that it is ready here (without waiting for the
|
||||
results of the poll() call) it should return %TRUE.
|
||||
It can also return a @timeout_ value which should be the maximum timeout
|
||||
(in milliseconds) which should be passed to the poll() call.
|
||||
The actual timeout used will be -1 if all sources returned -1, or it will
|
||||
be the minimum of all the @timeout_ values returned which were >= 0.
|
||||
@check: Called after all the file descriptors are polled.
|
||||
The source should return %TRUE if it is ready to be dispatched.
|
||||
Note that some time may have passed since the previous prepare function was
|
||||
called, so the source should be checked again here.
|
||||
@dispatch: Called to dispatch the event source, after it has returned %TRUE in
|
||||
either its @prepare or its @check function. The @dispatch function is
|
||||
passed in a callback function and data. The callback function may be
|
||||
%NULL if the source was never connected to a callback using
|
||||
g_source_set_callback(). The @dispatch function should call the
|
||||
callback function with @user_data and whatever additional parameters are
|
||||
needed for this type of event source.
|
||||
@finalize: Called when the source is finalized.
|
||||
@prepare:
|
||||
@check:
|
||||
@dispatch:
|
||||
@finalize:
|
||||
@closure_callback:
|
||||
@closure_marshal:
|
||||
|
||||
<!-- ##### STRUCT GSourceCallbackFuncs ##### -->
|
||||
<para>
|
||||
The <structname>GSourceCallbackFuncs</structname> struct contains
|
||||
functions for managing callback objects.
|
||||
|
||||
</para>
|
||||
|
||||
@ref: Called when a reference is added to the callback object.
|
||||
@unref: Called when a reference to the callback object is dropped.
|
||||
@get: Called to extract the callback function and data from the callback object.
|
||||
@ref:
|
||||
@unref:
|
||||
@get:
|
||||
|
||||
<!-- ##### FUNCTION g_source_new ##### -->
|
||||
<para>
|
||||
|
Reference in New Issue
Block a user