don't reset button->press_state on double clicks because GDK_2BUTTON_PRESS

2005-02-23  Michael Natterer  <mitch@gimp.org>

	* libgimpwidgets/gimpbutton.c (gimp_button_button_press): don't
	reset button->press_state on double clicks because
	GDK_2BUTTON_PRESS always arrive immediately after
	GDK_BUTTON_PRESS, so resetting the state causes the second click
	of a double click to be always interpreted as "clicked", not
	"extended-clicked", breaking e.g. adding of multiple layers by
	shift-clicking the layers dialog's "new" button. Phew, too much
	text for a one-liner bug fix, blah... Spotted by Jimmac.
	Cleaned up this antique file a bit.
This commit is contained in:
Michael Natterer 2005-02-23 23:03:00 +00:00 committed by Michael Natterer
parent ea8c0e3bc9
commit 65f360d6c7
2 changed files with 41 additions and 47 deletions

View File

@ -1,3 +1,15 @@
2005-02-23 Michael Natterer <mitch@gimp.org>
* libgimpwidgets/gimpbutton.c (gimp_button_button_press): don't
reset button->press_state on double clicks because
GDK_2BUTTON_PRESS always arrive immediately after
GDK_BUTTON_PRESS, so resetting the state causes the second click
of a double click to be always interpreted as "clicked", not
"extended-clicked", breaking e.g. adding of multiple layers by
shift-clicking the layers dialog's "new" button. Phew, too much
text for a one-liner bug fix, blah... Spotted by Jimmac.
Cleaned up this antique file a bit.
2005-02-23 Bill Skaggs <weskaggs@primate.ucdavis.edu>
* plug-ins/*/Makefile.am

View File

@ -40,9 +40,9 @@ static void gimp_button_class_init (GimpButtonClass *klass);
static void gimp_button_init (GimpButton *button);
static gboolean gimp_button_button_press (GtkWidget *widget,
GdkEventButton *event);
GdkEventButton *event);
static gboolean gimp_button_button_release (GtkWidget *widget,
GdkEventButton *event);
GdkEventButton *event);
static guint button_signals[LAST_SIGNAL] = { 0 };
@ -71,8 +71,8 @@ gimp_button_get_type (void)
};
button_type = g_type_register_static (GTK_TYPE_BUTTON,
"GimpButton",
&button_info, 0);
"GimpButton",
&button_info, 0);
}
return button_type;
@ -81,23 +81,19 @@ gimp_button_get_type (void)
static void
gimp_button_class_init (GimpButtonClass *klass)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
object_class = G_OBJECT_CLASS (klass);
widget_class = GTK_WIDGET_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
button_signals[EXTENDED_CLICKED] =
g_signal_new ("extended_clicked",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpButtonClass, extended_clicked),
NULL, NULL,
g_cclosure_marshal_VOID__FLAGS,
G_TYPE_NONE, 1,
GDK_TYPE_MODIFIER_TYPE);
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GimpButtonClass, extended_clicked),
NULL, NULL,
g_cclosure_marshal_VOID__FLAGS,
G_TYPE_NONE, 1,
GDK_TYPE_MODIFIER_TYPE);
widget_class->button_press_event = gimp_button_button_press;
widget_class->button_release_event = gimp_button_button_release;
@ -119,11 +115,7 @@ gimp_button_init (GimpButton *button)
GtkWidget *
gimp_button_new (void)
{
GimpButton *button;
button = g_object_new (GIMP_TYPE_BUTTON, NULL);
return GTK_WIDGET (button);
return g_object_new (GIMP_TYPE_BUTTON, NULL);
}
/**
@ -144,16 +136,11 @@ gimp_button_extended_clicked (GimpButton *button,
static gboolean
gimp_button_button_press (GtkWidget *widget,
GdkEventButton *bevent)
GdkEventButton *bevent)
{
GimpButton *button;
GimpButton *button = GIMP_BUTTON (widget);
g_return_val_if_fail (GIMP_IS_BUTTON (widget), FALSE);
g_return_val_if_fail (bevent != NULL, FALSE);
button = GIMP_BUTTON (widget);
if (bevent->type == GDK_BUTTON_PRESS && bevent->button == 1)
if (bevent->button == 1)
{
button->press_state = bevent->state;
}
@ -165,37 +152,32 @@ gimp_button_button_press (GtkWidget *widget,
if (GTK_WIDGET_CLASS (parent_class)->button_press_event)
return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, bevent);
return FALSE;
return TRUE;
}
static gboolean
gimp_button_button_release (GtkWidget *widget,
GdkEventButton *bevent)
GdkEventButton *bevent)
{
GtkButton *button;
GtkButton *button = GTK_BUTTON (widget);
gboolean extended_clicked = FALSE;
g_return_val_if_fail (GIMP_IS_BUTTON (widget), FALSE);
g_return_val_if_fail (bevent != NULL, FALSE);
button = GTK_BUTTON (widget);
if (bevent->button == 1)
{
if (button->in_button &&
(GIMP_BUTTON (button)->press_state &
(GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)))
{
gimp_button_extended_clicked (GIMP_BUTTON (button),
(GIMP_BUTTON (button)->press_state &
(GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)))
{
gimp_button_extended_clicked (GIMP_BUTTON (button),
GIMP_BUTTON (button)->press_state);
extended_clicked = TRUE;
extended_clicked = TRUE;
/* HACK: don't let GtkButton emit "clicked" by telling it that
* the mouse pointer is outside the widget
*/
button->in_button = FALSE;
}
/* HACK: don't let GtkButton emit "clicked" by telling it that
* the mouse pointer is outside the widget
*/
button->in_button = FALSE;
}
}
if (GTK_WIDGET_CLASS (parent_class)->button_release_event)