Blame docs/tutorial/html/x159.html

Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>Theory of Signals and Callbacks
Packit Service fb6fa5
>
Packit Service fb6fa5
NAME="GENERATOR"
Packit Service fb6fa5
CONTENT="Modular DocBook HTML Stylesheet Version 1.79">
Packit Service fb6fa5
REL="HOME"
Packit Service fb6fa5
TITLE="GTK+ 2.0 Tutorial"
Packit Service fb6fa5
HREF="book1.html">
Packit Service fb6fa5
REL="UP"
Packit Service fb6fa5
TITLE="Getting Started"
Packit Service fb6fa5
HREF="c39.html">
Packit Service fb6fa5
REL="PREVIOUS"
Packit Service fb6fa5
TITLE="Compiling Hello World"
Packit Service fb6fa5
HREF="x111.html">
Packit Service fb6fa5
REL="NEXT"
Packit Service fb6fa5
TITLE="Events"
Packit Service fb6fa5
HREF="x182.html">
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
BGCOLOR="#FFFFFF"
Packit Service fb6fa5
TEXT="#000000"
Packit Service fb6fa5
LINK="#0000FF"
Packit Service fb6fa5
VLINK="#840084"
Packit Service fb6fa5
ALINK="#0000FF"
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NAVHEADER"
Packit Service fb6fa5
>
Packit Service fb6fa5
SUMMARY="Header navigation table"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
CELLPADDING="0"
Packit Service fb6fa5
CELLSPACING="0"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
COLSPAN="3"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
>GTK+ 2.0 Tutorial
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="10%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x111.html"
Packit Service fb6fa5
ACCESSKEY="P"
Packit Service fb6fa5
><<< Previous
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="80%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>Getting Started
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="10%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x182.html"
Packit Service fb6fa5
ACCESSKEY="N"
Packit Service fb6fa5
>Next >>>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
ALIGN="LEFT"
Packit Service fb6fa5
WIDTH="100%">
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
>
Packit Service fb6fa5
NAME="SEC-THEORYOFSIGNALSANDCALLBACKS"
Packit Service fb6fa5
>Theory of Signals and Callbacks
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NOTE"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NOTE"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="25"
Packit Service fb6fa5
ALIGN="CENTER"
Packit Service fb6fa5
VALIGN="TOP"
Packit Service fb6fa5
>
Packit Service fb6fa5
SRC="./stylesheet-images/note.gif"
Packit Service fb6fa5
HSPACE="5"
Packit Service fb6fa5
ALT="Note">
Packit Service fb6fa5
>
Packit Service fb6fa5
ALIGN="LEFT"
Packit Service fb6fa5
VALIGN="TOP"
Packit Service fb6fa5
>
Packit Service fb6fa5
>In version 2.0, the signal system has been moved from GTK to GLib, therefore the
Packit Service fb6fa5
functions and types explained in this section have a "g_" prefix rather than a "gtk_" 
Packit Service fb6fa5
prefix. We won't go into details about the extensions which the GLib 2.0 signal system
Packit Service fb6fa5
has relative to the GTK 1.2 signal system.
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>Before we look in detail at 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>helloworld
Packit Service fb6fa5
>, we'll discuss signals
Packit Service fb6fa5
and callbacks. GTK is an event driven toolkit, which means it will
Packit Service fb6fa5
sleep in gtk_main() until an event occurs and control is passed to the
Packit Service fb6fa5
appropriate function.
Packit Service fb6fa5
>
Packit Service fb6fa5
>This passing of control is done using the idea of "signals". (Note
Packit Service fb6fa5
that these signals are not the same as the Unix system signals, and
Packit Service fb6fa5
are not implemented using them, although the terminology is almost
Packit Service fb6fa5
identical.) When an event occurs, such as the press of a mouse button,
Packit Service fb6fa5
the appropriate signal will be "emitted" by the widget that was
Packit Service fb6fa5
pressed.  This is how GTK does most of its useful work. There are
Packit Service fb6fa5
signals that all widgets inherit, such as "destroy", and there are
Packit Service fb6fa5
signals that are widget specific, such as "toggled" on a toggle
Packit Service fb6fa5
button.
Packit Service fb6fa5
>
Packit Service fb6fa5
>To make a button perform an action, we set up a signal handler to
Packit Service fb6fa5
catch these signals and call the appropriate function. This is done by
Packit Service fb6fa5
using a function such as:
Packit Service fb6fa5
>
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
BGCOLOR="#E0E0E0"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="PROGRAMLISTING"
Packit Service fb6fa5
>gulong g_signal_connect( gpointer      *object,
Packit Service fb6fa5
                         const gchar   *name,
Packit Service fb6fa5
                         GCallback     func,
Packit Service fb6fa5
                         gpointer      func_data );
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>where the first argument is the widget which will be emitting the
Packit Service fb6fa5
signal, and the second the name of the signal you wish to catch. The
Packit Service fb6fa5
third is the function you wish to be called when it is caught, and the
Packit Service fb6fa5
fourth, the data you wish to have passed to this function.
Packit Service fb6fa5
>
Packit Service fb6fa5
>The function specified in the third argument is called a "callback
Packit Service fb6fa5
function", and should generally be of the form
Packit Service fb6fa5
>
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
BGCOLOR="#E0E0E0"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="PROGRAMLISTING"
Packit Service fb6fa5
>void callback_func( GtkWidget *widget,
Packit Service fb6fa5
                    ... /* other signal arguments */
Packit Service fb6fa5
                    gpointer   callback_data );
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>where the first argument will be a pointer to the widget that emitted
Packit Service fb6fa5
the signal, and the last a pointer to the data given as the last
Packit Service fb6fa5
argument to the g_signal_connect() function as shown above.
Packit Service fb6fa5
>
Packit Service fb6fa5
>Note that the above form for a signal callback function declaration is
Packit Service fb6fa5
only a general guide, as some widget specific signals generate
Packit Service fb6fa5
different calling parameters.
Packit Service fb6fa5
>
Packit Service fb6fa5
>Another call used in the 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>helloworld
Packit Service fb6fa5
> example, is:
Packit Service fb6fa5
>
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
BGCOLOR="#E0E0E0"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="PROGRAMLISTING"
Packit Service fb6fa5
>gulong g_signal_connect_swapped( gpointer     *object,
Packit Service fb6fa5
                                 const gchar  *name,
Packit Service fb6fa5
                                 GCallback    func,
Packit Service fb6fa5
                                 gpointer     *callback_data );
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>g_signal_connect_swapped() is the same as g_signal_connect() except
Packit Service fb6fa5
that the instance on which the signal is emitted and data will be swapped when
Packit Service fb6fa5
calling the handler. So when using this function to connect signals, the callback
Packit Service fb6fa5
should be of the form
Packit Service fb6fa5
>
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
BGCOLOR="#E0E0E0"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="PROGRAMLISTING"
Packit Service fb6fa5
>void callback_func( gpointer   callback_data,
Packit Service fb6fa5
                    ... /* other signal arguments */
Packit Service fb6fa5
                    GtkWidget *widget);
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>where the object is usually a widget. We usually don't setup callbacks
Packit Service fb6fa5
for g_signal_connect_swapped() however. They are usually used to call a
Packit Service fb6fa5
GTK function that accepts a single widget or object as an argument, when a signal
Packit Service fb6fa5
is emitted on some 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>other
Packit Service fb6fa5
> object. In the 
Packit Service fb6fa5
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>helloworld
Packit Service fb6fa5
> example, we connect to the "clicked" signal
Packit Service fb6fa5
on the button, but call gtk_widget_destroy() on the window.
Packit Service fb6fa5
>
Packit Service fb6fa5
>If your callbacks need additional data, use g_signal_connect() instead
Packit Service fb6fa5
of g_signal_connect_swapped().
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NAVFOOTER"
Packit Service fb6fa5
>
Packit Service fb6fa5
ALIGN="LEFT"
Packit Service fb6fa5
WIDTH="100%">
Packit Service fb6fa5
SUMMARY="Footer navigation table"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
CELLPADDING="0"
Packit Service fb6fa5
CELLSPACING="0"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x111.html"
Packit Service fb6fa5
ACCESSKEY="P"
Packit Service fb6fa5
><<< Previous
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="34%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="book1.html"
Packit Service fb6fa5
ACCESSKEY="H"
Packit Service fb6fa5
>Home
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x182.html"
Packit Service fb6fa5
ACCESSKEY="N"
Packit Service fb6fa5
>Next >>>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>Compiling Hello World
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="34%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="c39.html"
Packit Service fb6fa5
ACCESSKEY="U"
Packit Service fb6fa5
>Up
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>Events
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>