summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>1998-11-30 07:09:36 +0000
committerTim Janik <timj@src.gnome.org>1998-11-30 07:09:36 +0000
commit2c0fc39e626e93225e8d15ae8c1a51c1e6be79f0 (patch)
tree2d89e5a8abdaa694ecd320e617808f7732077d53
parent140c26afbc334a8c24f2f721597d6aa7d39d8827 (diff)
downloadgdk-pixbuf-2c0fc39e626e93225e8d15ae8c1a51c1e6be79f0.tar.gz
added an event watcher for enter/leave based on signal emission hooks.
Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org> * gtk/testgtk.c: added an event watcher for enter/leave based on signal emission hooks. * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a GTK_RUN_NO_HOOKS signal. * gtk/gtksignal.h: * gtk/gtksignal.c: implemented emission hooks, new hooks can be added to a signal with gtk_signal_add_emission_hook or gtk_signal_add_emission_hook_full, and can be removed again with gtk_signal_remove_emission_hook. * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent an appropriate mask for signal runtypes for a long time now. added GTK_RUN_NO_HOOKS value, which is used to flag signals that do not allow the running of signal hooks.
-rw-r--r--ChangeLog19
-rw-r--r--ChangeLog.pre-2-019
-rw-r--r--ChangeLog.pre-2-1019
-rw-r--r--ChangeLog.pre-2-219
-rw-r--r--ChangeLog.pre-2-419
-rw-r--r--ChangeLog.pre-2-619
-rw-r--r--ChangeLog.pre-2-819
-rw-r--r--gtk/gtkenums.h10
-rw-r--r--gtk/gtkobject.c2
-rw-r--r--gtk/gtksignal.c110
-rw-r--r--gtk/gtksignal.h18
-rw-r--r--gtk/testgtk.c103
-rw-r--r--tests/testgtk.c103
13 files changed, 459 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-0
+++ b/ChangeLog.pre-2-0
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-2
+++ b/ChangeLog.pre-2-2
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-4
+++ b/ChangeLog.pre-2-4
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index ed39fe00e..05e15c24d 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,22 @@
+Mon Nov 30 06:20:36 1998 Tim Janik <timj@gtk.org>
+
+ * gtk/testgtk.c: added an event watcher for enter/leave based on
+ signal emission hooks.
+
+ * gtk/gtkobject.c (gtk_object_class_init): made GtkObject::destroy a
+ GTK_RUN_NO_HOOKS signal.
+
+ * gtk/gtksignal.h:
+ * gtk/gtksignal.c: implemented emission hooks, new hooks can be added
+ to a signal with gtk_signal_add_emission_hook or
+ gtk_signal_add_emission_hook_full, and can be removed again with
+ gtk_signal_remove_emission_hook.
+
+ * gtk/gtkenums.h: remove GTK_RUN_MASK, since it doesn't represent
+ an appropriate mask for signal runtypes for a long time now.
+ added GTK_RUN_NO_HOOKS value, which is used to flag signals
+ that do not allow the running of signal hooks.
+
1998-11-26 Michael Krause <m.krause@tu-harburg.de>
* gtk/gtknotebook.c (gtk_notebook_switch_page): made 'page_num'
diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h
index d03eddd12..3dd9a8aa7 100644
--- a/gtk/gtkenums.h
+++ b/gtk/gtkenums.h
@@ -194,12 +194,12 @@ typedef enum
/* signal run types */
typedef enum /*< flags >*/
{
- GTK_RUN_FIRST = 0x1,
- GTK_RUN_LAST = 0x2,
- GTK_RUN_BOTH = 0x3,
- GTK_RUN_MASK = 0xF,
+ GTK_RUN_FIRST = 0x01,
+ GTK_RUN_LAST = 0x02,
+ GTK_RUN_BOTH = (GTK_RUN_FIRST | GTK_RUN_LAST),
GTK_RUN_NO_RECURSE = 0x10,
- GTK_RUN_ACTION = 0x20
+ GTK_RUN_ACTION = 0x20,
+ GTK_RUN_NO_HOOKS = 0x30
} GtkSignalRunType;
/* scrolling types */
diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c
index 15dd70608..c8b727428 100644
--- a/gtk/gtkobject.c
+++ b/gtk/gtkobject.c
@@ -166,7 +166,7 @@ gtk_object_class_init (GtkObjectClass *class)
object_signals[DESTROY] =
gtk_signal_new ("destroy",
- GTK_RUN_LAST,
+ GTK_RUN_LAST | GTK_RUN_NO_HOOKS,
class->type,
GTK_SIGNAL_OFFSET (GtkObjectClass, destroy),
gtk_marshal_NONE__NONE,
diff --git a/gtk/gtksignal.c b/gtk/gtksignal.c
index f9b3bec44..7bfd9ee17 100644
--- a/gtk/gtksignal.c
+++ b/gtk/gtksignal.c
@@ -36,7 +36,7 @@ enum
EMISSION_DONE
};
-#define GTK_RUN_TYPE(x) ((x) & GTK_RUN_MASK)
+#define GTK_RUN_TYPE(x) ((x) & GTK_RUN_BOTH)
typedef struct _GtkSignal GtkSignal;
@@ -55,11 +55,12 @@ struct _GtkSignal
GtkType object_type;
gchar *name;
guint function_offset;
- GtkSignalRunType signal_flags;
GtkSignalMarshaller marshaller;
GtkType return_val;
+ GtkSignalRunType signal_flags : 16;
+ guint nparams : 16;
GtkType *params;
- guint nparams;
+ GHookList *hook_list;
};
struct _GtkSignalHash
@@ -145,7 +146,9 @@ static gint gtk_handlers_run (GtkHandler *handlers,
GtkObject *object,
GtkArg *params,
gint after);
-static gboolean gtk_signal_collect_params (GtkArg *params,
+static gboolean gtk_emission_hook_marshaller (GHook *hook,
+ gpointer data);
+static gboolean gtk_signal_collect_params (GtkArg *params,
guint nparams,
GtkType *param_types,
GtkType return_type,
@@ -303,10 +306,11 @@ gtk_signal_newv (const gchar *r_name,
signal->object_type = object_type;
signal->name = name;
signal->function_offset = function_offset;
- signal->signal_flags = signal_flags;
signal->marshaller = marshaller;
signal->return_val = return_val;
+ signal->signal_flags = signal_flags;
signal->nparams = nparams;
+ signal->hook_list = NULL;
if (nparams > 0)
{
@@ -1419,7 +1423,17 @@ gtk_signal_real_emit (GtkObject *object,
}
}
}
-
+
+ /* do *not* reorder this call! */
+ if (signal.hook_list)
+ {
+ gpointer data[2];
+
+ data[0] = &signal;
+ data[1] = object;
+ g_hook_list_marshal_check (signal.hook_list, TRUE, gtk_emission_hook_marshaller, &data);
+ }
+
emission_done:
gtk_emission_remove (&current_emissions, object, signal_id);
@@ -1517,6 +1531,90 @@ gtk_signal_handler_pending_by_func (GtkObject *object,
return handler_id;
}
+guint
+gtk_signal_add_emission_hook (guint signal_id,
+ GtkEmissionHook hook_func,
+ gpointer data)
+{
+ return gtk_signal_add_emission_hook_full (signal_id, hook_func, data, NULL);
+}
+
+guint
+gtk_signal_add_emission_hook_full (guint signal_id,
+ GtkEmissionHook hook_func,
+ gpointer data,
+ GDestroyNotify destroy)
+{
+ static guint seq_hook_id = 1;
+ GtkSignal *signal;
+ GHook *hook;
+
+ g_return_val_if_fail (signal_id > 0, 0);
+ g_return_val_if_fail (hook_func != NULL, 0);
+
+ signal = LOOKUP_SIGNAL_ID (signal_id);
+ g_return_val_if_fail (signal != NULL, 0);
+ if (signal->signal_flags & GTK_RUN_NO_HOOKS)
+ {
+ g_warning ("gtk_signal_add_emission_hook_full(): signal \"%s\" does not support emission hooks",
+ signal->name);
+ return 0;
+ }
+
+ if (!signal->hook_list)
+ {
+ signal->hook_list = g_new (GHookList, 1);
+ g_hook_list_init (signal->hook_list, sizeof (GHook));
+ }
+
+ hook = g_hook_alloc (signal->hook_list);
+ hook->data = data;
+ hook->func = hook_func;
+ hook->destroy = destroy;
+
+ signal->hook_list->seq_id = seq_hook_id;
+ g_hook_prepend (signal->hook_list, hook);
+ seq_hook_id = signal->hook_list->seq_id;
+
+ return hook->hook_id;
+}
+
+void
+gtk_signal_remove_emission_hook (guint signal_id,
+ guint hook_id)
+{
+ GtkSignal *signal;
+
+ g_return_if_fail (signal_id > 0);
+ g_return_if_fail (hook_id > 0);
+
+ signal = LOOKUP_SIGNAL_ID (signal_id);
+ g_return_if_fail (signal != NULL);
+
+ if (!signal->hook_list || !g_hook_destroy (signal->hook_list, hook_id))
+ g_warning ("gtk_signal_remove_emission_hook(): could not find hook (%u)", hook_id);
+ if (signal->hook_list && !signal->hook_list->hooks)
+ {
+ g_hook_list_clear (signal->hook_list);
+ g_free (signal->hook_list);
+ signal->hook_list = NULL;
+ }
+}
+
+static gboolean
+gtk_emission_hook_marshaller (GHook *hook,
+ gpointer data_p)
+{
+ gpointer *data = data_p;
+ GtkSignal *signal;
+ GtkEmissionHook func;
+
+ signal = data[0];
+ func = hook->func;
+
+ return func (data[1], signal->signal_id, hook->data);
+}
+
static guint
gtk_signal_connect_by_type (GtkObject *object,
guint signal_id,
diff --git a/gtk/gtksignal.h b/gtk/gtksignal.h
index fa43c8c21..f9be8a870 100644
--- a/gtk/gtksignal.h
+++ b/gtk/gtksignal.h
@@ -33,13 +33,17 @@ extern "C" {
#define GTK_SIGNAL_OFFSET(struct, field) (GTK_STRUCT_OFFSET (struct, field))
-typedef void (*GtkSignalMarshal) (GtkObject *object,
+typedef void (*GtkSignalMarshal) (GtkObject *object,
gpointer data,
guint nparams,
GtkArg *args,
GtkType *arg_types,
GtkType return_type);
-typedef void (*GtkSignalDestroy) (gpointer data);
+typedef void (*GtkSignalDestroy) (gpointer data);
+typedef gboolean (*GtkEmissionHook) (GtkObject *object,
+ guint signal_id,
+ gpointer data);
+
typedef struct _GtkSignalQuery GtkSignalQuery;
@@ -166,6 +170,16 @@ guint gtk_signal_handler_pending_by_func (GtkObject *object,
GtkSignalFunc func,
gpointer data);
void gtk_signal_handlers_destroy (GtkObject *object);
+guint gtk_signal_add_emission_hook (guint signal_id,
+ GtkEmissionHook hook_func,
+ gpointer data);
+guint gtk_signal_add_emission_hook_full (guint signal_id,
+ GtkEmissionHook hook_func,
+ gpointer data,
+ GDestroyNotify destroy);
+void gtk_signal_remove_emission_hook (guint signal_id,
+ guint hook_id);
+
void gtk_signal_set_funcs (GtkSignalMarshal marshal_func,
GtkSignalDestroy destroy_func);
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 1c23d15f9..57e6147eb 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -5261,7 +5261,7 @@ create_font_selection (void)
static GtkWidget *dialog_window = NULL;
-void
+static void
label_toggle (GtkWidget *widget,
GtkWidget **label)
{
@@ -5281,7 +5281,7 @@ label_toggle (GtkWidget *widget,
gtk_widget_destroy (*label);
}
-void
+static void
create_dialog (void)
{
static GtkWidget *label;
@@ -5324,11 +5324,107 @@ create_dialog (void)
gtk_widget_destroy (dialog_window);
}
+/* Event Watcher
+ */
+static gboolean event_watcher_enter_id = 0;
+static gboolean event_watcher_leave_id = 0;
+
+static gboolean
+event_watcher (GtkObject *object,
+ guint signal_id,
+ gpointer data)
+{
+ g_print ("Watch: \"%s\" emitted for %s\n",
+ gtk_signal_name (signal_id),
+ gtk_type_name (GTK_OBJECT_TYPE (object)));
+
+ return TRUE;
+}
+
+static void
+event_watcher_down (void)
+{
+ if (event_watcher_enter_id)
+ {
+ guint signal_id;
+
+ signal_id = gtk_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
+ gtk_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
+ event_watcher_enter_id = 0;
+ signal_id = gtk_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
+ gtk_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
+ event_watcher_leave_id = 0;
+ }
+}
+
+static void
+event_watcher_toggle (void)
+{
+ if (event_watcher_enter_id)
+ event_watcher_down ();
+ else
+ {
+ guint signal_id;
+
+ signal_id = gtk_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
+ event_watcher_enter_id = gtk_signal_add_emission_hook (signal_id, event_watcher, NULL);
+ signal_id = gtk_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
+ event_watcher_leave_id = gtk_signal_add_emission_hook (signal_id, event_watcher, NULL);
+ }
+}
+
+static void
+create_event_watcher (void)
+{
+ GtkWidget *button;
+
+ if (!dialog_window)
+ {
+ dialog_window = gtk_dialog_new ();
+
+ gtk_signal_connect (GTK_OBJECT (dialog_window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroyed),
+ &dialog_window);
+ gtk_signal_connect (GTK_OBJECT (dialog_window),
+ "destroy",
+ GTK_SIGNAL_FUNC (event_watcher_down),
+ NULL);
+
+ gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
+ gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
+ gtk_widget_set_usize (dialog_window, 200, 110);
+
+ button = gtk_toggle_button_new_with_label ("Activate Watch");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (event_watcher_toggle),
+ NULL);
+ gtk_container_set_border_width (GTK_CONTAINER (button), 10);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
+ button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy),
+ dialog_window);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
+ button, TRUE, TRUE, 0);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ }
+
+ if (!GTK_WIDGET_VISIBLE (dialog_window))
+ gtk_widget_show (dialog_window);
+ else
+ gtk_widget_destroy (dialog_window);
+}
+
/*
* GtkRange
*/
-void
+static void
create_range_controls (void)
{
static GtkWidget *window = NULL;
@@ -8067,6 +8163,7 @@ create_main_window (void)
{ "dialog", create_dialog },
/* { "dnd", create_dnd }, */
{ "entry", create_entry },
+ { "event watcher", create_event_watcher },
{ "file selection", create_file_selection },
{ "font selection", create_font_selection },
{ "gamma curve", create_gamma_curve },
diff --git a/tests/testgtk.c b/tests/testgtk.c
index 1c23d15f9..57e6147eb 100644
--- a/tests/testgtk.c
+++ b/tests/testgtk.c
@@ -5261,7 +5261,7 @@ create_font_selection (void)
static GtkWidget *dialog_window = NULL;
-void
+static void
label_toggle (GtkWidget *widget,
GtkWidget **label)
{
@@ -5281,7 +5281,7 @@ label_toggle (GtkWidget *widget,
gtk_widget_destroy (*label);
}
-void
+static void
create_dialog (void)
{
static GtkWidget *label;
@@ -5324,11 +5324,107 @@ create_dialog (void)
gtk_widget_destroy (dialog_window);
}
+/* Event Watcher
+ */
+static gboolean event_watcher_enter_id = 0;
+static gboolean event_watcher_leave_id = 0;
+
+static gboolean
+event_watcher (GtkObject *object,
+ guint signal_id,
+ gpointer data)
+{
+ g_print ("Watch: \"%s\" emitted for %s\n",
+ gtk_signal_name (signal_id),
+ gtk_type_name (GTK_OBJECT_TYPE (object)));
+
+ return TRUE;
+}
+
+static void
+event_watcher_down (void)
+{
+ if (event_watcher_enter_id)
+ {
+ guint signal_id;
+
+ signal_id = gtk_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
+ gtk_signal_remove_emission_hook (signal_id, event_watcher_enter_id);
+ event_watcher_enter_id = 0;
+ signal_id = gtk_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
+ gtk_signal_remove_emission_hook (signal_id, event_watcher_leave_id);
+ event_watcher_leave_id = 0;
+ }
+}
+
+static void
+event_watcher_toggle (void)
+{
+ if (event_watcher_enter_id)
+ event_watcher_down ();
+ else
+ {
+ guint signal_id;
+
+ signal_id = gtk_signal_lookup ("enter_notify_event", GTK_TYPE_WIDGET);
+ event_watcher_enter_id = gtk_signal_add_emission_hook (signal_id, event_watcher, NULL);
+ signal_id = gtk_signal_lookup ("leave_notify_event", GTK_TYPE_WIDGET);
+ event_watcher_leave_id = gtk_signal_add_emission_hook (signal_id, event_watcher, NULL);
+ }
+}
+
+static void
+create_event_watcher (void)
+{
+ GtkWidget *button;
+
+ if (!dialog_window)
+ {
+ dialog_window = gtk_dialog_new ();
+
+ gtk_signal_connect (GTK_OBJECT (dialog_window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroyed),
+ &dialog_window);
+ gtk_signal_connect (GTK_OBJECT (dialog_window),
+ "destroy",
+ GTK_SIGNAL_FUNC (event_watcher_down),
+ NULL);
+
+ gtk_window_set_title (GTK_WINDOW (dialog_window), "Event Watcher");
+ gtk_container_set_border_width (GTK_CONTAINER (dialog_window), 0);
+ gtk_widget_set_usize (dialog_window, 200, 110);
+
+ button = gtk_toggle_button_new_with_label ("Activate Watch");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (event_watcher_toggle),
+ NULL);
+ gtk_container_set_border_width (GTK_CONTAINER (button), 10);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->vbox),
+ button, TRUE, TRUE, 0);
+ gtk_widget_show (button);
+
+ button = gtk_button_new_with_label ("Close");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy),
+ dialog_window);
+ GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog_window)->action_area),
+ button, TRUE, TRUE, 0);
+ gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+ }
+
+ if (!GTK_WIDGET_VISIBLE (dialog_window))
+ gtk_widget_show (dialog_window);
+ else
+ gtk_widget_destroy (dialog_window);
+}
+
/*
* GtkRange
*/
-void
+static void
create_range_controls (void)
{
static GtkWidget *window = NULL;
@@ -8067,6 +8163,7 @@ create_main_window (void)
{ "dialog", create_dialog },
/* { "dnd", create_dnd }, */
{ "entry", create_entry },
+ { "event watcher", create_event_watcher },
{ "file selection", create_file_selection },
{ "font selection", create_font_selection },
{ "gamma curve", create_gamma_curve },