diff options
author | Michael Natterer <mitch@imendio.com> | 2007-03-14 13:55:12 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2007-03-14 13:55:12 +0000 |
commit | d953ce87750f5be9a851df22f2f21a100f964ec1 (patch) | |
tree | f73b09e867e4ff78834cba891fcd67c5c5005676 /gtk/gtkwidget.c | |
parent | 86ea351bd71aaf1c420b9a3b1cee74649f197b8a (diff) | |
download | gtk+-d953ce87750f5be9a851df22f2f21a100f964ec1.tar.gz |
Make gtk_widget_set_extension_events() work on already realized widgets
2007-03-14 Michael Natterer <mitch@imendio.com>
Make gtk_widget_set_extension_events() work on already realized
widgets (bug #379550, Tommi Komulainen)
* gdk/x11/gdkinput.c (gdk_input_set_extension_events): allow to be
called multiple times without leaking and work correctly when
already realized (don't rely on a configure event following).
* gtk/gtkwidget.c (gtk_widget_set_extension_events_internal): new
internal function which walks the GdkWindow tree and sets the
extension events on all windows that belong to the widget.
(gtk_widget_realize)
(gtk_widget_set_extension_events): use the new function.
svn path=/trunk/; revision=17515
Diffstat (limited to 'gtk/gtkwidget.c')
-rw-r--r-- | gtk/gtkwidget.c | 71 |
1 files changed, 55 insertions, 16 deletions
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 2ea73c258f..f93b54e0d8 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -2618,6 +2618,51 @@ gtk_widget_unmap (GtkWidget *widget) } } +static void +gtk_widget_set_extension_events_internal (GtkWidget *widget, + GdkExtensionMode mode, + GList *window_list) +{ + GList *free_list = NULL; + GList *l; + + if (window_list == NULL) + { + if (!GTK_WIDGET_NO_WINDOW (widget)) + window_list = g_list_prepend (NULL, widget->window); + else + window_list = gdk_window_get_children (widget->window); + + free_list = window_list; + } + + 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_input_set_extension_events (window, + gdk_window_get_events (window), + mode); + + children = gdk_window_get_children (window); + if (children) + { + gtk_widget_set_extension_events_internal (widget, mode, children); + g_list_free (children); + } + } + } + + if (free_list) + g_list_free (free_list); +} + /** * gtk_widget_realize: * @widget: a #GtkWidget @@ -2645,7 +2690,6 @@ gtk_widget_unmap (GtkWidget *widget) void gtk_widget_realize (GtkWidget *widget) { - gint events; GdkExtensionMode mode; GtkWidgetShapeInfo *shape_info; @@ -2691,16 +2735,9 @@ gtk_widget_realize (GtkWidget *widget) shape_info->offset_x, shape_info->offset_y); - if (!GTK_WIDGET_NO_WINDOW (widget)) - { - mode = gtk_widget_get_extension_events (widget); - if (mode != GDK_EXTENSION_EVENTS_NONE) - { - events = gtk_widget_get_events (widget); - gdk_input_set_extension_events (widget->window, events, mode); - } - } - + mode = gtk_widget_get_extension_events (widget); + if (mode != GDK_EXTENSION_EVENTS_NONE) + gtk_widget_set_extension_events_internal (widget, mode, NULL); } } @@ -6572,21 +6609,23 @@ gtk_widget_add_events (GtkWidget *widget, * * Sets the extension events mask to @mode. See #GdkExtensionMode * and gdk_input_set_extension_events(). - * **/ void gtk_widget_set_extension_events (GtkWidget *widget, GdkExtensionMode mode) { GdkExtensionMode *modep; - + g_return_if_fail (GTK_IS_WIDGET (widget)); - + modep = g_object_get_qdata (G_OBJECT (widget), quark_extension_event_mode); - + if (!modep) modep = g_slice_new (GdkExtensionMode); - + + if (GTK_WIDGET_REALIZED (widget)) + gtk_widget_set_extension_events_internal (widget, mode, NULL); + *modep = mode; g_object_set_qdata (G_OBJECT (widget), quark_extension_event_mode, modep); g_object_notify (G_OBJECT (widget), "extension-events"); |