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 | |
parent | 08431c79badf823f5a1d493965ed25dc71967877 (diff) | |
download | gdk-pixbuf-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')
-rw-r--r-- | gtk/gtkmain.c | 46 | ||||
-rw-r--r-- | gtk/gtkspinbutton.c | 124 |
2 files changed, 94 insertions, 76 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c index 1b21483ae..0c44b58c8 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); } } diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index e7d110af2..ffdb3ff81 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -72,6 +72,7 @@ static void gtk_spin_button_class_init (GtkSpinButtonClass *klass); static void gtk_spin_button_editable_init (GtkEditableClass *iface); static void gtk_spin_button_init (GtkSpinButton *spin_button); static void gtk_spin_button_finalize (GObject *object); +static void gtk_spin_button_destroy (GtkObject *object); static void gtk_spin_button_set_property (GObject *object, guint prop_id, const GValue *value, @@ -102,9 +103,12 @@ static gint gtk_spin_button_leave_notify (GtkWidget *widget, GdkEventCrossing *event); static gint gtk_spin_button_focus_out (GtkWidget *widget, GdkEventFocus *event); +static void gtk_spin_button_grab_notify (GtkWidget *widget, + gboolean was_grabbed); static void gtk_spin_button_draw_arrow (GtkSpinButton *spin_button, guint arrow); static gint gtk_spin_button_timer (GtkSpinButton *spin_button); +static void gtk_spin_button_stop_spinning (GtkSpinButton *spin); static void gtk_spin_button_value_changed (GtkAdjustment *adjustment, GtkSpinButton *spin_button); static gint gtk_spin_button_key_press (GtkWidget *widget, @@ -186,6 +190,8 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class) gobject_class->set_property = gtk_spin_button_set_property; gobject_class->get_property = gtk_spin_button_get_property; + object_class->destroy = gtk_spin_button_destroy; + widget_class->map = gtk_spin_button_map; widget_class->unmap = gtk_spin_button_unmap; widget_class->realize = gtk_spin_button_realize; @@ -202,6 +208,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class) widget_class->enter_notify_event = gtk_spin_button_enter_notify; widget_class->leave_notify_event = gtk_spin_button_leave_notify; widget_class->focus_out_event = gtk_spin_button_focus_out; + widget_class->grab_notify = gtk_spin_button_grab_notify; entry_class->activate = gtk_spin_button_activate; @@ -445,6 +452,14 @@ gtk_spin_button_finalize (GObject *object) } static void +gtk_spin_button_destroy (GtkObject *object) +{ + gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (object)); + + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +static void gtk_spin_button_map (GtkWidget *widget) { g_return_if_fail (GTK_IS_SPIN_BUTTON (widget)); @@ -891,6 +906,14 @@ gtk_spin_button_focus_out (GtkWidget *widget, return GTK_WIDGET_CLASS (parent_class)->focus_out_event (widget, event); } +static void +gtk_spin_button_grab_notify (GtkWidget *widget, + gboolean was_grabbed) +{ + if (!was_grabbed) + gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (widget)); +} + static gint gtk_spin_button_scroll (GtkWidget *widget, GdkEventScroll *event) @@ -920,6 +943,40 @@ gtk_spin_button_scroll (GtkWidget *widget, return TRUE; } +static void +gtk_spin_button_stop_spinning(GtkSpinButton *spin) +{ + if (spin->timer) + { + gtk_timeout_remove (spin->timer); + spin->timer = 0; + spin->timer_calls = 0; + spin->need_timer = FALSE; + } + + spin->button = 0; + spin->timer = 0; +} + +static void +start_spinning (GtkSpinButton *spin, + GtkArrowType click_child, + gfloat step) +{ + spin->click_child = click_child; + gtk_spin_button_real_spin (spin, click_child == GTK_ARROW_UP ? step : -step); + + if (!spin->timer) + { + spin->timer_step = step; + spin->need_timer = TRUE; + spin->timer = gtk_timeout_add (SPIN_BUTTON_INITIAL_TIMER_DELAY, + (GtkFunction) gtk_spin_button_timer, (gpointer) spin); + } + + gtk_spin_button_draw_arrow (spin, click_child); +} + static gint gtk_spin_button_button_press (GtkWidget *widget, GdkEventButton *event) @@ -937,7 +994,6 @@ gtk_spin_button_button_press (GtkWidget *widget, { if (!GTK_WIDGET_HAS_FOCUS (widget)) gtk_widget_grab_focus (widget); - gtk_grab_add (widget); spin->button = event->button; if (GTK_ENTRY (widget)->editable) @@ -945,65 +1001,17 @@ gtk_spin_button_button_press (GtkWidget *widget, if (event->y <= widget->requisition.height / 2) { - spin->click_child = GTK_ARROW_UP; if (event->button == 1) - { - gtk_spin_button_real_spin (spin, - spin->adjustment->step_increment); - if (!spin->timer) - { - spin->timer_step = spin->adjustment->step_increment; - spin->need_timer = TRUE; - spin->timer = gtk_timeout_add - (SPIN_BUTTON_INITIAL_TIMER_DELAY, - (GtkFunction) gtk_spin_button_timer, (gpointer) spin); - } - } + start_spinning (spin, GTK_ARROW_UP, spin->adjustment->step_increment); else if (event->button == 2) - { - gtk_spin_button_real_spin (spin, - spin->adjustment->page_increment); - if (!spin->timer) - { - spin->timer_step = spin->adjustment->page_increment; - spin->need_timer = TRUE; - spin->timer = gtk_timeout_add - (SPIN_BUTTON_INITIAL_TIMER_DELAY, - (GtkFunction) gtk_spin_button_timer, (gpointer) spin); - } - } - gtk_spin_button_draw_arrow (spin, GTK_ARROW_UP); + start_spinning (spin, GTK_ARROW_UP, spin->adjustment->page_increment); } else { - spin->click_child = GTK_ARROW_DOWN; if (event->button == 1) - { - gtk_spin_button_real_spin (spin, - -spin->adjustment->step_increment); - if (!spin->timer) - { - spin->timer_step = spin->adjustment->step_increment; - spin->need_timer = TRUE; - spin->timer = gtk_timeout_add - (SPIN_BUTTON_INITIAL_TIMER_DELAY, - (GtkFunction) gtk_spin_button_timer, (gpointer) spin); - } - } + start_spinning (spin, GTK_ARROW_DOWN, spin->adjustment->step_increment); else if (event->button == 2) - { - gtk_spin_button_real_spin (spin, - -spin->adjustment->page_increment); - if (!spin->timer) - { - spin->timer_step = spin->adjustment->page_increment; - spin->need_timer = TRUE; - spin->timer = gtk_timeout_add - (SPIN_BUTTON_INITIAL_TIMER_DELAY, - (GtkFunction) gtk_spin_button_timer, (gpointer) spin); - } - } - gtk_spin_button_draw_arrow (spin, GTK_ARROW_DOWN); + start_spinning (spin, GTK_ARROW_DOWN, spin->adjustment->page_increment); } return TRUE; } @@ -1030,13 +1038,7 @@ gtk_spin_button_button_release (GtkWidget *widget, { guint click_child; - if (spin->timer) - { - gtk_timeout_remove (spin->timer); - spin->timer = 0; - spin->timer_calls = 0; - spin->need_timer = FALSE; - } + gtk_spin_button_stop_spinning (spin); if (event->button == 3) { @@ -1064,10 +1066,8 @@ gtk_spin_button_button_release (GtkWidget *widget, } } } - gtk_grab_remove (widget); click_child = spin->click_child; spin->click_child = 2; - spin->button = 0; gtk_spin_button_draw_arrow (spin, click_child); return TRUE; } |