* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
struct _GtkHandler
{
guint id;
+ GtkHandler *next;
+ GtkHandler *prev;
guint blocked : 20;
guint object_signal : 1;
guint after : 1;
GtkSignalFunc func;
gpointer func_data;
GtkSignalDestroy destroy_func;
- GtkHandler *prev;
- GtkHandler *next;
};
struct _GtkEmission
static void gtk_signal_real_emit (GtkObject *object,
guint signal_id,
GtkArg *params);
-static GtkHandler* gtk_signal_get_handlers (GtkObject *object,
- guint signal_type);
static guint gtk_signal_connect_by_type (GtkObject *object,
guint signal_id,
GtkSignalFunc func,
va_list var_args);
#define LOOKUP_SIGNAL_ID(signal_id) ( \
- signal_id > 0 && signal_id < gtk_n_signals ? \
- (GtkSignal*) gtk_signals + signal_id : \
+ signal_id > 0 && signal_id < _gtk_private_n_signals ? \
+ (GtkSignal*) _gtk_private_signals + signal_id : \
(GtkSignal*) 0 \
)
static GtkSignalDestroy global_destroy_notify = NULL;
static guint gtk_handler_id = 1;
-static guint handler_quark = 0;
+static guint gtk_handler_quark = 0;
static GHashTable *gtk_signal_hash_table = NULL;
-static GtkSignal *gtk_signals = NULL;
-static guint gtk_n_signals = 0;
+ GtkSignal *_gtk_private_signals = NULL;
+ guint _gtk_private_n_signals = 0;
static GMemChunk *gtk_signal_hash_mem_chunk = NULL;
static GMemChunk *gtk_disconnect_info_mem_chunk = NULL;
static GtkHandler *gtk_handler_free_list = NULL;
/* nearest pow
*/
- size = gtk_n_signals + SIGNAL_BLOCK_SIZE;
+ size = _gtk_private_n_signals + SIGNAL_BLOCK_SIZE;
size *= sizeof (GtkSignal);
i = 1;
while (i < size)
i <<= 1;
size = i;
- gtk_signals = g_realloc (gtk_signals, size);
+ _gtk_private_signals = g_realloc (_gtk_private_signals, size);
- gtk_n_free_signals = size / sizeof (GtkSignal) - gtk_n_signals;
+ gtk_n_free_signals = size / sizeof (GtkSignal) - _gtk_private_n_signals;
- memset (gtk_signals + gtk_n_signals, 0, gtk_n_free_signals * sizeof (GtkSignal));
+ memset (_gtk_private_signals + _gtk_private_n_signals, 0, gtk_n_free_signals * sizeof (GtkSignal));
}
- new_signal_id = gtk_n_signals++;
+ new_signal_id = _gtk_private_n_signals++;
gtk_n_free_signals--;
- g_assert (gtk_n_signals < 65535);
+ g_assert (_gtk_private_n_signals < 65535);
signal = LOOKUP_SIGNAL_ID (new_signal_id);
if (signal)
return signal;
}
+static inline GtkHandler*
+gtk_signal_get_handlers (GtkObject *object,
+ guint signal_id)
+{
+ GtkHandler *handlers;
+
+ handlers = gtk_object_get_data_by_id (object, gtk_handler_quark);
+
+ while (handlers)
+ {
+ if (handlers->signal_id == signal_id)
+ return handlers;
+ handlers = handlers->next;
+ }
+
+ return NULL;
+}
+
void
gtk_signal_init (void)
{
- if (!handler_quark)
+ if (!gtk_handler_quark)
{
GtkSignal *zero;
zero = gtk_signal_next_and_invalidate ();
g_assert (zero == NULL);
- handler_quark = g_quark_from_static_string ("gtk-signal-handlers");
+ gtk_handler_quark = g_quark_from_static_string ("gtk-signal-handlers");
gtk_signal_hash_mem_chunk =
g_mem_chunk_new ("GtkSignalHash mem chunk",
if (nparams)
g_return_val_if_fail (params != NULL, 0);
- if (!handler_quark)
+ if (!gtk_handler_quark)
gtk_signal_init ();
g_return_if_fail (object != NULL);
g_return_if_fail (handler_id > 0);
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (func != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (object != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (object != NULL);
g_return_if_fail (handler_id > 0);
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (func != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (object != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (object != NULL);
g_return_if_fail (handler_id > 0);
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (func != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
g_return_if_fail (object != NULL);
found_one = FALSE;
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
while (handler)
{
* handler_key data on each removal
*/
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
if (handler)
{
handler = handler->next;
gtk_signal_handler_unref (handler, object);
handler = next;
}
- handler = gtk_object_get_data_by_id (object, handler_quark);
+ handler = gtk_object_get_data_by_id (object, gtk_handler_quark);
if (handler->id > 0)
gtk_signal_handler_unref (handler, object);
}
if (handler->prev)
handler->prev->next = handler->next;
else if (handler->next)
- gtk_object_set_data_by_id (object, handler_quark, handler->next);
+ gtk_object_set_data_by_id (object, gtk_handler_quark, handler->next);
else
{
GTK_OBJECT_UNSET_FLAGS (object, GTK_CONNECTED);
- gtk_object_set_data_by_id (object, handler_quark, NULL);
+ gtk_object_set_data_by_id (object, gtk_handler_quark, NULL);
}
if (handler->next)
handler->next->prev = handler->prev;
/* FIXME: remove */ g_assert (handler->next == NULL);
/* FIXME: remove */ g_assert (handler->prev == NULL);
- tmp = gtk_object_get_data_by_id (object, handler_quark);
+ tmp = gtk_object_get_data_by_id (object, gtk_handler_quark);
if (!tmp)
{
GTK_OBJECT_SET_FLAGS (object, GTK_CONNECTED);
- gtk_object_set_data_by_id (object, handler_quark, handler);
+ gtk_object_set_data_by_id (object, gtk_handler_quark, handler);
}
else
while (tmp)
handler->prev = tmp->prev;
}
else
- gtk_object_set_data_by_id (object, handler_quark, handler);
+ gtk_object_set_data_by_id (object, gtk_handler_quark, handler);
tmp->prev = handler;
handler->next = tmp;
break;
gtk_object_unref (object);
}
-static GtkHandler*
-gtk_signal_get_handlers (GtkObject *object,
- guint signal_id)
-{
- GtkHandler *handlers;
-
- handlers = gtk_object_get_data_by_id (object, handler_quark);
-
- while (handlers)
- {
- if (handlers->signal_id == signal_id)
- return handlers;
- handlers = handlers->next;
- }
-
- return NULL;
-}
-
guint
gtk_signal_handler_pending (GtkObject *object,
guint signal_id,
if (handlers->id > 0 &&
handlers->func == func &&
handlers->func_data == data &&
- (may_be_blocked || handlers->blocked == FALSE))
+ (may_be_blocked || handlers->blocked == 0))
{
handler_id = handlers->id;
break;
return handler_id;
}
+gint
+gtk_signal_handler_pending_by_id (GtkObject *object,
+ guint handler_id,
+ gboolean may_be_blocked)
+{
+ GtkHandler *handlers;
+
+ g_return_val_if_fail (object != NULL, FALSE);
+ g_return_val_if_fail (handler_id >= 1, FALSE);
+
+ if (GTK_OBJECT_CONNECTED (object))
+ handlers = gtk_object_get_data_by_id (object, gtk_handler_quark);
+ else
+ return FALSE;
+
+ while (handlers)
+ {
+ if (handlers->id == handler_id)
+ return may_be_blocked || handlers->blocked == 0;
+
+ handlers = handlers->next;
+ }
+
+ return FALSE;
+}
+
guint
gtk_signal_add_emission_hook (guint signal_id,
GtkEmissionHook hook_func,
handler = gtk_signal_handler_new ();
handler->id = gtk_handler_id++;
handler->signal_id = signal_id;
- handler->object_signal = object_signal;
+ handler->object_signal = object_signal != FALSE;
handler->func = func;
handler->func_data = func_data;
handler->destroy_func = destroy_func;