summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-01-16 01:07:11 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-01-16 01:07:11 +0000
commit815ffe2edd1dd915ae323af7e1e8a332969cda19 (patch)
treed22e25b2565792b8ee952f0781450dee959b97e4 /gtk
parent08431c79badf823f5a1d493965ed25dc71967877 (diff)
downloadgdk-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.c46
-rw-r--r--gtk/gtkspinbutton.c124
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;
}