Add optional movement on push to buttons (based on patch from Soeren
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com> * gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement on push to buttons (based on patch from Soeren Sandmann, #54720) - Add child_displacement_x/y style properties to control how far the child moves when the button is depressed. - Add non-exported function _gtk_button_set_depressed to clean up the handling of the in/out shadow and separate it frmo widget->state. - Lots of code cleanup and simplification of state handling for GtkButton/GtkToggleButton. * tests/testgtkrc: Set the x/y displacement to 1 to provide a test of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
This commit is contained in:
parent
8de6598f6a
commit
b94e6c0a80
18
ChangeLog
18
ChangeLog
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
@ -1,3 +1,21 @@
|
|||||||
|
Sat Aug 25 19:02:39 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
|
* gtk/gtkbutton.[ch] gtk/gtktogglebutton.c: Add optional movement
|
||||||
|
on push to buttons (based on patch from Soeren Sandmann, #54720)
|
||||||
|
|
||||||
|
- Add child_displacement_x/y style properties to control how far the
|
||||||
|
child moves when the button is depressed.
|
||||||
|
|
||||||
|
- Add non-exported function _gtk_button_set_depressed to clean
|
||||||
|
up the handling of the in/out shadow and separate it frmo
|
||||||
|
widget->state.
|
||||||
|
|
||||||
|
- Lots of code cleanup and simplification of state handling
|
||||||
|
for GtkButton/GtkToggleButton.
|
||||||
|
|
||||||
|
* tests/testgtkrc: Set the x/y displacement to 1 to provide a test
|
||||||
|
of button movement. testgtk + testgtkrc == test ugly GTK+, as always.
|
||||||
|
|
||||||
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
Fri Aug 24 23:09:05 2001 Owen Taylor <otaylor@redhat.com>
|
||||||
|
|
||||||
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
* gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility
|
||||||
|
149
gtk/gtkbutton.c
149
gtk/gtkbutton.c
@ -97,9 +97,8 @@ static void gtk_button_remove (GtkContainer *container,
|
|||||||
GtkWidget *widget);
|
GtkWidget *widget);
|
||||||
static void gtk_real_button_pressed (GtkButton *button);
|
static void gtk_real_button_pressed (GtkButton *button);
|
||||||
static void gtk_real_button_released (GtkButton *button);
|
static void gtk_real_button_released (GtkButton *button);
|
||||||
static void gtk_real_button_enter (GtkButton *button);
|
|
||||||
static void gtk_real_button_leave (GtkButton *button);
|
|
||||||
static void gtk_real_button_activate (GtkButton *button);
|
static void gtk_real_button_activate (GtkButton *button);
|
||||||
|
static void gtk_button_update_state (GtkButton *button);
|
||||||
static GtkType gtk_button_child_type (GtkContainer *container);
|
static GtkType gtk_button_child_type (GtkContainer *container);
|
||||||
|
|
||||||
static void gtk_button_finish_activate (GtkButton *button,
|
static void gtk_button_finish_activate (GtkButton *button,
|
||||||
@ -169,8 +168,8 @@ gtk_button_class_init (GtkButtonClass *klass)
|
|||||||
klass->pressed = gtk_real_button_pressed;
|
klass->pressed = gtk_real_button_pressed;
|
||||||
klass->released = gtk_real_button_released;
|
klass->released = gtk_real_button_released;
|
||||||
klass->clicked = NULL;
|
klass->clicked = NULL;
|
||||||
klass->enter = gtk_real_button_enter;
|
klass->enter = gtk_button_update_state;
|
||||||
klass->leave = gtk_real_button_leave;
|
klass->leave = gtk_button_update_state;
|
||||||
klass->activate = gtk_real_button_activate;
|
klass->activate = gtk_real_button_activate;
|
||||||
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS(object_class),
|
g_object_class_install_property (G_OBJECT_CLASS(object_class),
|
||||||
@ -247,6 +246,22 @@ gtk_button_class_init (GtkButtonClass *klass)
|
|||||||
_("Extra space to add for CAN_DEFAULT buttons that is always drawn outside the border"),
|
_("Extra space to add for CAN_DEFAULT buttons that is always drawn outside the border"),
|
||||||
GTK_TYPE_BORDER,
|
GTK_TYPE_BORDER,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
gtk_widget_class_install_style_property (widget_class,
|
||||||
|
g_param_spec_int ("child_displacement_x",
|
||||||
|
_("Child X Displacement"),
|
||||||
|
_("How far in the x direction to move the child when the button is depressed"),
|
||||||
|
G_MININT,
|
||||||
|
G_MAXINT,
|
||||||
|
0,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
gtk_widget_class_install_style_property (widget_class,
|
||||||
|
g_param_spec_int ("child_displacement_y",
|
||||||
|
_("Child Y Displacement"),
|
||||||
|
_("How far in the y direction to move the child when the button is depressed"),
|
||||||
|
G_MININT,
|
||||||
|
G_MAXINT,
|
||||||
|
0,
|
||||||
|
G_PARAM_READABLE));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -259,6 +274,7 @@ gtk_button_init (GtkButton *button)
|
|||||||
button->in_button = FALSE;
|
button->in_button = FALSE;
|
||||||
button->button_down = FALSE;
|
button->button_down = FALSE;
|
||||||
button->relief = GTK_RELIEF_NORMAL;
|
button->relief = GTK_RELIEF_NORMAL;
|
||||||
|
button->depressed = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GtkType
|
static GtkType
|
||||||
@ -656,6 +672,19 @@ gtk_button_size_allocate (GtkWidget *widget,
|
|||||||
child_allocation.height = MAX (1, child_allocation.height - default_border.top - default_border.bottom);
|
child_allocation.height = MAX (1, child_allocation.height - default_border.top - default_border.bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (button->depressed)
|
||||||
|
{
|
||||||
|
gint child_displacement_x;
|
||||||
|
gint child_displacement_y;
|
||||||
|
|
||||||
|
gtk_widget_style_get (widget,
|
||||||
|
"child_displacement_x", &child_displacement_x,
|
||||||
|
"child_displacement_y", &child_displacement_y,
|
||||||
|
NULL);
|
||||||
|
child_allocation.x += child_displacement_x;
|
||||||
|
child_allocation.y += child_displacement_y;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation);
|
gtk_widget_size_allocate (GTK_BIN (button)->child, &child_allocation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -741,10 +770,7 @@ gtk_button_paint (GtkWidget *widget,
|
|||||||
height -= 2;
|
height -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE)
|
shadow_type = button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
|
||||||
shadow_type = GTK_SHADOW_IN;
|
|
||||||
else
|
|
||||||
shadow_type = GTK_SHADOW_OUT;
|
|
||||||
|
|
||||||
if ((button->relief != GTK_RELIEF_NONE) ||
|
if ((button->relief != GTK_RELIEF_NONE) ||
|
||||||
((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) &&
|
((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) &&
|
||||||
@ -937,31 +963,16 @@ gtk_button_remove (GtkContainer *container,
|
|||||||
static void
|
static void
|
||||||
gtk_real_button_pressed (GtkButton *button)
|
gtk_real_button_pressed (GtkButton *button)
|
||||||
{
|
{
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
|
||||||
|
|
||||||
if (button->activate_timeout)
|
if (button->activate_timeout)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
button->button_down = TRUE;
|
button->button_down = TRUE;
|
||||||
|
gtk_button_update_state (button);
|
||||||
new_state = (button->in_button ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
{
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (button));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_real_button_released (GtkButton *button)
|
gtk_real_button_released (GtkButton *button)
|
||||||
{
|
{
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
|
||||||
|
|
||||||
if (button->button_down)
|
if (button->button_down)
|
||||||
{
|
{
|
||||||
button->button_down = FALSE;
|
button->button_down = FALSE;
|
||||||
@ -972,50 +983,7 @@ gtk_real_button_released (GtkButton *button)
|
|||||||
if (button->in_button)
|
if (button->in_button)
|
||||||
gtk_button_clicked (button);
|
gtk_button_clicked (button);
|
||||||
|
|
||||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
|
gtk_button_update_state (button);
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
{
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
/* We _draw () instead of queue_draw so that if the operation
|
|
||||||
* blocks, the label doesn't vanish.
|
|
||||||
*/
|
|
||||||
gtk_widget_draw (GTK_WIDGET (button), NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_real_button_enter (GtkButton *button)
|
|
||||||
{
|
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
|
||||||
|
|
||||||
new_state = (button->button_down ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT);
|
|
||||||
|
|
||||||
if (button->activate_timeout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
{
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (button));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_real_button_leave (GtkButton *button)
|
|
||||||
{
|
|
||||||
g_return_if_fail (GTK_IS_BUTTON (button));
|
|
||||||
|
|
||||||
if (button->activate_timeout)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != GTK_STATE_NORMAL)
|
|
||||||
{
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), GTK_STATE_NORMAL);
|
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (button));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1049,7 +1017,7 @@ gtk_real_button_activate (GtkButton *button)
|
|||||||
button_activate_timeout,
|
button_activate_timeout,
|
||||||
button);
|
button);
|
||||||
button->button_down = TRUE;
|
button->button_down = TRUE;
|
||||||
gtk_widget_set_state (widget, GTK_STATE_ACTIVE);
|
gtk_button_update_state (button);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1067,10 +1035,49 @@ gtk_button_finish_activate (GtkButton *button,
|
|||||||
gtk_grab_remove (widget);
|
gtk_grab_remove (widget);
|
||||||
|
|
||||||
button->button_down = FALSE;
|
button->button_down = FALSE;
|
||||||
gtk_widget_set_state (GTK_WIDGET (button),
|
gtk_button_update_state (button);
|
||||||
button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (do_it)
|
if (do_it)
|
||||||
gtk_button_clicked (button);
|
gtk_button_clicked (button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _gtk_button_set_depressed:
|
||||||
|
* @button: a #GtkButton
|
||||||
|
* @depressed: %TRUE if the button should be drawn with a recessed shadow.
|
||||||
|
*
|
||||||
|
* Sets whether the button is currently drawn as down or not. This is
|
||||||
|
* purely a visual setting, and is meant only for use by derived widgets
|
||||||
|
* such as #GtkToggleButton.
|
||||||
|
**/
|
||||||
|
void
|
||||||
|
_gtk_button_set_depressed (GtkButton *button,
|
||||||
|
gboolean depressed)
|
||||||
|
{
|
||||||
|
GtkWidget *widget = GTK_WIDGET (button);
|
||||||
|
|
||||||
|
depressed = depressed != FALSE;
|
||||||
|
|
||||||
|
if (depressed != button->depressed)
|
||||||
|
{
|
||||||
|
button->depressed = depressed;
|
||||||
|
gtk_widget_queue_resize (widget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_button_update_state (GtkButton *button)
|
||||||
|
{
|
||||||
|
gboolean depressed;
|
||||||
|
GtkStateType new_state;
|
||||||
|
|
||||||
|
depressed = button->in_button && button->button_down;
|
||||||
|
|
||||||
|
if (!button->button_down && button->in_button)
|
||||||
|
new_state = GTK_STATE_PRELIGHT;
|
||||||
|
else
|
||||||
|
new_state = depressed ? GTK_STATE_ACTIVE: GTK_STATE_NORMAL;
|
||||||
|
|
||||||
|
_gtk_button_set_depressed (button, depressed);
|
||||||
|
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
||||||
|
}
|
||||||
|
@ -61,6 +61,7 @@ struct _GtkButton
|
|||||||
guint in_button : 1;
|
guint in_button : 1;
|
||||||
guint button_down : 1;
|
guint button_down : 1;
|
||||||
guint relief : 2;
|
guint relief : 2;
|
||||||
|
guint depressed : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GtkButtonClass
|
struct _GtkButtonClass
|
||||||
@ -89,7 +90,8 @@ void gtk_button_leave (GtkButton *button);
|
|||||||
void gtk_button_set_relief (GtkButton *button,
|
void gtk_button_set_relief (GtkButton *button,
|
||||||
GtkReliefStyle newstyle);
|
GtkReliefStyle newstyle);
|
||||||
GtkReliefStyle gtk_button_get_relief (GtkButton *button);
|
GtkReliefStyle gtk_button_get_relief (GtkButton *button);
|
||||||
|
void _gtk_button_set_depressed (GtkButton *button,
|
||||||
|
gboolean depressed);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -58,8 +58,6 @@ static gint gtk_toggle_button_expose (GtkWidget *widget,
|
|||||||
static void gtk_toggle_button_pressed (GtkButton *button);
|
static void gtk_toggle_button_pressed (GtkButton *button);
|
||||||
static void gtk_toggle_button_released (GtkButton *button);
|
static void gtk_toggle_button_released (GtkButton *button);
|
||||||
static void gtk_toggle_button_clicked (GtkButton *button);
|
static void gtk_toggle_button_clicked (GtkButton *button);
|
||||||
static void gtk_toggle_button_enter (GtkButton *button);
|
|
||||||
static void gtk_toggle_button_leave (GtkButton *button);
|
|
||||||
static void gtk_toggle_button_set_property (GObject *object,
|
static void gtk_toggle_button_set_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
const GValue *value,
|
const GValue *value,
|
||||||
@ -68,11 +66,11 @@ static void gtk_toggle_button_get_property (GObject *object,
|
|||||||
guint prop_id,
|
guint prop_id,
|
||||||
GValue *value,
|
GValue *value,
|
||||||
GParamSpec *pspec);
|
GParamSpec *pspec);
|
||||||
static void gtk_toggle_button_leave (GtkButton *button);
|
|
||||||
static void gtk_toggle_button_realize (GtkWidget *widget);
|
static void gtk_toggle_button_realize (GtkWidget *widget);
|
||||||
static void gtk_toggle_button_unrealize (GtkWidget *widget);
|
static void gtk_toggle_button_unrealize (GtkWidget *widget);
|
||||||
static void gtk_toggle_button_map (GtkWidget *widget);
|
static void gtk_toggle_button_map (GtkWidget *widget);
|
||||||
static void gtk_toggle_button_unmap (GtkWidget *widget);
|
static void gtk_toggle_button_unmap (GtkWidget *widget);
|
||||||
|
static void gtk_toggle_button_update_state (GtkButton *button);
|
||||||
|
|
||||||
static guint toggle_button_signals[LAST_SIGNAL] = { 0 };
|
static guint toggle_button_signals[LAST_SIGNAL] = { 0 };
|
||||||
static GtkContainerClass *parent_class = NULL;
|
static GtkContainerClass *parent_class = NULL;
|
||||||
@ -133,8 +131,8 @@ gtk_toggle_button_class_init (GtkToggleButtonClass *class)
|
|||||||
button_class->pressed = gtk_toggle_button_pressed;
|
button_class->pressed = gtk_toggle_button_pressed;
|
||||||
button_class->released = gtk_toggle_button_released;
|
button_class->released = gtk_toggle_button_released;
|
||||||
button_class->clicked = gtk_toggle_button_clicked;
|
button_class->clicked = gtk_toggle_button_clicked;
|
||||||
button_class->enter = gtk_toggle_button_enter;
|
button_class->enter = gtk_toggle_button_update_state;
|
||||||
button_class->leave = gtk_toggle_button_leave;
|
button_class->leave = gtk_toggle_button_update_state;
|
||||||
|
|
||||||
class->toggled = NULL;
|
class->toggled = NULL;
|
||||||
|
|
||||||
@ -406,6 +404,8 @@ gtk_toggle_button_set_inconsistent (GtkToggleButton *toggle_button,
|
|||||||
if (setting != toggle_button->inconsistent)
|
if (setting != toggle_button->inconsistent)
|
||||||
{
|
{
|
||||||
toggle_button->inconsistent = setting;
|
toggle_button->inconsistent = setting;
|
||||||
|
|
||||||
|
gtk_toggle_button_update_state (GTK_BUTTON (toggle_button));
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (toggle_button));
|
gtk_widget_queue_draw (GTK_WIDGET (toggle_button));
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (toggle_button), "inconsistent");
|
g_object_notify (G_OBJECT (toggle_button), "inconsistent");
|
||||||
@ -490,11 +490,8 @@ gtk_toggle_button_paint (GtkWidget *widget,
|
|||||||
state_type = GTK_STATE_NORMAL;
|
state_type = GTK_STATE_NORMAL;
|
||||||
shadow_type = GTK_SHADOW_ETCHED_IN;
|
shadow_type = GTK_SHADOW_ETCHED_IN;
|
||||||
}
|
}
|
||||||
else if ((GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) ||
|
|
||||||
toggle_button->active)
|
|
||||||
shadow_type = GTK_SHADOW_IN;
|
|
||||||
else
|
else
|
||||||
shadow_type = GTK_SHADOW_OUT;
|
shadow_type = button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
|
||||||
|
|
||||||
if (button->relief != GTK_RELIEF_NONE ||
|
if (button->relief != GTK_RELIEF_NONE ||
|
||||||
(GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL &&
|
(GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL &&
|
||||||
@ -557,116 +554,38 @@ gtk_toggle_button_expose (GtkWidget *widget,
|
|||||||
static void
|
static void
|
||||||
gtk_toggle_button_pressed (GtkButton *button)
|
gtk_toggle_button_pressed (GtkButton *button)
|
||||||
{
|
{
|
||||||
GtkToggleButton *toggle_button;
|
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
|
|
||||||
|
|
||||||
toggle_button = GTK_TOGGLE_BUTTON (button);
|
|
||||||
|
|
||||||
button->button_down = TRUE;
|
button->button_down = TRUE;
|
||||||
|
|
||||||
if (toggle_button->active)
|
gtk_toggle_button_update_state (button);
|
||||||
new_state = (button->in_button ? GTK_STATE_NORMAL : GTK_STATE_ACTIVE);
|
|
||||||
else
|
|
||||||
new_state = (button->in_button ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_toggle_button_released (GtkButton *button)
|
gtk_toggle_button_released (GtkButton *button)
|
||||||
{
|
{
|
||||||
GtkToggleButton *toggle_button;
|
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
|
|
||||||
|
|
||||||
if (button->button_down)
|
if (button->button_down)
|
||||||
{
|
{
|
||||||
toggle_button = GTK_TOGGLE_BUTTON (button);
|
|
||||||
|
|
||||||
button->button_down = FALSE;
|
button->button_down = FALSE;
|
||||||
|
|
||||||
if (button->in_button)
|
if (button->in_button)
|
||||||
{
|
|
||||||
gtk_button_clicked (button);
|
gtk_button_clicked (button);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (toggle_button->active)
|
|
||||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE);
|
|
||||||
else
|
|
||||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
gtk_toggle_button_update_state (button);
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_toggle_button_clicked (GtkButton *button)
|
gtk_toggle_button_clicked (GtkButton *button)
|
||||||
{
|
{
|
||||||
GtkToggleButton *toggle_button;
|
GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (button);
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
|
|
||||||
|
|
||||||
toggle_button = GTK_TOGGLE_BUTTON (button);
|
|
||||||
toggle_button->active = !toggle_button->active;
|
toggle_button->active = !toggle_button->active;
|
||||||
|
|
||||||
gtk_toggle_button_toggled (toggle_button);
|
gtk_toggle_button_toggled (toggle_button);
|
||||||
|
|
||||||
if (toggle_button->active)
|
gtk_toggle_button_update_state (button);
|
||||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_ACTIVE);
|
|
||||||
else
|
|
||||||
new_state = (button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
else
|
|
||||||
gtk_widget_queue_draw (GTK_WIDGET (button));
|
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (toggle_button), "active");
|
g_object_notify (G_OBJECT (toggle_button), "active");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_toggle_button_enter (GtkButton *button)
|
|
||||||
{
|
|
||||||
GtkToggleButton *toggle_button;
|
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
|
|
||||||
|
|
||||||
toggle_button = GTK_TOGGLE_BUTTON (button);
|
|
||||||
|
|
||||||
if (toggle_button->active)
|
|
||||||
new_state = (button->button_down ? GTK_STATE_NORMAL : GTK_STATE_PRELIGHT);
|
|
||||||
else
|
|
||||||
new_state = (button->button_down ? GTK_STATE_ACTIVE : GTK_STATE_PRELIGHT);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtk_toggle_button_leave (GtkButton *button)
|
|
||||||
{
|
|
||||||
GtkToggleButton *toggle_button;
|
|
||||||
GtkStateType new_state;
|
|
||||||
|
|
||||||
g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button));
|
|
||||||
|
|
||||||
toggle_button = GTK_TOGGLE_BUTTON (button);
|
|
||||||
|
|
||||||
new_state = (toggle_button->active ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL);
|
|
||||||
|
|
||||||
if (GTK_WIDGET_STATE (button) != new_state)
|
|
||||||
gtk_widget_set_state (GTK_WIDGET (button), new_state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtk_toggle_button_realize (GtkWidget *widget)
|
gtk_toggle_button_realize (GtkWidget *widget)
|
||||||
{
|
{
|
||||||
@ -764,3 +683,26 @@ gtk_toggle_button_unmap (GtkWidget *widget)
|
|||||||
|
|
||||||
GTK_WIDGET_CLASS (parent_class)->unmap (widget);
|
GTK_WIDGET_CLASS (parent_class)->unmap (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_toggle_button_update_state (GtkButton *button)
|
||||||
|
{
|
||||||
|
GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (button);
|
||||||
|
gboolean depressed;
|
||||||
|
GtkStateType new_state;
|
||||||
|
|
||||||
|
if (toggle_button->inconsistent)
|
||||||
|
depressed = FALSE;
|
||||||
|
else if (button->in_button && button->button_down)
|
||||||
|
depressed = !toggle_button->active;
|
||||||
|
else
|
||||||
|
depressed = toggle_button->active;
|
||||||
|
|
||||||
|
if (!button->button_down && button->in_button)
|
||||||
|
new_state = GTK_STATE_PRELIGHT;
|
||||||
|
else
|
||||||
|
new_state = depressed ? GTK_STATE_ACTIVE: GTK_STATE_NORMAL;
|
||||||
|
|
||||||
|
_gtk_button_set_depressed (button, depressed);
|
||||||
|
gtk_widget_set_state (GTK_WIDGET (toggle_button), new_state);
|
||||||
|
}
|
||||||
|
@ -29,6 +29,8 @@ bell_duration = 40
|
|||||||
style "global-style-properties"
|
style "global-style-properties"
|
||||||
{
|
{
|
||||||
# xthickness = 20
|
# xthickness = 20
|
||||||
|
GtkButton::child_displacement_x = 1
|
||||||
|
GtkButton::child_displacement_y = 1
|
||||||
GtkSpinButton::shadow_type = etched-out
|
GtkSpinButton::shadow_type = etched-out
|
||||||
GtkEntry::cursor_color = "#ff0000"
|
GtkEntry::cursor_color = "#ff0000"
|
||||||
GtkToolbar::space_size = 10
|
GtkToolbar::space_size = 10
|
||||||
|
Loading…
Reference in New Issue
Block a user