diff options
Diffstat (limited to 'gtk/gtkspinbutton.c')
-rw-r--r-- | gtk/gtkspinbutton.c | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index 0928d9ea60..0f97078024 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -156,6 +156,9 @@ struct _GtkSpinButtonPrivate GdkWindow *down_panel; GdkWindow *up_panel; + GtkStyleContext *down_panel_context; + GtkStyleContext *up_panel_context; + GdkWindow *click_child; GdkWindow *in_child; @@ -248,6 +251,7 @@ static void gtk_spin_button_grab_notify (GtkWidget *widget, gboolean was_grabbed); static void gtk_spin_button_state_flags_changed (GtkWidget *widget, GtkStateFlags previous_state); +static void gtk_spin_button_style_updated (GtkWidget *widget); static gboolean gtk_spin_button_timer (GtkSpinButton *spin_button); static gboolean gtk_spin_button_stop_spinning (GtkSpinButton *spin); static void gtk_spin_button_value_changed (GtkAdjustment *adjustment, @@ -328,6 +332,7 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class) widget_class->focus_out_event = gtk_spin_button_focus_out; widget_class->grab_notify = gtk_spin_button_grab_notify; widget_class->state_flags_changed = gtk_spin_button_state_flags_changed; + widget_class->style_updated = gtk_spin_button_style_updated; entry_class->activate = gtk_spin_button_activate; entry_class->get_text_area_size = gtk_spin_button_get_text_area_size; @@ -684,7 +689,16 @@ gtk_spin_button_init (GtkSpinButton *spin_button) static void gtk_spin_button_finalize (GObject *object) { - gtk_spin_button_set_adjustment (GTK_SPIN_BUTTON (object), NULL); + GtkSpinButton *spin_button = GTK_SPIN_BUTTON (object); + GtkSpinButtonPrivate *priv = spin_button->priv; + + gtk_spin_button_set_adjustment (spin_button, NULL); + + if (priv->down_panel_context) + g_object_unref (priv->down_panel_context); + + if (priv->up_panel_context) + g_object_unref (priv->up_panel_context); G_OBJECT_CLASS (gtk_spin_button_parent_class)->finalize (object); } @@ -730,7 +744,7 @@ gtk_spin_button_unmap (GtkWidget *widget) static void gtk_spin_button_panel_nthchildize_context (GtkSpinButton *spin_button, GtkStyleContext *context, - GdkWindow *panel) + gboolean is_down_panel) { GtkSpinButtonPrivate *priv = spin_button->priv; GtkWidget *widget = GTK_WIDGET (spin_button); @@ -777,7 +791,7 @@ gtk_spin_button_panel_nthchildize_context (GtkSpinButton *spin_button, gtk_widget_path_iter_add_class (siblings_path, up_pos, GTK_STYLE_CLASS_SPINBUTTON); gtk_widget_path_iter_add_class (siblings_path, down_pos, GTK_STYLE_CLASS_SPINBUTTON); - if (panel == priv->down_panel) + if (is_down_panel) gtk_widget_path_append_with_siblings (path, siblings_path, down_pos); else gtk_widget_path_append_with_siblings (path, siblings_path, up_pos); @@ -846,12 +860,20 @@ static GtkStyleContext * gtk_spin_button_panel_get_context (GtkSpinButton *spin_button, GdkWindow *panel) { - GtkStyleContext *context; + GtkSpinButtonPrivate *priv = spin_button->priv; + GtkStyleContext **contextp; - context = gtk_style_context_new (); - gtk_spin_button_panel_nthchildize_context (spin_button, context, panel); + contextp = (panel == priv->down_panel) ? + &priv->down_panel_context : &priv->up_panel_context; + + if (*contextp == NULL) + { + *contextp = gtk_style_context_new (); + gtk_spin_button_panel_nthchildize_context (spin_button, *contextp, + panel == priv->down_panel); + } - return context; + return *contextp; } static void @@ -874,8 +896,6 @@ gtk_spin_button_panel_get_size (GtkSpinButton *spin_button, gtk_style_context_get_padding (context, state, &button_padding); gtk_style_context_get_border (context, state, &button_border); - g_object_unref (context); - if (width) *width = icon_size + button_padding.left + button_padding.right + button_border.left + button_border.right; @@ -1004,7 +1024,6 @@ gtk_spin_button_panel_draw (GtkSpinButton *spin_button, cairo_restore (cr); g_object_unref (icon_helper); - g_object_unref (context); } static void @@ -1361,6 +1380,25 @@ gtk_spin_button_state_flags_changed (GtkWidget *widget, } } +static void +gtk_spin_button_style_updated (GtkWidget *widget) +{ + GtkSpinButton *spin = GTK_SPIN_BUTTON (widget); + GtkSpinButtonPrivate *priv = spin->priv; + + if (priv->down_panel_context) + gtk_spin_button_panel_nthchildize_context (spin, + priv->down_panel_context, + TRUE); + + if (priv->up_panel_context) + gtk_spin_button_panel_nthchildize_context (spin, + priv->up_panel_context, + FALSE); + + GTK_WIDGET_CLASS (gtk_spin_button_parent_class)->style_updated (widget); +} + static gint gtk_spin_button_scroll (GtkWidget *widget, GdkEventScroll *event) |