diff options
author | Matthias Clasen <mclasen@redhat.com> | 2014-07-02 15:12:46 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2014-07-02 15:12:46 -0400 |
commit | 8060ac6dddaf39475f0f4cb1c8b2635c175d2381 (patch) | |
tree | c40585e9db50aeee124915d49667220dc3d80ca3 /gtk/gtkmodelbutton.c | |
parent | 43788ba936f0f1af4c169bc2c4817e7895efa753 (diff) | |
download | gtk+-8060ac6dddaf39475f0f4cb1c8b2635c175d2381.tar.gz |
GtkModelButton: Update widget state
We were only setting the state transiently in ::draw, leading
to various drawing anomalies, such as labels not picking up
the appropriate color from BUTTON styles.
Diffstat (limited to 'gtk/gtkmodelbutton.c')
-rw-r--r-- | gtk/gtkmodelbutton.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c index 8dab9af893..c18516305a 100644 --- a/gtk/gtkmodelbutton.c +++ b/gtk/gtkmodelbutton.c @@ -134,11 +134,14 @@ gtk_model_button_set_accel (GtkModelButton *button, /* ignore */ } +static void gtk_model_button_update_state (GtkModelButton *button); + static void gtk_model_button_set_toggled (GtkModelButton *button, gboolean toggled) { button->toggled = toggled; + gtk_model_button_update_state (button); gtk_widget_queue_draw (GTK_WIDGET (button)); } @@ -566,6 +569,12 @@ get_button_state (GtkModelButton *model_button) return state; } +static void +gtk_model_button_update_state (GtkModelButton *button) +{ + gtk_widget_set_state_flags (GTK_WIDGET (button), get_button_state (button), TRUE); +} + static gint gtk_model_button_draw (GtkWidget *widget, cairo_t *cr) @@ -668,10 +677,39 @@ out: } static void +gtk_model_button_pressed (GtkButton *button) +{ + button->priv->button_down = TRUE; + gtk_model_button_update_state (GTK_MODEL_BUTTON (button)); + gtk_widget_queue_draw (GTK_WIDGET (button)); +} + +static void +gtk_model_button_released (GtkButton *button) +{ + if (button->priv->button_down) + { + button->priv->button_down = FALSE; + if (button->priv->in_button) + gtk_button_clicked (button); + gtk_model_button_update_state (GTK_MODEL_BUTTON (button)); + gtk_widget_queue_draw (GTK_WIDGET (button)); + } +} + +static void +gtk_model_button_enter_leave (GtkButton *button) +{ + gtk_model_button_update_state (GTK_MODEL_BUTTON (button)); + gtk_widget_queue_draw (GTK_WIDGET (button)); +} + +static void gtk_model_button_class_init (GtkModelButtonClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + GtkButtonClass *button_class = GTK_BUTTON_CLASS (class); object_class->set_property = gtk_model_button_set_property; @@ -683,6 +721,11 @@ gtk_model_button_class_init (GtkModelButtonClass *class) widget_class->size_allocate = gtk_model_button_size_allocate; widget_class->draw = gtk_model_button_draw; + button_class->pressed = gtk_model_button_pressed; + button_class->released = gtk_model_button_released; + button_class->enter = gtk_model_button_enter_leave; + button_class->leave = gtk_model_button_enter_leave; + g_object_class_install_property (object_class, PROP_ACTION_ROLE, g_param_spec_enum ("action-role", "", "", GTK_TYPE_MENU_TRACKER_ITEM_ROLE, |