summaryrefslogtreecommitdiff
path: root/gtk/gtkwidget.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-05-18 16:52:30 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-05-18 16:52:30 +0000
commite9e878d1bc40e7a20d307b68ae882a812bcbe5ec (patch)
tree6cf702efbfbd9ac6c918273ef3dbe1e9c69aab1e /gtk/gtkwidget.c
parent763452a14f7b775097a36de4d72036aecc0f0289 (diff)
downloadgdk-pixbuf-e9e878d1bc40e7a20d307b68ae882a812bcbe5ec.tar.gz
Try harder to set the event masks of descendent windows. (#169821, Tommi
2005-05-18 Matthias Clasen <mclasen@redhat.com> * gtk/gtkwidget.c (gtk_widget_add_events): Try harder to set the event masks of descendent windows. (#169821, Tommi Komulainen)
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r--gtk/gtkwidget.c52
1 files changed, 33 insertions, 19 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 7b925a50c..ba299d1d8 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -5847,6 +5847,32 @@ gtk_widget_set_events (GtkWidget *widget,
g_object_notify (G_OBJECT (widget), "events");
}
+static void
+gtk_widget_add_events_internal (GtkWidget *widget,
+ gint events,
+ GList *window_list)
+{
+ GList *l;
+
+ for (l = window_list; l != NULL; l = l->next)
+ {
+ GdkWindow *window = l->data;
+ gpointer user_data;
+
+ gdk_window_get_user_data (window, &user_data);
+ if (user_data == widget)
+ {
+ GList *children;
+
+ gdk_window_set_events (window, gdk_window_get_events (window) | events);
+
+ children = gdk_window_get_children (window);
+ gtk_widget_add_events_internal (widget, events, children);
+ g_list_free (children);
+ }
+ }
+}
+
/**
* gtk_widget_add_events:
* @widget: a #GtkWidget
@@ -5885,28 +5911,16 @@ gtk_widget_add_events (GtkWidget *widget,
if (GTK_WIDGET_REALIZED (widget))
{
- if (GTK_WIDGET_NO_WINDOW (widget))
- {
- GList *children = gdk_window_get_children (widget->window);
- GList *tmp_list = children;
+ GList *window_list;
- while (tmp_list)
- {
- GdkWindow *window = tmp_list->data;
- gpointer user_data;
+ if (GTK_WIDGET_NO_WINDOW (widget))
+ window_list = gdk_window_get_children (widget->window);
+ else
+ window_list = g_list_prepend (NULL, widget->window);
- gdk_window_get_user_data (window, &user_data);
- if (user_data == widget)
- gdk_window_set_events (window, gdk_window_get_events (window) | events);
- tmp_list = tmp_list->next;
- }
+ gtk_widget_add_events_internal (widget, events, window_list);
- g_list_free (children);
- }
- else
- {
- gdk_window_set_events (widget->window, gdk_window_get_events (widget->window) | events);
- }
+ g_list_free (window_list);
}
g_object_notify (G_OBJECT (widget), "events");