Index: gtk/gtkcellrenderertoggle.c =================================================================== --- gtk/gtkcellrenderertoggle.c (revision 18523) +++ gtk/gtkcellrenderertoggle.c (working copy) @@ -71,6 +71,8 @@ PROP_INDICATOR_SIZE }; +/* This is a hard-coded default which promptly gets overridden by a size + calculated from the font size. */ #define TOGGLE_WIDTH 13 static guint toggle_cell_signals[LAST_SIGNAL] = { 0 }; @@ -80,8 +82,9 @@ typedef struct _GtkCellRendererTogglePrivate GtkCellRendererTogglePrivate; struct _GtkCellRendererTogglePrivate { - gint indicator_size; - + gint indicator_size; /* This is the real size */ + gint override_size; /* This is the size set from the indicator-size property */ + GtkWidget *cached_widget; guint inconsistent : 1; }; @@ -104,6 +107,7 @@ GTK_CELL_RENDERER (celltoggle)->ypad = 2; priv->indicator_size = TOGGLE_WIDTH; + priv->override_size = 0; priv->inconsistent = FALSE; } @@ -210,7 +214,7 @@ g_value_set_boolean (value, celltoggle->radio); break; case PROP_INDICATOR_SIZE: - g_value_set_int (value, priv->indicator_size); + g_value_set_int (value, priv->override_size ? priv->override_size : priv->indicator_size); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -245,7 +249,7 @@ celltoggle->radio = g_value_get_boolean (value); break; case PROP_INDICATOR_SIZE: - priv->indicator_size = g_value_get_int (value); + priv->override_size = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -273,6 +277,27 @@ } static void +on_widget_style_set (GtkWidget *widget, GtkStyle *previous, gpointer user_data) +{ + GtkCellRendererTogglePrivate *priv = user_data; + PangoContext *context; + PangoFontMetrics *metrics; + int height; + + context = gtk_widget_get_pango_context (widget); + metrics = pango_context_get_metrics (context, + widget->style->font_desc, + pango_context_get_language (context)); + + height = pango_font_metrics_get_ascent (metrics) + + pango_font_metrics_get_descent (metrics); + + pango_font_metrics_unref (metrics); + + priv->indicator_size = PANGO_PIXELS (height * 0.85); +} + +static void gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell, GtkWidget *widget, GdkRectangle *cell_area, @@ -287,6 +312,20 @@ priv = GTK_CELL_RENDERER_TOGGLE_GET_PRIVATE (cell); + if (priv->override_size) { + priv->indicator_size = priv->override_size; + } else if (priv->cached_widget != widget) { + if (priv->cached_widget) { + g_object_remove_weak_pointer (widget, &priv->cached_widget); + g_signal_handlers_disconnect_by_func (priv->cached_widget, on_widget_style_set, priv); + } + priv->cached_widget = widget; + g_object_add_weak_pointer (widget, &priv->cached_widget); + g_signal_connect (widget, "style-set", on_widget_style_set, priv); + + on_widget_style_set (widget, NULL, priv); + } + calc_width = (gint) cell->xpad * 2 + priv->indicator_size; calc_height = (gint) cell->ypad * 2 + priv->indicator_size;