1
/* LIBGIMP - The GIMP Library
2
* Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
5
* Copyright (C) 2000 Michael Natterer <mitch@gimp.org>
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the
19
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
* Boston, MA 02111-1307, USA.
27
#include "gimpwidgetstypes.h"
29
#include "gimpbutton.h"
39
static void gimp_button_class_init (GimpButtonClass *klass);
40
static void gimp_button_init (GimpButton *button);
42
static gboolean gimp_button_button_press (GtkWidget *widget,
43
GdkEventButton *event);
44
static gboolean gimp_button_button_release (GtkWidget *widget,
45
GdkEventButton *event);
48
static guint button_signals[LAST_SIGNAL] = { 0 };
50
static GtkButtonClass *parent_class = NULL;
54
gimp_button_get_type (void)
56
static GType button_type = 0;
60
static const GTypeInfo button_info =
62
sizeof (GimpButtonClass),
64
(GBaseFinalizeFunc) NULL,
65
(GClassInitFunc) gimp_button_class_init,
66
NULL, /* class_finalize */
67
NULL, /* class_data */
70
(GInstanceInitFunc) gimp_button_init,
73
button_type = g_type_register_static (GTK_TYPE_BUTTON,
82
gimp_button_class_init (GimpButtonClass *klass)
84
GObjectClass *object_class;
85
GtkWidgetClass *widget_class;
87
object_class = G_OBJECT_CLASS (klass);
88
widget_class = GTK_WIDGET_CLASS (klass);
90
parent_class = g_type_class_peek_parent (klass);
92
button_signals[EXTENDED_CLICKED] =
93
g_signal_new ("extended_clicked",
94
G_TYPE_FROM_CLASS (klass),
96
G_STRUCT_OFFSET (GimpButtonClass, extended_clicked),
98
g_cclosure_marshal_VOID__FLAGS,
100
GDK_TYPE_MODIFIER_TYPE);
102
widget_class->button_press_event = gimp_button_button_press;
103
widget_class->button_release_event = gimp_button_button_release;
107
gimp_button_init (GimpButton *button)
109
button->press_state = 0;
115
* Creates a new #GimpButton widget.
117
* Returns: A pointer to the new #GimpButton widget.
120
gimp_button_new (void)
124
button = g_object_new (GIMP_TYPE_BUTTON, NULL);
126
return GTK_WIDGET (button);
130
* gimp_button_extended_clicked:
131
* @button: a #GimpButton.
132
* @state: a state as found in #GdkEventButton->state, e.g. #GDK_SHIFT_MASK.
134
* Emits the button's "extended_clicked" signal.
137
gimp_button_extended_clicked (GimpButton *button,
138
GdkModifierType state)
140
g_return_if_fail (GIMP_IS_BUTTON (button));
142
g_signal_emit (button, button_signals[EXTENDED_CLICKED], 0, state);
146
gimp_button_button_press (GtkWidget *widget,
147
GdkEventButton *bevent)
151
g_return_val_if_fail (GIMP_IS_BUTTON (widget), FALSE);
152
g_return_val_if_fail (bevent != NULL, FALSE);
154
button = GIMP_BUTTON (widget);
156
if (bevent->button == 1)
158
button->press_state = bevent->state;
162
button->press_state = 0;
165
if (GTK_WIDGET_CLASS (parent_class)->button_press_event)
166
return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, bevent);
172
gimp_button_button_release (GtkWidget *widget,
173
GdkEventButton *bevent)
176
gboolean extended_clicked = FALSE;
178
g_return_val_if_fail (GIMP_IS_BUTTON (widget), FALSE);
179
g_return_val_if_fail (bevent != NULL, FALSE);
181
button = GTK_BUTTON (widget);
183
if (bevent->button == 1)
185
if (button->in_button &&
186
(GIMP_BUTTON (button)->press_state &
187
(GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)))
189
gimp_button_extended_clicked (GIMP_BUTTON (button),
190
GIMP_BUTTON (button)->press_state);
192
extended_clicked = TRUE;
194
/* HACK: don't let GtkButton emit "clicked" by telling it that
195
* the mouse pointer is outside the widget
197
button->in_button = FALSE;
201
if (GTK_WIDGET_CLASS (parent_class)->button_release_event)
202
GTK_WIDGET_CLASS (parent_class)->button_release_event (widget, bevent);
204
if (extended_clicked)
206
/* revert the above HACK and let the button draw itself in the
207
* correct state, because upchaining with "in_button" == FALSE
210
button->in_button = TRUE;
212
gtk_widget_set_state (widget, GTK_STATE_PRELIGHT);
213
gtk_widget_queue_draw (widget);
214
gdk_window_process_updates (widget->window, TRUE);