diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtknotebook.c | 55 | ||||
-rw-r--r-- | gtk/gtkrange.c | 52 | ||||
-rw-r--r-- | gtk/gtkspinbutton.c | 26 |
3 files changed, 95 insertions, 38 deletions
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 2f7061526e..5c76923d3c 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -158,6 +158,10 @@ static gint gtk_notebook_motion_notify (GtkWidget *widget, GdkEventMotion *event); static gint gtk_notebook_focus_in (GtkWidget *widget, GdkEventFocus *event); +static void gtk_notebook_grab_notify (GtkWidget *widget, + gboolean was_grabbed); +static void gtk_notebook_state_changed (GtkWidget *widget, + GtkStateType previous_state); static void gtk_notebook_draw_focus (GtkWidget *widget); static gint gtk_notebook_focus (GtkWidget *widget, GtkDirectionType direction); @@ -348,6 +352,8 @@ gtk_notebook_class_init (GtkNotebookClass *class) widget_class->enter_notify_event = gtk_notebook_enter_notify; widget_class->leave_notify_event = gtk_notebook_leave_notify; widget_class->motion_notify_event = gtk_notebook_motion_notify; + widget_class->grab_notify = gtk_notebook_grab_notify; + widget_class->state_changed = gtk_notebook_state_changed; widget_class->focus_in_event = gtk_notebook_focus_in; widget_class->focus = gtk_notebook_focus; @@ -1664,6 +1670,20 @@ gtk_notebook_button_press (GtkWidget *widget, return TRUE; } +static void +stop_scrolling (GtkNotebook *notebook) +{ + if (notebook->timer) + { + gtk_timeout_remove (notebook->timer); + notebook->timer = 0; + notebook->need_timer = FALSE; + } + notebook->click_child = 0; + notebook->button = 0; + gtk_notebook_redraw_arrows (notebook); +} + static gint gtk_notebook_button_release (GtkWidget *widget, GdkEventButton *event) @@ -1680,18 +1700,7 @@ gtk_notebook_button_release (GtkWidget *widget, if (event->button == notebook->button) { - guint click_child; - - if (notebook->timer) - { - g_source_remove (notebook->timer); - notebook->timer = 0; - notebook->need_timer = FALSE; - } - click_child = notebook->click_child; - notebook->click_child = 0; - notebook->button = 0; - gtk_notebook_redraw_arrows (notebook); + stop_scrolling (notebook); return TRUE; } @@ -1775,6 +1784,22 @@ gtk_notebook_motion_notify (GtkWidget *widget, return TRUE; } +static void +gtk_notebook_grab_notify (GtkWidget *widget, + gboolean was_grabbed) +{ + if (!was_grabbed) + stop_scrolling (GTK_NOTEBOOK (widget)); +} + +static void +gtk_notebook_state_changed (GtkWidget *widget, + GtkStateType previous_state) +{ + if (!GTK_WIDGET_IS_SENSITIVE (widget)) + stop_scrolling (GTK_NOTEBOOK (widget)); +} + static gint gtk_notebook_focus_in (GtkWidget *widget, GdkEventFocus *event) @@ -2808,7 +2833,7 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, state_type = GTK_STATE_PRELIGHT; } else - state_type = GTK_STATE_NORMAL; + state_type = GTK_WIDGET_STATE (widget); if (notebook->click_child == arrow) shadow_type = GTK_SHADOW_IN; @@ -2830,7 +2855,7 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, arrow = GTK_ARROW_UP; gtk_paint_arrow (widget->style, widget->window, state_type, - shadow_type, NULL, GTK_WIDGET(notebook), "notebook", + shadow_type, NULL, widget, "notebook", arrow, TRUE, arrow_rect.x, arrow_rect.y, ARROW_SIZE, ARROW_SIZE); } @@ -2849,7 +2874,7 @@ gtk_notebook_draw_arrow (GtkNotebook *notebook, arrow = GTK_ARROW_DOWN; gtk_paint_arrow (widget->style, widget->window, state_type, - shadow_type, NULL, GTK_WIDGET(notebook), "notebook", + shadow_type, NULL, widget, "notebook", arrow, TRUE, arrow_rect.x + ARROW_SIZE + ARROW_SPACING, arrow_rect.y, ARROW_SIZE, ARROW_SIZE); } diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index a6105c77c3..5f4c2ef82b 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -118,6 +118,10 @@ static gint gtk_range_enter_notify (GtkWidget *widget, GdkEventCrossing *event); static gint gtk_range_leave_notify (GtkWidget *widget, GdkEventCrossing *event); +static void gtk_range_grab_notify (GtkWidget *widget, + gboolean was_grabbed); +static void gtk_range_state_changed (GtkWidget *widget, + GtkStateType previous_state); static gint gtk_range_scroll_event (GtkWidget *widget, GdkEventScroll *event); static void gtk_range_style_set (GtkWidget *widget, @@ -233,6 +237,8 @@ gtk_range_class_init (GtkRangeClass *class) widget_class->scroll_event = gtk_range_scroll_event; widget_class->enter_notify_event = gtk_range_enter_notify; widget_class->leave_notify_event = gtk_range_leave_notify; + widget_class->grab_notify = gtk_range_grab_notify; + widget_class->state_changed = gtk_range_state_changed; widget_class->style_set = gtk_range_style_set; class->move_slider = gtk_range_move_slider; @@ -1311,6 +1317,19 @@ update_slider_position (GtkRange *range, gtk_range_internal_set_value (range, new_value); } +static void stop_scrolling (GtkRange *range) +{ + range_grab_remove (range); + gtk_range_remove_step_timer (range); + /* Flush any pending discontinuous/delayed updates */ + gtk_range_update_value (range); + + /* Just be lazy about this, if we scrolled it will all redraw anyway, + * so no point optimizing the button deactivate case + */ + gtk_widget_queue_draw (widget); +} + static gint gtk_range_button_release (GtkWidget *widget, GdkEventButton *event) @@ -1332,23 +1351,10 @@ gtk_range_button_release (GtkWidget *widget, if (range->layout->grab_button == event->button) { - MouseLocation grab_location; - - grab_location = range->layout->grab_location; - - range_grab_remove (range); - gtk_range_remove_step_timer (range); - - if (grab_location == MOUSE_SLIDER) + if (range->layout->grab_location == MOUSE_SLIDER) update_slider_position (range, range->layout->mouse_x, range->layout->mouse_y); - /* Flush any pending discontinuous/delayed updates */ - gtk_range_update_value (range); - - /* Just be lazy about this, if we scrolled it will all redraw anyway, - * so no point optimizing the button deactivate case - */ - gtk_widget_queue_draw (widget); + stop_scrolling (range); return TRUE; } @@ -1441,6 +1447,22 @@ gtk_range_leave_notify (GtkWidget *widget, } static void +gtk_range_grab_notify (GtkWidget *widget, + gboolean was_grabbed) +{ + if (!was_grabbed) + stop_scrolling (GTK_RANGE (widget)); +} + +static void +gtk_range_state_changed (GtkWidget *widget, + GtkStateType previous_state) +{ + if (!GTK_WIDGET_IS_SENSITIVE (widget)) + stop_scrolling (GTK_RANGE (widget)); +} + +static void gtk_range_adjustment_changed (GtkAdjustment *adjustment, gpointer data) { diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 654f73f5ec..a2aa1352b4 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -955,16 +955,26 @@ static void gtk_spin_button_grab_notify (GtkWidget *widget, gboolean was_grabbed) { + GtkSpinButton *spin = GTK_SPIN_BUTTON (widget); + if (!was_grabbed) - gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (widget)); + { + gtk_spin_button_stop_spinning (spin); + spin_button_redraw (spin); + } } static void gtk_spin_button_state_changed (GtkWidget *widget, GtkStateType previous_state) { + GtkSpinButton *spin = GTK_SPIN_BUTTON (widget); + if (!GTK_WIDGET_IS_SENSITIVE (widget)) - gtk_spin_button_stop_spinning (GTK_SPIN_BUTTON (widget)); + { + gtk_spin_button_stop_spinning (spin); + spin_button_redraw (spin); + } } static gint @@ -1006,6 +1016,9 @@ gtk_spin_button_stop_spinning (GtkSpinButton *spin) spin->timer = 0; spin->timer_step = spin->adjustment->step_increment; spin->timer_calls = 0; + + spin->click_child = NO_ARROW; + spin->button = 0; } static void @@ -1084,7 +1097,7 @@ gtk_spin_button_button_release (GtkWidget *widget, if (event->button == spin->button) { - guint click_child; + int click_child = spin->click_child; gtk_spin_button_stop_spinning (spin); @@ -1094,7 +1107,7 @@ gtk_spin_button_button_release (GtkWidget *widget, event->y <= widget->requisition.height && event->x <= arrow_size + 2 * widget->style->xthickness) { - if (spin->click_child == GTK_ARROW_UP && + if (click_child == GTK_ARROW_UP && event->y <= widget->requisition.height / 2) { gdouble diff; @@ -1103,7 +1116,7 @@ gtk_spin_button_button_release (GtkWidget *widget, if (diff > EPSILON) gtk_spin_button_real_spin (spin, diff); } - else if (spin->click_child == GTK_ARROW_DOWN && + else if (click_child == GTK_ARROW_DOWN && event->y > widget->requisition.height / 2) { gdouble diff; @@ -1114,9 +1127,6 @@ gtk_spin_button_button_release (GtkWidget *widget, } } } - click_child = spin->click_child; - spin->click_child = NO_ARROW; - spin->button = 0; spin_button_redraw (spin); return TRUE; |