diff options
author | Tim Janik <timj@gtk.org> | 1998-05-09 01:17:03 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-05-09 01:17:03 +0000 |
commit | 9775962a96fc7e5bae7284642739243bbdfc8297 (patch) | |
tree | 5ec1d9a9638b42570540253869118cb6945d422d /gtk/gtksignal.c | |
parent | 142c8483080b03bc415ae630f979b3327c505abc (diff) | |
download | gtk+-9775962a96fc7e5bae7284642739243bbdfc8297.tar.gz |
new file used as template for new file to define macros indicating newly
Sat May 9 02:34:41 1998 Tim Janik <timj@gtk.org>
* gtk/gtkfeatures.h.in: new file used as template for
* gtk/gtkfeatures.h: new file to define macros indicating newly
introduced features, such as GTK_HAVE_SIGNAL_INIT.
* gtk/gtksignal.c:
(gtk_signal_emitv_by_name):
(gtk_signal_emitv):
new functions to emit signals with an already provided parameter set.
(provided by Kenneth Albanowski <kjahds@kjahds.com>).
(gtk_signal_real_emit): prototype changes, so this functions always
gets its parameters and signal structure as arguments.
(gtk_signal_emit): provide the signal structure and parameter list for
gtk_signal_real_emit.
(gtk_signal_emit_by_name): likewise.
Diffstat (limited to 'gtk/gtksignal.c')
-rw-r--r-- | gtk/gtksignal.c | 116 |
1 files changed, 89 insertions, 27 deletions
diff --git a/gtk/gtksignal.c b/gtk/gtksignal.c index 1df6092e44..2a84d138e7 100644 --- a/gtk/gtksignal.c +++ b/gtk/gtksignal.c @@ -24,7 +24,7 @@ #define HANDLER_BLOCK_SIZE (200) #define EMISSION_BLOCK_SIZE (100) #define DISCONNECT_INFO_BLOCK_SIZE (64) -#define GTK_MAX_SIGNAL_PARAMS (32) +#define MAX_SIGNAL_PARAMS (32) enum { @@ -127,8 +127,8 @@ static void gtk_signal_handler_unref (GtkHandler *handler, static void gtk_signal_handler_insert (GtkObject *object, GtkHandler *handler); static void gtk_signal_real_emit (GtkObject *object, - guint signal_type, - va_list args); + GtkSignal *signal, + GtkArg *params); static GtkHandler* gtk_signal_get_handlers (GtkObject *object, guint signal_type); static guint gtk_signal_connect_by_type (GtkObject *object, @@ -274,7 +274,7 @@ gtk_signal_newv (const gchar *r_name, g_return_val_if_fail (r_name != NULL, 0); g_return_val_if_fail (marshaller != NULL, 0); - g_return_val_if_fail (nparams <= GTK_MAX_SIGNAL_PARAMS, 0); + g_return_val_if_fail (nparams <= MAX_SIGNAL_PARAMS, 0); if (nparams) g_return_val_if_fail (params != NULL, 0); @@ -355,7 +355,7 @@ gtk_signal_new (const gchar *name, va_list args; guint signal_id; - g_return_val_if_fail (nparams <= GTK_MAX_SIGNAL_PARAMS, 0); + g_return_val_if_fail (nparams <= MAX_SIGNAL_PARAMS, 0); if (nparams > 0) { @@ -457,20 +457,79 @@ gtk_signal_name (guint signal_id) } void +gtk_signal_emitv (GtkObject *object, + guint signal_id, + GtkArg *params) +{ + GtkSignal *signal; + + g_return_if_fail (object != NULL); + g_return_if_fail (signal_id >= 1); + g_return_if_fail (params != NULL); + + signal = LOOKUP_SIGNAL_ID (signal_id); + g_return_if_fail (signal != NULL); + g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); + + gtk_signal_real_emit (object, signal, params); +} + +void gtk_signal_emit (GtkObject *object, - guint signal_id, + guint signal_id, ...) { - va_list args; - + GtkSignal *signal; + va_list args; + GtkArg params[MAX_SIGNAL_PARAMS]; + g_return_if_fail (object != NULL); g_return_if_fail (signal_id >= 1); + signal = LOOKUP_SIGNAL_ID (signal_id); + g_return_if_fail (signal != NULL); + g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); + va_start (args, signal_id); + gtk_params_get (params, + signal->nparams, + signal->params, + signal->return_val, + args); + va_end (args); + + gtk_signal_real_emit (object, signal, params); +} + +void +gtk_signal_emitv_by_name (GtkObject *object, + const gchar *name, + GtkArg *params) +{ + guint signal_id; + + g_return_if_fail (object != NULL); + g_return_if_fail (name != NULL); + g_return_if_fail (params != NULL); - gtk_signal_real_emit (object, signal_id, args); + signal_id = gtk_signal_lookup (name, GTK_OBJECT_TYPE (object)); - va_end (args); + if (signal_id >= 1) + { + GtkSignal *signal; + + signal = LOOKUP_SIGNAL_ID (signal_id); + g_return_if_fail (signal != NULL); + g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); + + gtk_signal_real_emit (object, signal, params); + } + else + { + g_warning ("gtk_signal_emitv_by_name(): could not find signal \"%s\" in the `%s' class ancestry", + name, + gtk_type_name (GTK_OBJECT_TYPE (object))); + } } void @@ -479,7 +538,6 @@ gtk_signal_emit_by_name (GtkObject *object, ...) { guint signal_id; - va_list args; g_return_if_fail (object != NULL); g_return_if_fail (name != NULL); @@ -488,11 +546,23 @@ gtk_signal_emit_by_name (GtkObject *object, if (signal_id >= 1) { - va_start (args, name); - - gtk_signal_real_emit (object, signal_id, args); + GtkSignal *signal; + GtkArg params[MAX_SIGNAL_PARAMS]; + va_list args; + signal = LOOKUP_SIGNAL_ID (signal_id); + g_return_if_fail (signal != NULL); + g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); + + va_start (args, name); + gtk_params_get (params, + signal->nparams, + signal->params, + signal->return_val, + args); va_end (args); + + gtk_signal_real_emit (object, signal, params); } else { @@ -1263,18 +1333,13 @@ gtk_signal_handler_insert (GtkObject *object, static void gtk_signal_real_emit (GtkObject *object, - guint signal_id, - va_list args) + GtkSignal *signal, + GtkArg *params) { - GtkSignal *signal; GtkHandler *handlers; GtkHandlerInfo info; guchar **signal_func_offset; - GtkArg params[GTK_MAX_SIGNAL_PARAMS]; - - signal = LOOKUP_SIGNAL_ID (signal_id); - g_return_if_fail (signal != NULL); - g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); + register guint signal_id = signal->signal_id; if ((signal->run_type & GTK_RUN_NO_RECURSE) && gtk_emission_check (current_emissions, object, signal_id)) @@ -1283,12 +1348,9 @@ gtk_signal_real_emit (GtkObject *object, return; } - gtk_params_get (params, signal->nparams, signal->params, - signal->return_val, args); - - gtk_emission_add (¤t_emissions, object, signal_id); - gtk_object_ref (object); + + gtk_emission_add (¤t_emissions, object, signal_id); emission_restart: if (GTK_RUN_TYPE (signal->run_type) != GTK_RUN_LAST && signal->function_offset != 0) |