|
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 |
>
|