diff options
author | Tim Janik <timj@gtk.org> | 1998-05-08 23:20:48 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-05-08 23:20:48 +0000 |
commit | 142c8483080b03bc415ae630f979b3327c505abc (patch) | |
tree | 00e6977d7fe4bc543ab8035121b0547f2e14174e /gtk/gtksignal.c | |
parent | 6e99903a4efb324f0a2bdcc3936a7a73064b21fa (diff) | |
download | gdk-pixbuf-142c8483080b03bc415ae630f979b3327c505abc.tar.gz |
reflect the presence of signal connections through unsetting
Sat May 9 00:03:12 1998 Tim Janik <timj@gtk.org>
* gtk/gtksignal.c (gtk_signal_handler_unref): reflect the presence of
signal connections through unsetting GTK_CONNECTED.
(gtk_signal_handler_insert): reflect the presence of signal connections
through setting GTK_CONNECTED.
(gtk_signal_real_emit): only check for handler emissions if the object
has the GTK_CONNECTED flag set.
(gtk_signal_handler_pending): don't check for pending handlers if the
GTK_CONNECTED flag is not set for this object.
* gtk/gtkobject.h (enum): new flag GTK_CONNECTED to indicate whether
a GtkObject has signal handler connections.
* gtk/gtkobject.c (gtk_object_real_destroy): only if GTK_CONNECTED is
set for this object call gtk_signal_handlers_destroy().
* gtk/gtktypeutils.h (GTK_TYPE_IS_A): deprecated macro, since it caused
multiple processing of macro args.
* gtk/gtktypeutils.c:
* gtk/gtkobject.c:
* gtk/gtkwidget.c:
* gtk/gtksignal.c: reverted GTK_TYPE_IS_A back to gtk_type_is_a.
Diffstat (limited to 'gtk/gtksignal.c')
-rw-r--r-- | gtk/gtksignal.c | 100 |
1 files changed, 69 insertions, 31 deletions
diff --git a/gtk/gtksignal.c b/gtk/gtksignal.c index 64257e087..1df6092e4 100644 --- a/gtk/gtksignal.c +++ b/gtk/gtksignal.c @@ -392,7 +392,7 @@ gtk_signal_lookup (const gchar *name, GtkSignalHash hash; g_return_val_if_fail (name != NULL, 0); - g_return_val_if_fail (GTK_TYPE_IS_A (object_type, GTK_TYPE_OBJECT), 0); + g_return_val_if_fail (gtk_type_is_a (object_type, GTK_TYPE_OBJECT), 0); hash.name_key_id = gtk_object_data_try_key (name); if (hash.name_key_id) @@ -1204,8 +1204,13 @@ gtk_signal_handler_unref (GtkHandler *handler, if (handler->prev) handler->prev->next = handler->next; - else + else if (handler->next) gtk_object_set_data_by_id (object, handler_key_id, handler->next); + else + { + GTK_OBJECT_UNSET_FLAGS (object, GTK_CONNECTED); + gtk_object_set_data_by_id (object, handler_key_id, NULL); + } if (handler->next) handler->next->prev = handler->prev; @@ -1225,7 +1230,10 @@ gtk_signal_handler_insert (GtkObject *object, tmp = gtk_object_get_data_by_id (object, handler_key_id); if (!tmp) - gtk_object_set_data_by_id (object, handler_key_id, handler); + { + GTK_OBJECT_SET_FLAGS (object, GTK_CONNECTED); + gtk_object_set_data_by_id (object, handler_key_id, handler); + } else while (tmp) { @@ -1266,7 +1274,7 @@ gtk_signal_real_emit (GtkObject *object, 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)); + g_return_if_fail (gtk_type_is_a (GTK_OBJECT_TYPE (object), signal->object_type)); if ((signal->run_type & GTK_RUN_NO_RECURSE) && gtk_emission_check (current_emissions, object, signal_id)) @@ -1292,25 +1300,35 @@ gtk_signal_real_emit (GtkObject *object, NULL, params); } - info.object = object; - info.marshaller = signal->marshaller; - info.params = params; - info.param_types = signal->params; - info.return_val = signal->return_val; - info.nparams = signal->nparams; - info.run_type = signal->run_type; - info.signal_id = signal_id; - - handlers = gtk_signal_get_handlers (object, signal_id); - switch (gtk_handlers_run (handlers, &info, FALSE)) + if (GTK_OBJECT_CONNECTED (object)) { - case EMISSION_CONTINUE: - break; - case EMISSION_RESTART: - goto emission_restart; - case EMISSION_DONE: - goto emission_done; + handlers = gtk_signal_get_handlers (object, signal_id); + if (handlers) + { + info.object = object; + info.marshaller = signal->marshaller; + info.params = params; + info.param_types = signal->params; + info.return_val = signal->return_val; + info.nparams = signal->nparams; + info.run_type = signal->run_type; + info.signal_id = signal_id; + + switch (gtk_handlers_run (handlers, &info, FALSE)) + { + case EMISSION_CONTINUE: + break; + case EMISSION_RESTART: + goto emission_restart; + case EMISSION_DONE: + goto emission_done; + } + } + else + info.object = NULL; } + else + info.object = NULL; if (GTK_RUN_TYPE (signal->run_type) != GTK_RUN_FIRST && signal->function_offset != 0) { @@ -1321,15 +1339,32 @@ gtk_signal_real_emit (GtkObject *object, NULL, params); } - handlers = gtk_signal_get_handlers (object, signal_id); - switch (gtk_handlers_run (handlers, &info, TRUE)) + if (GTK_OBJECT_CONNECTED (object)) { - case EMISSION_CONTINUE: - break; - case EMISSION_RESTART: - goto emission_restart; - case EMISSION_DONE: - goto emission_done; + handlers = gtk_signal_get_handlers (object, signal_id); + if (handlers) + { + if (!info.object) + { + info.object = object; + info.marshaller = signal->marshaller; + info.params = params; + info.param_types = signal->params; + info.return_val = signal->return_val; + info.nparams = signal->nparams; + info.run_type = signal->run_type; + info.signal_id = signal_id; + } + switch (gtk_handlers_run (handlers, &info, TRUE)) + { + case EMISSION_CONTINUE: + break; + case EMISSION_RESTART: + goto emission_restart; + case EMISSION_DONE: + goto emission_done; + } + } } emission_done: @@ -1370,8 +1405,11 @@ gtk_signal_handler_pending (GtkObject *object, g_return_val_if_fail (object != NULL, 0); g_return_val_if_fail (signal_id >= 1, 0); - - handlers = gtk_signal_get_handlers (object, signal_id); + + if (GTK_OBJECT_CONNECTED (object)) + handlers = gtk_signal_get_handlers (object, signal_id); + else + return 0; handler_id = 0; while (handlers && handlers->signal_id == signal_id) |