williamr@2: /* GObject - GLib Type, Object, Parameter and Signal Library williamr@2: * Copyright (C) 2000-2001 Red Hat, Inc. williamr@2: * Portions copyright (c) 2006 Nokia Corporation. All rights reserved. williamr@2: * williamr@2: * This library is free software; you can redistribute it and/or williamr@2: * modify it under the terms of the GNU Lesser General Public williamr@2: * License as published by the Free Software Foundation; either williamr@2: * version 2 of the License, or (at your option) any later version. williamr@2: * williamr@2: * This library is distributed in the hope that it will be useful, williamr@2: * but WITHOUT ANY WARRANTY; without even the implied warranty of williamr@2: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU williamr@2: * Lesser General Public License for more details. williamr@2: * williamr@2: * You should have received a copy of the GNU Lesser General williamr@2: * Public License along with this library; if not, write to the williamr@2: * Free Software Foundation, Inc., 59 Temple Place, Suite 330, williamr@2: * Boston, MA 02111-1307, USA. williamr@2: */ williamr@2: #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) williamr@2: #error "Only can be included directly." williamr@2: #endif williamr@2: williamr@2: #ifndef __G_SIGNAL_H__ williamr@2: #define __G_SIGNAL_H__ williamr@2: williamr@2: #include <_ansi.h> williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: #include williamr@2: williamr@2: G_BEGIN_DECLS williamr@2: williamr@2: /* --- typedefs --- */ williamr@2: typedef struct _GSignalQuery GSignalQuery; williamr@2: typedef struct _GSignalInvocationHint GSignalInvocationHint; williamr@2: typedef GClosureMarshal GSignalCMarshaller; williamr@2: typedef gboolean (*GSignalEmissionHook) (GSignalInvocationHint *ihint, williamr@2: guint n_param_values, williamr@2: const GValue *param_values, williamr@2: gpointer data); williamr@2: typedef gboolean (*GSignalAccumulator) (GSignalInvocationHint *ihint, williamr@2: GValue *return_accu, williamr@2: const GValue *handler_return, williamr@2: gpointer data); williamr@2: williamr@2: williamr@2: /* --- run, match and connect types --- */ williamr@2: typedef enum williamr@2: { williamr@2: G_SIGNAL_RUN_FIRST = 1 << 0, williamr@2: G_SIGNAL_RUN_LAST = 1 << 1, williamr@2: G_SIGNAL_RUN_CLEANUP = 1 << 2, williamr@2: G_SIGNAL_NO_RECURSE = 1 << 3, williamr@2: G_SIGNAL_DETAILED = 1 << 4, williamr@2: G_SIGNAL_ACTION = 1 << 5, williamr@2: G_SIGNAL_NO_HOOKS = 1 << 6 williamr@2: } GSignalFlags; williamr@2: #define G_SIGNAL_FLAGS_MASK 0x7f williamr@2: typedef enum williamr@2: { williamr@2: G_CONNECT_AFTER = 1 << 0, williamr@2: G_CONNECT_SWAPPED = 1 << 1 williamr@2: } GConnectFlags; williamr@2: typedef enum williamr@2: { williamr@2: G_SIGNAL_MATCH_ID = 1 << 0, williamr@2: G_SIGNAL_MATCH_DETAIL = 1 << 1, williamr@2: G_SIGNAL_MATCH_CLOSURE = 1 << 2, williamr@2: G_SIGNAL_MATCH_FUNC = 1 << 3, williamr@2: G_SIGNAL_MATCH_DATA = 1 << 4, williamr@2: G_SIGNAL_MATCH_UNBLOCKED = 1 << 5 williamr@2: } GSignalMatchType; williamr@2: #define G_SIGNAL_MATCH_MASK 0x3f williamr@2: #define G_SIGNAL_TYPE_STATIC_SCOPE (G_TYPE_FLAG_RESERVED_ID_BIT) williamr@2: williamr@2: williamr@2: /* --- signal information --- */ williamr@2: struct _GSignalInvocationHint williamr@2: { williamr@2: guint signal_id; williamr@2: GQuark detail; williamr@2: GSignalFlags run_type; williamr@2: }; williamr@2: struct _GSignalQuery williamr@2: { williamr@2: guint signal_id; williamr@2: const gchar *signal_name; williamr@2: GType itype; williamr@2: GSignalFlags signal_flags; williamr@2: GType return_type; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ williamr@2: guint n_params; williamr@2: const GType *param_types; /* mangled with G_SIGNAL_TYPE_STATIC_SCOPE flag */ williamr@2: }; williamr@2: williamr@2: williamr@2: /* --- signals --- */ williamr@2: IMPORT_C guint g_signal_newv (const gchar *signal_name, williamr@2: GType itype, williamr@2: GSignalFlags signal_flags, williamr@2: GClosure *class_closure, williamr@2: GSignalAccumulator accumulator, williamr@2: gpointer accu_data, williamr@2: GSignalCMarshaller c_marshaller, williamr@2: GType return_type, williamr@2: guint n_params, williamr@2: GType *param_types); williamr@2: IMPORT_C guint g_signal_new_valist (const gchar *signal_name, williamr@2: GType itype, williamr@2: GSignalFlags signal_flags, williamr@2: GClosure *class_closure, williamr@2: GSignalAccumulator accumulator, williamr@2: gpointer accu_data, williamr@2: GSignalCMarshaller c_marshaller, williamr@2: GType return_type, williamr@2: guint n_params, williamr@2: va_list args); williamr@2: IMPORT_C guint g_signal_new (const gchar *signal_name, williamr@2: GType itype, williamr@2: GSignalFlags signal_flags, williamr@2: guint class_offset, williamr@2: GSignalAccumulator accumulator, williamr@2: gpointer accu_data, williamr@2: GSignalCMarshaller c_marshaller, williamr@2: GType return_type, williamr@2: guint n_params, williamr@2: ...); williamr@2: IMPORT_C void g_signal_emitv (const GValue *instance_and_params, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GValue *return_value); williamr@2: IMPORT_C void g_signal_emit_valist (gpointer instance, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: va_list var_args); williamr@2: IMPORT_C void g_signal_emit (gpointer instance, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: ...); williamr@2: IMPORT_C void g_signal_emit_by_name (gpointer instance, williamr@2: const gchar *detailed_signal, williamr@2: ...); williamr@2: IMPORT_C guint g_signal_lookup (const gchar *name, williamr@2: GType itype); williamr@2: IMPORT_C G_CONST_RETURN gchar* g_signal_name (guint signal_id); williamr@2: IMPORT_C void g_signal_query (guint signal_id, williamr@2: GSignalQuery *query); williamr@2: IMPORT_C guint* g_signal_list_ids (GType itype, williamr@2: guint *n_ids); williamr@2: IMPORT_C gboolean g_signal_parse_name (const gchar *detailed_signal, williamr@2: GType itype, williamr@2: guint *signal_id_p, williamr@2: GQuark *detail_p, williamr@2: gboolean force_detail_quark); williamr@2: IMPORT_C GSignalInvocationHint* g_signal_get_invocation_hint (gpointer instance); williamr@2: williamr@2: williamr@2: /* --- signal emissions --- */ williamr@2: IMPORT_C void g_signal_stop_emission (gpointer instance, williamr@2: guint signal_id, williamr@2: GQuark detail); williamr@2: IMPORT_C void g_signal_stop_emission_by_name (gpointer instance, williamr@2: const gchar *detailed_signal); williamr@2: IMPORT_C gulong g_signal_add_emission_hook (guint signal_id, williamr@2: GQuark detail, williamr@2: GSignalEmissionHook hook_func, williamr@2: gpointer hook_data, williamr@2: GDestroyNotify data_destroy); williamr@2: IMPORT_C void g_signal_remove_emission_hook (guint signal_id, williamr@2: gulong hook_id); williamr@2: williamr@2: williamr@2: /* --- signal handlers --- */ williamr@2: IMPORT_C gboolean g_signal_has_handler_pending (gpointer instance, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: gboolean may_be_blocked); williamr@2: IMPORT_C gulong g_signal_connect_closure_by_id (gpointer instance, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GClosure *closure, williamr@2: gboolean after); williamr@2: IMPORT_C gulong g_signal_connect_closure (gpointer instance, williamr@2: const gchar *detailed_signal, williamr@2: GClosure *closure, williamr@2: gboolean after); williamr@2: IMPORT_C gulong g_signal_connect_data (gpointer instance, williamr@2: const gchar *detailed_signal, williamr@2: GCallback c_handler, williamr@2: gpointer data, williamr@2: GClosureNotify destroy_data, williamr@2: GConnectFlags connect_flags); williamr@2: IMPORT_C void g_signal_handler_block (gpointer instance, williamr@2: gulong handler_id); williamr@2: IMPORT_C void g_signal_handler_unblock (gpointer instance, williamr@2: gulong handler_id); williamr@2: IMPORT_C void g_signal_handler_disconnect (gpointer instance, williamr@2: gulong handler_id); williamr@2: IMPORT_C gboolean g_signal_handler_is_connected (gpointer instance, williamr@2: gulong handler_id); williamr@2: IMPORT_C gulong g_signal_handler_find (gpointer instance, williamr@2: GSignalMatchType mask, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GClosure *closure, williamr@2: gpointer func, williamr@2: gpointer data); williamr@2: IMPORT_C guint g_signal_handlers_block_matched (gpointer instance, williamr@2: GSignalMatchType mask, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GClosure *closure, williamr@2: gpointer func, williamr@2: gpointer data); williamr@2: IMPORT_C guint g_signal_handlers_unblock_matched (gpointer instance, williamr@2: GSignalMatchType mask, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GClosure *closure, williamr@2: gpointer func, williamr@2: gpointer data); williamr@2: IMPORT_C guint g_signal_handlers_disconnect_matched (gpointer instance, williamr@2: GSignalMatchType mask, williamr@2: guint signal_id, williamr@2: GQuark detail, williamr@2: GClosure *closure, williamr@2: gpointer func, williamr@2: gpointer data); williamr@2: williamr@2: williamr@2: /* --- chaining for language bindings --- */ williamr@2: IMPORT_C void g_signal_override_class_closure (guint signal_id, williamr@2: GType instance_type, williamr@2: GClosure *class_closure); williamr@2: IMPORT_C void g_signal_chain_from_overridden (const GValue *instance_and_params, williamr@2: GValue *return_value); williamr@2: williamr@2: williamr@2: /* --- convenience --- */ williamr@2: #define g_signal_connect(instance, detailed_signal, c_handler, data) \ williamr@2: g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (GConnectFlags) 0) williamr@2: #define g_signal_connect_after(instance, detailed_signal, c_handler, data) \ williamr@2: g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER) williamr@2: #define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \ williamr@2: g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED) williamr@2: #define g_signal_handlers_disconnect_by_func(instance, func, data) \ williamr@2: g_signal_handlers_disconnect_matched ((instance), \ williamr@2: (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ williamr@2: 0, 0, NULL, (func), (data)) williamr@2: #define g_signal_handlers_block_by_func(instance, func, data) \ williamr@2: g_signal_handlers_block_matched ((instance), \ williamr@2: (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ williamr@2: 0, 0, NULL, (func), (data)) williamr@2: #define g_signal_handlers_unblock_by_func(instance, func, data) \ williamr@2: g_signal_handlers_unblock_matched ((instance), \ williamr@2: (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), \ williamr@2: 0, 0, NULL, (func), (data)) williamr@2: williamr@2: williamr@2: IMPORT_C gboolean g_signal_accumulator_true_handled (GSignalInvocationHint *ihint, williamr@2: GValue *return_accu, williamr@2: const GValue *handler_return, williamr@2: gpointer dummy); williamr@2: williamr@2: /*< private >*/ williamr@2: IMPORT_C void g_signal_handlers_destroy (gpointer instance); williamr@2: void _g_signals_destroy (GType itype); williamr@2: williamr@2: G_END_DECLS williamr@2: williamr@2: #endif /* __G_SIGNAL_H__ */