diff --git a/libgimpwidgets/gimpspinscale.c b/libgimpwidgets/gimpspinscale.c index 9e5e6aa8b9837398bddfa35b7c4405f1faab52ed..9308749886f64706d0b8623587a4b4e9e23b7720 100644 --- a/libgimpwidgets/gimpspinscale.c +++ b/libgimpwidgets/gimpspinscale.c @@ -85,6 +85,10 @@ struct _GimpSpinScalePrivate gboolean pointer_warp; gint pointer_warp_x; gint pointer_warp_start_x; + + guint timer_id; + gdouble change_x; + gboolean button_release_executed; }; #define GET_PRIVATE(obj) ((GimpSpinScalePrivate *) gimp_spin_scale_get_instance_private ((GimpSpinScale *) (obj))) @@ -135,6 +139,7 @@ static void gimp_spin_scale_setup_mnemonic (GimpSpinScale *scale, static gdouble odd_pow (gdouble x, gdouble y); +static gboolean gimp_spin_scale_double_click_timeout (GtkWidget *widget); G_DEFINE_TYPE_WITH_PRIVATE (GimpSpinScale, gimp_spin_scale, @@ -570,9 +575,10 @@ gimp_spin_scale_get_target (GtkWidget *widget, if (x >= 0 && x < text_area.width && y >= 0 && y < text_area.height) { - PangoRectangle logical; - gint layout_x; - gint layout_y; + PangoRectangle logical; + gint layout_x; + gint layout_y; + GimpSpinScalePrivate *private = GET_PRIVATE (widget); if (! event) return TARGET_GRAB; @@ -615,9 +621,28 @@ gimp_spin_scale_get_target (GtkWidget *widget, /* For motion events or main button clicks, the target depends on * the position. */ - if (x >= layout_x && x < layout_x + logical.width && - y >= layout_y && y < layout_y + logical.height) + if (event->type == GDK_2BUTTON_PRESS) + { + if (private->timer_id != 0) + { + g_source_remove (private->timer_id); + private->timer_id = 0; + } + return TARGET_NUMBER; + } + /* If event is a click inside the text area */ + else if (event->type == GDK_BUTTON_PRESS && x >= layout_x + && x < layout_x + logical.width && y >= layout_y + && y < layout_y + logical.height) { + if (private->timer_id != 0) + return TARGET_NONE; + + private->change_x = x; + private->button_release_executed = FALSE; + private->timer_id = g_timeout_add (250, + (GSourceFunc) gimp_spin_scale_double_click_timeout, + widget); return TARGET_NUMBER; } else if (event->type == GDK_MOTION_NOTIFY) @@ -805,6 +830,19 @@ gimp_spin_scale_change_value (GtkWidget *widget, gtk_adjustment_set_value (adjustment, value); } +static gboolean +gimp_spin_scale_double_click_timeout (GtkWidget *widget) +{ + GimpSpinScalePrivate *private = GET_PRIVATE (widget); + + if (!private->button_release_executed) + private->changing_value = TRUE; + + gimp_spin_scale_change_value (widget, private->change_x, gtk_widget_get_state_flags (widget)); + private->timer_id = 0; + return G_SOURCE_REMOVE; +} + static gboolean gimp_spin_scale_button_press (GtkWidget *widget, GdkEventButton *event) @@ -828,7 +866,8 @@ gimp_spin_scale_button_press (GtkWidget *widget, case TARGET_GRABBING: private->changing_value = TRUE; - gtk_widget_grab_focus (widget); + if (event->type == GDK_2BUTTON_PRESS) + gtk_widget_grab_focus (widget); gimp_spin_scale_change_value (widget, x, event->state); @@ -853,7 +892,8 @@ gimp_spin_scale_button_press (GtkWidget *widget, return TRUE; case TARGET_NUMBER: - gtk_widget_grab_focus (widget); + if (event->type == GDK_2BUTTON_PRESS || event->button == GDK_BUTTON_MIDDLE) + gtk_widget_grab_focus (widget); return TRUE; default: @@ -874,6 +914,10 @@ gimp_spin_scale_button_release (GtkWidget *widget, event->x, event->y, &x, &y); + /* Check if this function executed before timer started */ + if (private->timer_id != 0) + private->button_release_executed = TRUE; + if (private->changing_value) { private->changing_value = FALSE;