<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Signals</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="index.html" title="GObject Reference Manual">
<link rel="up" href="chapter-signal.html" title="The GObject messaging system">
<link rel="prev" href="chapter-signal.html" title="The GObject messaging system">
<link rel="next" href="rn01.html" title="API Reference">
<meta name="generator" content="GTK-Doc V1.14 (XML mode)">
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2"><tr valign="middle">
<td><a accesskey="p" href="chapter-signal.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
<td><a accesskey="u" href="chapter-signal.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
<td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
<th width="100%" align="center">GObject Reference Manual</th>
<td><a accesskey="n" href="rn01.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
</tr></table>
<div class="sect1" title="Signals">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="signal"></a>Signals</h2></div></div></div>
<p>
      GObject's signals have nothing to do with standard UNIX signals: they connect 
      arbitrary application-specific events with any number of listeners.
      For example, in GTK+, every user event (keystroke or mouse move) is received
      from the X server and generates a GTK+ event under the form of a signal emission
      on a given object instance.
    </p>
<p>
      Each signal is registered in the type system together with the type on which
      it can be emitted: users of the type are said to <span class="emphasis"><em>connect</em></span>
      to the signal on a given type instance when they register a closure to be 
      invoked upon the signal emission. Users can also emit the signal by themselves 
      or stop the emission of the signal from within one of the closures connected 
      to the signal.
    </p>
<p>
      When a signal is emitted on a given type instance, all the closures
      connected to this signal on this type instance will be invoked. All the closures
      connected to such a signal represent callbacks whose signature looks like:
</p>
<pre class="programlisting">
return_type function_callback (gpointer instance, ... , gpointer user_data);
</pre>
<p>
    </p>
<div class="sect2" title="Signal registration">
<div class="titlepage"><div><div><h3 class="title">
<a name="signal-registration"></a>Signal registration</h3></div></div></div>
<p>
		To register a new signal on an existing type, we can use any of <code class="function"><a class="link" href="gobject-Signals.html#g-signal-newv" title="g_signal_newv ()">g_signal_newv</a></code>,
		<code class="function"><a class="link" href="gobject-Signals.html#g-signal-new-valist" title="g_signal_new_valist ()">g_signal_new_valist</a></code> or <code class="function"><a class="link" href="gobject-Signals.html#g-signal-new" title="g_signal_new ()">g_signal_new</a></code> functions:
</p>
<pre class="programlisting">
guint g_signal_newv (const gchar        *signal_name,
                     GType               itype,
                     GSignalFlags        signal_flags,
                     GClosure           *class_closure,
                     GSignalAccumulator  accumulator,
                     gpointer            accu_data,
                     GSignalCMarshaller  c_marshaller,
                     GType               return_type,
                     guint               n_params,
                     GType              *param_types);
</pre>
<p>
		The number of parameters to these functions is a bit intimidating but they are relatively
		simple:
		</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
			  signal_name: is a string which can be used to uniquely identify a given signal.
			</p></li>
<li class="listitem"><p>
			  itype: is the instance type on which this signal can be emitted.
			</p></li>
<li class="listitem"><p>
			  signal_flags: partly defines the order in which closures which were connected to the
			  signal are invoked.
			</p></li>
<li class="listitem"><p>
			  class_closure: this is the default closure for the signal: if it is not NULL upon
			  the signal emission, it will be invoked upon this emission of the signal. The 
			  moment where this closure is invoked compared to other closures connected to that 
			  signal depends partly on the signal_flags.
			</p></li>
<li class="listitem"><p>
			  accumulator: this is a function pointer which is invoked after each closure
			  has been invoked. If it returns FALSE, signal emission is stopped. If it returns
			  TRUE, signal emission proceeds normally. It is also used to compute the return
			  value of the signal based on the return value of all the invoked closures.
			</p></li>
<li class="listitem"><p>
			  accumulator_data: this pointer will be passed down to each invocation of the
			  accumulator during emission.
			</p></li>
<li class="listitem"><p>
			  c_marshaller: this is the default C marshaller for any closure which is connected to
			this signal.
			</p></li>
<li class="listitem"><p>
			  return_type: this is the type of the return value of the signal.
			</p></li>
<li class="listitem"><p>
			  n_params: this is the number of parameters this signal takes.
			</p></li>
<li class="listitem"><p>
			  param_types: this is an array of GTypes which indicate the type of each parameter
			  of the signal. The length of this array is indicated by n_params.
			</p></li>
</ul></div>
<p>
      </p>
<p>
		As you can see from the above definition, a signal is basically a description
		of the closures which can be connected to this signal and a description of the
		order in which the closures connected to this signal will be invoked.
	  </p>
</div>
<div class="sect2" title="Signal connection">
<div class="titlepage"><div><div><h3 class="title">
<a name="signal-connection"></a>Signal connection</h3></div></div></div>
<p>
		If you want to connect to a signal with a closure, you have three possibilities:
		</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
		  You can register a class closure at signal registration: this is a
		  system-wide operation. i.e.: the class_closure will be invoked during each emission
		  of a given signal on all the instances of the type which supports that signal.
			</p></li>
<li class="listitem"><p>
		  You can use <code class="function"><a class="link" href="gobject-Signals.html#g-signal-override-class-closure" title="g_signal_override_class_closure ()">g_signal_override_class_closure</a></code> which
		  overrides the class_closure of a given type. It is possible to call this function
		  only on a derived type of the type on which the signal was registered.
		  This function is of use only to language bindings.
			</p></li>
<li class="listitem"><p>
		  You can register a closure with the <code class="function"><a class="link" href="gobject-Signals.html#g-signal-connect" title="g_signal_connect()">g_signal_connect</a></code>
		  family of functions. This is an instance-specific operation: the closure
		  will be invoked only during emission of a given signal on a given instance.
			</p></li>
</ul></div>
<p>
		It is also possible to connect a different kind of callback on a given signal: 
		emission hooks are invoked whenever a given signal is emitted whatever the instance on 
		which it is emitted. Emission hooks are used for example to get all mouse_clicked
		emissions in an application to be able to emit the small mouse click sound.
		Emission hooks are connected with <code class="function"><a class="link" href="gobject-Signals.html#g-signal-add-emission-hook" title="g_signal_add_emission_hook ()">g_signal_add_emission_hook</a></code>
		and removed with <code class="function"><a class="link" href="gobject-Signals.html#g-signal-remove-emission-hook" title="g_signal_remove_emission_hook ()">g_signal_remove_emission_hook</a></code>.
	  </p>
</div>
<div class="sect2" title="Signal emission">
<div class="titlepage"><div><div><h3 class="title">
<a name="signal-emission"></a>Signal emission</h3></div></div></div>
<p>
		Signal emission is done through the use of the <code class="function"><a class="link" href="gobject-Signals.html#g-signal-emit" title="g_signal_emit ()">g_signal_emit</a></code> family 
		of functions.
</p>
<pre class="programlisting">
void g_signal_emitv (const GValue *instance_and_params,
                     guint         signal_id,
                     GQuark        detail,
                     GValue       *return_value);
</pre>
<p>
		</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
			The instance_and_params array of GValues contains the list of input
			parameters to the signal. The first element of the array is the 
			instance pointer on which to invoke the signal. The following elements of
			the array contain the list of parameters to the signal.
			</p></li>
<li class="listitem"><p>
			signal_id identifies the signal to invoke.
			</p></li>
<li class="listitem"><p>
			detail identifies the specific detail of the signal to invoke. A detail is a kind of 
			magic token/argument which is passed around during signal emission and which is used
			by closures connected to the signal to filter out unwanted signal emissions. In most 
			cases, you can safely set this value to zero. See <a class="xref" href="signal.html#signal-detail" title="The detail argument">the section called “The <span class="emphasis"><em>detail</em></span> argument”</a> for
			more details about this parameter.
			</p></li>
<li class="listitem"><p>
			return_value holds the return value of the last closure invoked during emission if
			no accumulator was specified. If an accumulator was specified during signal creation,
			this accumulator is used to calculate the return_value as a function of the return
			values of all the closures invoked during emission. 
			<sup>[<a name="id585643" href="#ftn.id585643" class="footnote">8</a>]</sup>
			If no closure is invoked during
			emission, the return_value is nonetheless initialized to zero/null.
			</p></li>
</ul></div>
<p>
		</p>
<p>
		Internally, the GValue array is passed to the emission function proper, 
		<code class="function">signal_emit_unlocked_R</code> (implemented in <code class="filename">gsignal.c</code>).
		Signal emission can be decomposed in 5 steps:
		</p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc">
<li class="listitem"><p>
			<span class="emphasis"><em>RUN_FIRST</em></span>: if the G_SIGNAL_RUN_FIRST flag was used
			during signal registration and if there exist a class_closure for this signal,
			the class_closure is invoked. Jump to <span class="emphasis"><em>EMISSION_HOOK</em></span> state.
			</p></li>
<li class="listitem"><p>
			<span class="emphasis"><em>EMISSION_HOOK</em></span>: if any emission hook was added to
			the signal, they are invoked from first to last added. Accumulate return values
			and jump to <span class="emphasis"><em>HANDLER_RUN_FIRST</em></span> state. 
			</p></li>
<li class="listitem"><p>
			<span class="emphasis"><em>HANDLER_RUN_FIRST</em></span>: if any closure were connected
			with the <code class="function"><a class="link" href="gobject-Signals.html#g-signal-connect" title="g_signal_connect()">g_signal_connect</a></code> family of 
			functions, and if they are not blocked (with the <code class="function"><a class="link" href="gobject-Signals.html#g-signal-handler-block" title="g_signal_handler_block ()">g_signal_handler_block</a></code>
			family of functions) they are run here, from first to last connected.
			Jump to <span class="emphasis"><em>RUN_LAST</em></span> state.
			</p></li>
<li class="listitem"><p>
			<span class="emphasis"><em>RUN_LAST</em></span>: if the G_SIGNAL_RUN_LAST
			flag was set during registration and if a class_closure
			was set, it is invoked here. Jump to 
			<span class="emphasis"><em>HANDLER_RUN_LAST</em></span> state.
			</p></li>
<li class="listitem"><p>
			<span class="emphasis"><em>HANDLER_RUN_LAST</em></span>: if any closure were connected
			with the <code class="function">g_signal_connect_after</code> family of 
			functions, if they were not invoked during HANDLER_RUN_FIRST and if they 
			are not blocked, they are run here, from first to last connected.
			Jump to  <span class="emphasis"><em>RUN_CLEANUP</em></span> state.
			</p></li>
<li class="listitem"><p>
			<span class="emphasis"><em>RUN_CLEANUP</em></span>: if the G_SIGNAL_RUN_CLEANUP flag
			was set during registration and if a class_closure was set,
			it is invoked here. Signal emission is completed here.
			</p></li>
</ul></div>
<p>      
	  </p>
<p>
		If, at any point during emission (except in RUN_CLEANUP state), one of the 
		closures or emission hook stops the signal emission with 
		<code class="function">g_signal_stop</code>, emission jumps to CLEANUP state.
	  </p>
<p>
		If, at any point during emission, one of the closures or emission hook 
		emits the same signal on the same instance, emission is restarted from
		the RUN_FIRST state.
	  </p>
<p>
		The accumulator function is invoked in all states, after invocation
		of each closure (except in EMISSION_HOOK and CLEANUP). It accumulates
		the closure return value into the signal return value and returns TRUE or
		FALSE. If, at any point, it does not return TRUE, emission jumps to CLEANUP state.
	  </p>
<p>
		If no accumulator function was provided, the value returned by the last handler
		run will be returned by <code class="function"><a class="link" href="gobject-Signals.html#g-signal-emit" title="g_signal_emit ()">g_signal_emit</a></code>.
	  </p>
</div>
<div class="sect2" title="The detail argument">
<div class="titlepage"><div><div><h3 class="title">
<a name="signal-detail"></a>The <span class="emphasis"><em>detail</em></span> argument</h3></div></div></div>
<p>All the functions related to signal emission or signal connection have a parameter
		named the <span class="emphasis"><em>detail</em></span>. Sometimes, this parameter is hidden by the API
		but it is always there, under one form or another. 
	  </p>
<p>
	    Of the three main connection functions,
		only one has an explicit detail parameter as a <span class="type"><a href="./../glib/glib/glib-Quarks.html#GQuark">GQuark</a></span>
		<sup>[<a name="id585828" href="#ftn.id585828" class="footnote">9</a>]</sup>:
</p>
<pre class="programlisting">
gulong     g_signal_connect_closure_by_id          (gpointer          instance,
                           guint          signal_id,
                           GQuark          detail,
                           GClosure         *closure,
                           gboolean          after);
</pre>
<p>
        The two other functions hide the detail parameter in the signal name identification:
</p>
<pre class="programlisting">
gulong     g_signal_connect_closure          (gpointer          instance,
                           const gchar       *detailed_signal,
                           GClosure         *closure,
                           gboolean          after);
gulong     g_signal_connect_data              (gpointer          instance,
                           const gchar     *detailed_signal,
                           GCallback      c_handler,
                           gpointer          data,
                           GClosureNotify      destroy_data,
                           GConnectFlags      connect_flags);
</pre>
<p>
		Their detailed_signal parameter is a string which identifies the name of the signal
		to connect to. However, the format of this string is structured to look like 
		<span class="emphasis"><em>signal_name::detail_name</em></span>. Connecting to the signal
		named <span class="emphasis"><em>notify::cursor_position</em></span> will actually connect to the signal
		named <span class="emphasis"><em>notify</em></span> with the <span class="emphasis"><em>cursor_position</em></span> name.
		Internally, the detail string is transformed to a GQuark if it is present.
	  </p>
<p>
		Of the four main signal emission functions, three have an explicit detail parameter as a 
		<span class="type"><a href="./../glib/glib/glib-Quarks.html#GQuark">GQuark</a></span> again:
</p>
<pre class="programlisting">
void                  g_signal_emitv        (const GValue       *instance_and_params,
                         guint               signal_id,
                         GQuark              detail,
                         GValue             *return_value);
void                  g_signal_emit_valist  (gpointer            instance,
                         guint               signal_id,
                         GQuark              detail,
                         va_list             var_args);
void                  g_signal_emit         (gpointer            instance,
                         guint               signal_id,
                         GQuark              detail,
                         ...);
</pre>
<p>
        The fourth function hides it in its signal name parameter:
</p>
<pre class="programlisting">
void                  g_signal_emit_by_name (gpointer            instance,
                         const gchar        *detailed_signal,
                         ...);
</pre>
<p>
        The format of the detailed_signal parameter is exactly the same as the format used by
        the <code class="function"><a class="link" href="gobject-Signals.html#g-signal-connect" title="g_signal_connect()">g_signal_connect</a></code> functions: <span class="emphasis"><em>signal_name::detail_name</em></span>.
	  </p>
<p>
        If a detail is provided by the user to the emission function, it is used during emission to match
        against the closures which also provide a detail.
        If the closures' detail does not match the detail provided by the user, they will not be invoked
        (even though they are connected to a signal which is being emitted).
	  </p>
<p>
		This completely optional filtering mechanism is mainly used as an optimization for signals
		which are often emitted for many different reasons: the clients can filter out which events they are
		interested in before the closure's marshalling code runs. For example, this is used extensively
		by the <span class="emphasis"><em>notify</em></span> signal of GObject: whenever a property is modified on a GObject,
		instead of just emitting the <span class="emphasis"><em>notify</em></span> signal, GObject associates as a detail to this
		signal emission the name of the property modified. This allows clients who wish to be notified of changes
		to only one property to filter most events before receiving them.
	  </p>
<p>
		As a simple rule, users can and should set the detail parameter to zero: this will disable completely
        this optional filtering.
	  </p>
</div>
<div class="footnotes">
<br><hr width="100" align="left">
<div class="footnote"><p><sup>[<a name="ftn.id585643" href="#id585643" class="para">8</a>] </sup>
			  James (again!!) gives a few non-trivial examples of accumulators:
			  <span class="quote">“<span class="quote">
				For instance, you may have an accumulator that ignores NULL returns from 
				closures, and only accumulates the non-NULL ones. Another accumulator may try
				to return the list of values returned by the closures.
			  </span>”</span>
			</p></div>
<div class="footnote"><p><sup>[<a name="ftn.id585828" href="#id585828" class="para">9</a>] </sup>A GQuark is an integer which uniquely represents a string. It is possible to transform
		   back and forth between the integer and string representations with the functions 
		   <code class="function"><a href="./../glib/glib/glib-Quarks.html#g-quark-from-string">g_quark_from_string</a></code> and <code class="function"><a href="./../glib/glib/glib-Quarks.html#g-quark-to-string">g_quark_to_string</a></code>.
		  </p></div>
</div>
</div>
<div class="footer">
<hr>
          Generated by GTK-Doc V1.14</div>
</body>
</html>