Upstream-Status: Pending

Index: gtk/gtkcellrenderertoggle.c
===================================================================
--- gtk/gtkcellrenderertoggle.c.orig	2010-06-22 18:11:33.000000000 +0800
+++ gtk/gtkcellrenderertoggle.c	2010-06-22 18:11:43.000000000 +0800
@@ -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;
 
