diff options
author | Owen Taylor <otaylor@redhat.com> | 2002-01-16 01:07:11 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2002-01-16 01:07:11 +0000 |
commit | 815ffe2edd1dd915ae323af7e1e8a332969cda19 (patch) | |
tree | d22e25b2565792b8ee952f0781450dee959b97e4 /gtk/gtkmain.c | |
parent | 08431c79badf823f5a1d493965ed25dc71967877 (diff) | |
download | gtk+-815ffe2edd1dd915ae323af7e1e8a332969cda19.tar.gz |
Stop the timer on destroy, or when we are notified that we are shadowed by
Tue Jan 15 18:10:24 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkspinbutton.c (gtk_spin_button_grab_notify): Stop
the timer on destroy, or when we are notified that we are
shadowed by a modal dialog.
* gtk/gtkspinbutton.c: Remove explicit gtk_grab_add()/remove() -
not needed any more.
* gtk/gtkmain.c (gtk_grab_notify): Fix problem where notifications
weren't sent out for the default grab group.
* gtk/gtkmain.c (gtk_grab_notify): Fix notification of widgets that
were getting events because they were part of the previous grab.
Diffstat (limited to 'gtk/gtkmain.c')
-rw-r--r-- | gtk/gtkmain.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 1b21483ae3..0c44b58c8a 100644 --- a/gtk/gtkmain.c +++ b/gtk/gtkmain.c @@ -1157,25 +1157,37 @@ gtk_main_get_window_group (GtkWidget *widget) typedef struct { - gboolean was_grabbed; - GtkWidget *grab_widget; + GtkWidget *old_grab_widget; + GtkWidget *new_grab_widget; } GrabNotifyInfo; +static gboolean +check_is_grabbed (GtkWidget *widget, + GtkWidget *grab_widget) +{ + if (grab_widget) + return !(widget == grab_widget || gtk_widget_is_ancestor (widget, grab_widget)); + else + return TRUE; +} + static void gtk_grab_notify_foreach (GtkWidget *child, gpointer data) { GrabNotifyInfo *info = data; + gboolean was_grabbed = check_is_grabbed (child, info->old_grab_widget); + gboolean is_grabbed = check_is_grabbed (child, info->new_grab_widget); - if (child != info->grab_widget) + if (was_grabbed != is_grabbed) { g_object_ref (G_OBJECT (child)); - - gtk_signal_emit_by_name (GTK_OBJECT (child), "grab_notify", info->was_grabbed); - + + gtk_signal_emit_by_name (GTK_OBJECT (child), "grab_notify", was_grabbed); + if (GTK_IS_CONTAINER (child)) - gtk_container_foreach (GTK_CONTAINER (child), gtk_grab_notify_foreach, info); + gtk_container_foreach (GTK_CONTAINER (child), gtk_grab_notify_foreach, info); g_object_unref (G_OBJECT (child)); } @@ -1189,8 +1201,16 @@ gtk_grab_notify (GtkWindowGroup *group, GList *toplevels; GrabNotifyInfo info; - info.grab_widget = grab_widget; - info.was_grabbed = was_grabbed; + if (was_grabbed) + { + info.old_grab_widget = grab_widget; + info.new_grab_widget = group->grabs ? group->grabs->data : NULL; + } + else + { + info.old_grab_widget = (group->grabs && group->grabs->next) ? group->grabs->next->data : NULL; + info.new_grab_widget = grab_widget; + } g_object_ref (group); g_object_ref (grab_widget); @@ -1203,7 +1223,7 @@ gtk_grab_notify (GtkWindowGroup *group, GtkWindow *toplevel = toplevels->data; toplevels = g_list_delete_link (toplevels, toplevels); - if (group == toplevel->group) + if (group == _gtk_window_get_group (toplevel)) gtk_container_foreach (GTK_CONTAINER (toplevel), gtk_grab_notify_foreach, &info); g_object_unref (toplevel); } @@ -1231,8 +1251,7 @@ gtk_grab_add (GtkWidget *widget) gtk_widget_ref (widget); group->grabs = g_slist_prepend (group->grabs, widget); - if (!was_grabbed) - gtk_grab_notify (group, widget, FALSE); + gtk_grab_notify (group, widget, FALSE); } } @@ -1264,8 +1283,7 @@ gtk_grab_remove (GtkWidget *widget) gtk_widget_unref (widget); - if (!group->grabs) - gtk_grab_notify (group, widget, TRUE); + gtk_grab_notify (group, widget, TRUE); } } |