1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2000-2001 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
19 #ifndef __G_SIGNAL_H__
20 #define __G_SIGNAL_H__
23 #include <gobject/gclosure.h>
24 #include <gobject/gvalue.h>
25 #include <gobject/gparam.h>
26 #include <gobject/gmarshal.h>
31 /* --- typedefs --- */
32 typedef struct _GSignalQuery GSignalQuery;
33 typedef struct _GSignalInvocationHint GSignalInvocationHint;
34 typedef GClosureMarshal GSignalCMarshaller;
35 typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint,
37 const GValue *param_values,
39 typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint,
41 const GValue *handler_return,
45 /* --- run, match and connect types --- */
48 G_SIGNAL_RUN_FIRST = 1 << 0,
49 G_SIGNAL_RUN_LAST = 1 << 1,
50 G_SIGNAL_RUN_CLEANUP = 1 << 2,
51 G_SIGNAL_NO_RECURSE = 1 << 3,
52 G_SIGNAL_DETAILED = 1 << 4,
53 G_SIGNAL_ACTION = 1 << 5,
54 G_SIGNAL_NO_HOOKS = 1 << 6
56 #define G_SIGNAL_FLAGS_MASK 0x7f
59 G_CONNECT_AFTER = 1 << 0,
60 G_CONNECT_SWAPPED = 1 << 1
64 G_SIGNAL_MATCH_ID = 1 << 0,
65 G_SIGNAL_MATCH_DETAIL = 1 << 1,
66 G_SIGNAL_MATCH_CLOSURE = 1 << 2,
67 G_SIGNAL_MATCH_FUNC = 1 << 3,
68 G_SIGNAL_MATCH_DATA = 1 << 4,
69 G_SIGNAL_MATCH_UNBLOCKED = 1 << 5
71 #define G_SIGNAL_MATCH_MASK 0x3f
72 #define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT)
75 /* --- signal information --- */
76 struct _GSignalInvocationHint
80 GSignalFlags run_type;
85 const gchar *signal_name;
87 GSignalFlags signal_flags;
88 GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
90 const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
95 guint g_signal_newv (const gchar *signal_name,
97 GSignalFlags signal_flags,
98 GClosure *class_closure,
99 GSignalAccumulator accumulator,
101 GSignalCMarshaller c_marshaller,
105 guint g_signal_new_valist (const gchar *signal_name,
107 GSignalFlags signal_flags,
108 GClosure *class_closure,
109 GSignalAccumulator accumulator,
111 GSignalCMarshaller c_marshaller,
115 guint g_signal_new (const gchar *signal_name,
117 GSignalFlags signal_flags,
119 GSignalAccumulator accumulator,
121 GSignalCMarshaller c_marshaller,
125 void g_signal_emitv (const GValue *instance_and_params,
128 GValue *return_value);
129 void g_signal_emit_valist (gpointer instance,
133 void g_signal_emit (gpointer instance,
137 void g_signal_emit_by_name (gpointer instance,
138 const gchar *detailed_signal,
140 guint g_signal_lookup (const gchar *name,
142 G_CONST_RETURN gchar* g_signal_name (guint signal_id);
143 void g_signal_query (guint signal_id,
144 GSignalQuery *query);
145 guint* g_signal_list_ids (GType itype,
147 gboolean g_signal_parse_name (const gchar *detailed_signal,
151 gboolean force_detail_quark);
154 /* --- signal emissions --- */
155 void g_signal_stop_emission (gpointer instance,
158 void g_signal_stop_emission_by_name (gpointer instance,
159 const gchar *detailed_signal);
160 gulong g_signal_add_emission_hook (guint signal_id,
162 GSignalEmissionHook hook_func,
164 GDestroyNotify data_destroy);
165 void g_signal_remove_emission_hook (guint signal_id,
169 /* --- signal handlers --- */
170 gboolean g_signal_has_handler_pending (gpointer instance,
173 gboolean may_be_blocked);
174 gulong g_signal_connect_closure_by_id (gpointer instance,
179 gulong g_signal_connect_closure (gpointer instance,
180 const gchar *detailed_signal,
183 gulong g_signal_connect_data (gpointer instance,
184 const gchar *detailed_signal,
187 GClosureNotify destroy_data,
188 GConnectFlags connect_flags);
189 void g_signal_handler_block (gpointer instance,
191 void g_signal_handler_unblock (gpointer instance,
193 void g_signal_handler_disconnect (gpointer instance,
195 gboolean g_signal_handler_is_connected (gpointer instance,
197 gulong g_signal_handler_find (gpointer instance,
198 GSignalMatchType mask,
204 guint g_signal_handlers_block_matched (gpointer instance,
205 GSignalMatchType mask,
211 guint g_signal_handlers_unblock_matched (gpointer instance,
212 GSignalMatchType mask,
218 guint g_signal_handlers_disconnect_matched (gpointer instance,
219 GSignalMatchType mask,
227 /* --- convenience --- */
228 #define g_signal_connect(instance, detailed_signal, c_handler, data) \
229 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, 0)
230 #define g_signal_connect_after(instance, detailed_signal, c_handler, data) \
231 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER)
232 #define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \
233 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED)
234 #define g_signal_handlers_disconnect_by_func(instance, func, data) \
235 g_signal_handlers_disconnect_matched ((instance), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, \
236 0, 0, NULL, (func), (data))
237 #define g_signal_handlers_block_by_func(instance, func, data) \
238 g_signal_handlers_block_matched ((instance), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, \
239 0, 0, NULL, (func), (data))
240 #define g_signal_handlers_unblock_by_func(instance, func, data) \
241 g_signal_handlers_unblock_matched ((instance), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, \
242 0, 0, NULL, (func), (data))
246 void g_signal_handlers_destroy (gpointer instance);
247 void _g_signals_destroy (GType itype);
251 #endif /* __G_SIGNAL_H__ */