1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 2000-2001 Red Hat, Inc.
3 * Portions copyright (c) 2006 Nokia Corporation. All rights reserved.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General
16 * Public License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
18 * Boston, MA 02111-1307, USA.
20 #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
21 #error "Only <glib-object.h> can be included directly."
24 #ifndef __G_SIGNAL_H__
25 #define __G_SIGNAL_H__
28 #include <gobject/gclosure.h>
29 #include <gobject/gvalue.h>
30 #include <gobject/gparam.h>
31 #include <gobject/gmarshal.h>
35 /* --- typedefs --- */
36 typedef struct _GSignalQuery GSignalQuery;
37 typedef struct _GSignalInvocationHint GSignalInvocationHint;
38 typedef GClosureMarshal GSignalCMarshaller;
39 typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint,
41 const GValue *param_values,
43 typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint,
45 const GValue *handler_return,
49 /* --- run, match and connect types --- */
52 G_SIGNAL_RUN_FIRST = 1 << 0,
53 G_SIGNAL_RUN_LAST = 1 << 1,
54 G_SIGNAL_RUN_CLEANUP = 1 << 2,
55 G_SIGNAL_NO_RECURSE = 1 << 3,
56 G_SIGNAL_DETAILED = 1 << 4,
57 G_SIGNAL_ACTION = 1 << 5,
58 G_SIGNAL_NO_HOOKS = 1 << 6
60 #define G_SIGNAL_FLAGS_MASK 0x7f
63 G_CONNECT_AFTER = 1 << 0,
64 G_CONNECT_SWAPPED = 1 << 1
68 G_SIGNAL_MATCH_ID = 1 << 0,
69 G_SIGNAL_MATCH_DETAIL = 1 << 1,
70 G_SIGNAL_MATCH_CLOSURE = 1 << 2,
71 G_SIGNAL_MATCH_FUNC = 1 << 3,
72 G_SIGNAL_MATCH_DATA = 1 << 4,
73 G_SIGNAL_MATCH_UNBLOCKED = 1 << 5
75 #define G_SIGNAL_MATCH_MASK 0x3f
76 #define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT)
79 /* --- signal information --- */
80 struct _GSignalInvocationHint
84 GSignalFlags run_type;
89 const gchar *signal_name;
91 GSignalFlags signal_flags;
92 GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
94 const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */
99 IMPORT_C guint g_signal_newv (const gchar *signal_name,
101 GSignalFlags signal_flags,
102 GClosure *class_closure,
103 GSignalAccumulator accumulator,
105 GSignalCMarshaller c_marshaller,
109 IMPORT_C guint g_signal_new_valist (const gchar *signal_name,
111 GSignalFlags signal_flags,
112 GClosure *class_closure,
113 GSignalAccumulator accumulator,
115 GSignalCMarshaller c_marshaller,
119 IMPORT_C guint g_signal_new (const gchar *signal_name,
121 GSignalFlags signal_flags,
123 GSignalAccumulator accumulator,
125 GSignalCMarshaller c_marshaller,
129 IMPORT_C void g_signal_emitv (const GValue *instance_and_params,
132 GValue *return_value);
133 IMPORT_C void g_signal_emit_valist (gpointer instance,
137 IMPORT_C void g_signal_emit (gpointer instance,
141 IMPORT_C void g_signal_emit_by_name (gpointer instance,
142 const gchar *detailed_signal,
144 IMPORT_C guint g_signal_lookup (const gchar *name,
146 IMPORT_C G_CONST_RETURN gchar* g_signal_name (guint signal_id);
147 IMPORT_C void g_signal_query (guint signal_id,
148 GSignalQuery *query);
149 IMPORT_C guint* g_signal_list_ids (GType itype,
151 IMPORT_C gboolean g_signal_parse_name (const gchar *detailed_signal,
155 gboolean force_detail_quark);
156 IMPORT_C GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance);
159 /* --- signal emissions --- */
160 IMPORT_C void g_signal_stop_emission (gpointer instance,
163 IMPORT_C void g_signal_stop_emission_by_name (gpointer instance,
164 const gchar *detailed_signal);
165 IMPORT_C gulong g_signal_add_emission_hook (guint signal_id,
167 GSignalEmissionHook hook_func,
169 GDestroyNotify data_destroy);
170 IMPORT_C void g_signal_remove_emission_hook (guint signal_id,
174 /* --- signal handlers --- */
175 IMPORT_C gboolean g_signal_has_handler_pending (gpointer instance,
178 gboolean may_be_blocked);
179 IMPORT_C gulong g_signal_connect_closure_by_id (gpointer instance,
184 IMPORT_C gulong g_signal_connect_closure (gpointer instance,
185 const gchar *detailed_signal,
188 IMPORT_C gulong g_signal_connect_data (gpointer instance,
189 const gchar *detailed_signal,
192 GClosureNotify destroy_data,
193 GConnectFlags connect_flags);
194 IMPORT_C void g_signal_handler_block (gpointer instance,
196 IMPORT_C void g_signal_handler_unblock (gpointer instance,
198 IMPORT_C void g_signal_handler_disconnect (gpointer instance,
200 IMPORT_C gboolean g_signal_handler_is_connected (gpointer instance,
202 IMPORT_C gulong g_signal_handler_find (gpointer instance,
203 GSignalMatchType mask,
209 IMPORT_C guint g_signal_handlers_block_matched (gpointer instance,
210 GSignalMatchType mask,
216 IMPORT_C guint g_signal_handlers_unblock_matched (gpointer instance,
217 GSignalMatchType mask,
223 IMPORT_C guint g_signal_handlers_disconnect_matched (gpointer instance,
224 GSignalMatchType mask,
232 /* --- chaining for language bindings --- */
233 IMPORT_C void g_signal_override_class_closure (guint signal_id,
235 GClosure *class_closure);
236 IMPORT_C void g_signal_chain_from_overridden (const GValue *instance_and_params,
237 GValue *return_value);
240 /* --- convenience --- */
241 #define g_signal_connect(instance, detailed_signal, c_handler, data) \
242 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0)
243 #define g_signal_connect_after(instance, detailed_signal, c_handler, data) \
244 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER)
245 #define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \
246 g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED)
247 #define g_signal_handlers_disconnect_by_func(instance, func, data) \
248 g_signal_handlers_disconnect_matched ((instance), \
249 (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
250 0, 0, NULL, (func), (data))
251 #define g_signal_handlers_block_by_func(instance, func, data) \
252 g_signal_handlers_block_matched ((instance), \
253 (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
254 0, 0, NULL, (func), (data))
255 #define g_signal_handlers_unblock_by_func(instance, func, data) \
256 g_signal_handlers_unblock_matched ((instance), \
257 (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \
258 0, 0, NULL, (func), (data))
261 IMPORT_C gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint,
263 const GValue *handler_return,
267 IMPORT_C void g_signal_handlers_destroy (gpointer instance);
268 void _g_signals_destroy (GType itype);
272 #endif /* __G_SIGNAL_H__ */