From b94e6c0a8036a0489ac8ca71de75ba7611218e50 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 25 Aug 2001 23:11:46 +0000 Subject: [PATCH] Add optional movement on push to buttons (based on patch from Soeren Sat Aug 25 19:02:39 2001 Owen Taylor * 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. --- ChangeLog | 18 +++++ ChangeLog.pre-2-0 | 18 +++++ ChangeLog.pre-2-10 | 18 +++++ ChangeLog.pre-2-2 | 18 +++++ ChangeLog.pre-2-4 | 18 +++++ ChangeLog.pre-2-6 | 18 +++++ ChangeLog.pre-2-8 | 18 +++++ gtk/gtkbutton.c | 153 ++++++++++++++++++++++-------------------- gtk/gtkbutton.h | 6 +- gtk/gtktogglebutton.c | 126 ++++++++++------------------------ tests/testgtkrc | 2 + 11 files changed, 246 insertions(+), 167 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index ed0c28d66f..7871ae7f7a 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,21 @@ +Sat Aug 25 19:02:39 2001 Owen Taylor + + * 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 * gtk/gtkimage.[ch] docs/Changes-2.0.txt: Break compatibility diff --git a/gtk/gtkbutton.c b/gtk/gtkbutton.c index 409e9ffa29..4ac476bb60 100644 --- a/gtk/gtkbutton.c +++ b/gtk/gtkbutton.c @@ -97,9 +97,8 @@ static void gtk_button_remove (GtkContainer *container, GtkWidget *widget); static void gtk_real_button_pressed (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_button_update_state (GtkButton *button); static GtkType gtk_button_child_type (GtkContainer *container); 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->released = gtk_real_button_released; klass->clicked = NULL; - klass->enter = gtk_real_button_enter; - klass->leave = gtk_real_button_leave; + klass->enter = gtk_button_update_state; + klass->leave = gtk_button_update_state; klass->activate = gtk_real_button_activate; 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"), GTK_TYPE_BORDER, 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 @@ -259,6 +274,7 @@ gtk_button_init (GtkButton *button) button->in_button = FALSE; button->button_down = FALSE; button->relief = GTK_RELIEF_NORMAL; + button->depressed = FALSE; } 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); } + 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); } } @@ -740,11 +769,8 @@ gtk_button_paint (GtkWidget *widget, width -= 2; height -= 2; } - - if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) - shadow_type = GTK_SHADOW_IN; - else - shadow_type = GTK_SHADOW_OUT; + + shadow_type = button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT; if ((button->relief != GTK_RELIEF_NONE) || ((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) && @@ -937,85 +963,27 @@ gtk_button_remove (GtkContainer *container, static void gtk_real_button_pressed (GtkButton *button) { - GtkStateType new_state; - - g_return_if_fail (GTK_IS_BUTTON (button)); - if (button->activate_timeout) return; button->button_down = TRUE; - - 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)); - } + gtk_button_update_state (button); } static void gtk_real_button_released (GtkButton *button) { - GtkStateType new_state; - - g_return_if_fail (GTK_IS_BUTTON (button)); - if (button->button_down) { button->button_down = FALSE; if (button->activate_timeout) return; - + if (button->in_button) gtk_button_clicked (button); - 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); - /* 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)); + gtk_button_update_state (button); } } @@ -1049,7 +1017,7 @@ gtk_real_button_activate (GtkButton *button) button_activate_timeout, button); 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); button->button_down = FALSE; - gtk_widget_set_state (GTK_WIDGET (button), - button->in_button ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL); + gtk_button_update_state (button); if (do_it) 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); +} diff --git a/gtk/gtkbutton.h b/gtk/gtkbutton.h index 525b9cce65..1a5cbaf3d9 100644 --- a/gtk/gtkbutton.h +++ b/gtk/gtkbutton.h @@ -61,6 +61,7 @@ struct _GtkButton guint in_button : 1; guint button_down : 1; guint relief : 2; + guint depressed : 1; }; struct _GtkButtonClass @@ -76,7 +77,7 @@ struct _GtkButtonClass }; -GtkType gtk_button_get_type (void) G_GNUC_CONST; +GtkType gtk_button_get_type (void) G_GNUC_CONST; GtkWidget* gtk_button_new (void); GtkWidget* gtk_button_new_with_label (const gchar *label); GtkWidget* gtk_button_new_from_stock (const gchar *stock_id); @@ -89,7 +90,8 @@ void gtk_button_leave (GtkButton *button); void gtk_button_set_relief (GtkButton *button, GtkReliefStyle newstyle); GtkReliefStyle gtk_button_get_relief (GtkButton *button); - +void _gtk_button_set_depressed (GtkButton *button, + gboolean depressed); #ifdef __cplusplus } diff --git a/gtk/gtktogglebutton.c b/gtk/gtktogglebutton.c index 87a6e51d7d..af60088675 100644 --- a/gtk/gtktogglebutton.c +++ b/gtk/gtktogglebutton.c @@ -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_released (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, guint prop_id, const GValue *value, @@ -68,11 +66,11 @@ static void gtk_toggle_button_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); -static void gtk_toggle_button_leave (GtkButton *button); static void gtk_toggle_button_realize (GtkWidget *widget); static void gtk_toggle_button_unrealize (GtkWidget *widget); static void gtk_toggle_button_map (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 GtkContainerClass *parent_class = NULL; @@ -133,8 +131,8 @@ gtk_toggle_button_class_init (GtkToggleButtonClass *class) button_class->pressed = gtk_toggle_button_pressed; button_class->released = gtk_toggle_button_released; button_class->clicked = gtk_toggle_button_clicked; - button_class->enter = gtk_toggle_button_enter; - button_class->leave = gtk_toggle_button_leave; + button_class->enter = gtk_toggle_button_update_state; + button_class->leave = gtk_toggle_button_update_state; class->toggled = NULL; @@ -406,6 +404,8 @@ gtk_toggle_button_set_inconsistent (GtkToggleButton *toggle_button, if (setting != toggle_button->inconsistent) { toggle_button->inconsistent = setting; + + gtk_toggle_button_update_state (GTK_BUTTON (toggle_button)); gtk_widget_queue_draw (GTK_WIDGET (toggle_button)); g_object_notify (G_OBJECT (toggle_button), "inconsistent"); @@ -490,11 +490,8 @@ gtk_toggle_button_paint (GtkWidget *widget, state_type = GTK_STATE_NORMAL; shadow_type = GTK_SHADOW_ETCHED_IN; } - else if ((GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) || - toggle_button->active) - shadow_type = GTK_SHADOW_IN; else - shadow_type = GTK_SHADOW_OUT; + shadow_type = button->depressed ? GTK_SHADOW_IN : GTK_SHADOW_OUT; if (button->relief != GTK_RELIEF_NONE || (GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL && @@ -557,116 +554,38 @@ gtk_toggle_button_expose (GtkWidget *widget, static void 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; - if (toggle_button->active) - 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); + gtk_toggle_button_update_state (button); } static void 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) { - toggle_button = GTK_TOGGLE_BUTTON (button); - button->button_down = FALSE; if (button->in_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); + gtk_button_clicked (button); - if (GTK_WIDGET_STATE (button) != new_state) - gtk_widget_set_state (GTK_WIDGET (button), new_state); - } + gtk_toggle_button_update_state (button); } } static void gtk_toggle_button_clicked (GtkButton *button) { - GtkToggleButton *toggle_button; - GtkStateType new_state; - - g_return_if_fail (GTK_IS_TOGGLE_BUTTON (button)); - - toggle_button = GTK_TOGGLE_BUTTON (button); + GtkToggleButton *toggle_button = GTK_TOGGLE_BUTTON (button); toggle_button->active = !toggle_button->active; gtk_toggle_button_toggled (toggle_button); - 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_widget_set_state (GTK_WIDGET (button), new_state); - else - gtk_widget_queue_draw (GTK_WIDGET (button)); + gtk_toggle_button_update_state (button); 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 gtk_toggle_button_realize (GtkWidget *widget) { @@ -764,3 +683,26 @@ gtk_toggle_button_unmap (GtkWidget *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); +} diff --git a/tests/testgtkrc b/tests/testgtkrc index d13a30d0ff..34bf05497b 100644 --- a/tests/testgtkrc +++ b/tests/testgtkrc @@ -29,6 +29,8 @@ bell_duration = 40 style "global-style-properties" { # xthickness = 20 + GtkButton::child_displacement_x = 1 + GtkButton::child_displacement_y = 1 GtkSpinButton::shadow_type = etched-out GtkEntry::cursor_color = "#ff0000" GtkToolbar::space_size = 10