[gtk+/resolution-independence: 18/24] port GtkTreeView, GtkIconView, GtkComboBox and all GtkCellRenderer's to RI



commit 42efae2d47b003b698d7df1b3e128fc4b4ddf56b
Author: David Zeuthen <davidz redhat com>
Date:   Wed Aug 13 16:05:48 2008 -0400

    port GtkTreeView, GtkIconView, GtkComboBox and all GtkCellRenderer's to RI
    
    min/max for GtkCellRenderer
    
    min/max for GtkCellRendererToggle
    
    min/max for GtkComboBox
    
    min/max for GtkIconView
    
    min/max for GtkTreeView
    
    min/max for GtkTreeViewColumn
    
    fixed gtkcellrenderer.c
    
    fixed gtkcellrenderertoggle.c
    
    fixed gtkcombobox.c
    
    fixed gtkiconview.c
    
    fixed gtktreeview.c
    
    fixed gtktreeviewcolumn.c
---
 docs/reference/gtk/gtk-sections.txt |   14 ++
 gtk/gtk.symbols                     |   14 ++
 gtk/gtkcellrenderer.c               |  215 +++++++++++++++++++++++++++------
 gtk/gtkcellrenderer.h               |   29 ++++-
 gtk/gtkcellrendererpixbuf.c         |    7 +-
 gtk/gtkcellrenderertoggle.c         |   23 ++--
 gtk/gtkcombobox.c                   |   27 +++-
 gtk/gtkiconview.c                   |  230 ++++++++++++++++++++++++-----------
 gtk/gtkiconview.h                   |   15 ++-
 gtk/gtktreeprivate.h                |    2 +
 gtk/gtktreeview.c                   |  198 ++++++++++++++++++++----------
 gtk/gtktreeview.h                   |    1 +
 gtk/gtktreeviewcolumn.c             |  185 +++++++++++++++++++---------
 gtk/gtktreeviewcolumn.h             |   21 ++--
 14 files changed, 706 insertions(+), 275 deletions(-)

diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 9a00b66..ba84000 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -1936,14 +1936,19 @@ gtk_icon_view_set_columns
 gtk_icon_view_get_columns
 gtk_icon_view_set_item_width
 gtk_icon_view_get_item_width
+gtk_icon_view_get_item_width_unit
 gtk_icon_view_set_spacing
 gtk_icon_view_get_spacing
+gtk_icon_view_get_spacing_unit
 gtk_icon_view_set_row_spacing
 gtk_icon_view_get_row_spacing
+gtk_icon_view_get_row_spacing_unit
 gtk_icon_view_set_column_spacing
 gtk_icon_view_get_column_spacing
+gtk_icon_view_get_column_spacing_unit
 gtk_icon_view_set_margin
 gtk_icon_view_get_margin
+gtk_icon_view_get_margin_unit
 gtk_icon_view_select_path
 gtk_icon_view_unselect_path
 gtk_icon_view_path_is_selected
@@ -4734,6 +4739,7 @@ gtk_tree_view_column_set_cell_data_func
 gtk_tree_view_column_clear_attributes
 gtk_tree_view_column_set_spacing
 gtk_tree_view_column_get_spacing
+gtk_tree_view_column_get_spacing_unit
 gtk_tree_view_column_set_visible
 gtk_tree_view_column_get_visible
 gtk_tree_view_column_set_resizable
@@ -4742,11 +4748,14 @@ gtk_tree_view_column_set_sizing
 gtk_tree_view_column_get_sizing
 gtk_tree_view_column_get_width
 gtk_tree_view_column_get_fixed_width
+gtk_tree_view_column_get_fixed_width_unit
 gtk_tree_view_column_set_fixed_width
 gtk_tree_view_column_set_min_width
 gtk_tree_view_column_get_min_width
+gtk_tree_view_column_get_min_width_unit
 gtk_tree_view_column_set_max_width
 gtk_tree_view_column_get_max_width
+gtk_tree_view_column_get_max_width_unit
 gtk_tree_view_column_clicked
 gtk_tree_view_column_set_title
 gtk_tree_view_column_get_title
@@ -4795,6 +4804,7 @@ GtkTreeViewMappingFunc
 GtkTreeViewSearchEqualFunc
 gtk_tree_view_new
 gtk_tree_view_get_level_indentation
+gtk_tree_view_get_level_indentation_unit
 gtk_tree_view_get_show_expanders
 gtk_tree_view_set_level_indentation
 gtk_tree_view_set_show_expanders
@@ -4969,13 +4979,17 @@ GtkCellRendererMode
 GtkCellRenderer
 GtkCellRendererClass
 gtk_cell_renderer_get_size
+gtk_cell_renderer_get_size_unit
 gtk_cell_renderer_render
 gtk_cell_renderer_activate
 gtk_cell_renderer_start_editing
 gtk_cell_renderer_editing_canceled
 gtk_cell_renderer_stop_editing
 gtk_cell_renderer_get_fixed_size
+gtk_cell_renderer_get_fixed_size_unit
 gtk_cell_renderer_set_fixed_size
+gtk_cell_renderer_get_tree_view_column
+gtk_cell_renderer_get_tree_view
 
 <SUBSECTION Standard>
 GTK_CELL_RENDERER
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index d6bb1b6..b016602 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -628,12 +628,16 @@ gtk_cell_renderer_activate
 gtk_cell_renderer_editing_canceled
 #endif
 gtk_cell_renderer_get_fixed_size
+gtk_cell_renderer_get_fixed_size_unit
 gtk_cell_renderer_get_size
+gtk_cell_renderer_get_size_unit
 gtk_cell_renderer_get_type G_GNUC_CONST
 gtk_cell_renderer_render
 gtk_cell_renderer_set_fixed_size
 gtk_cell_renderer_start_editing
 gtk_cell_renderer_stop_editing
+gtk_cell_renderer_get_tree_view_column
+gtk_cell_renderer_get_tree_view
 #endif
 #endif
 
@@ -1959,10 +1963,13 @@ gtk_icon_theme_set_search_path_utf8
 #if IN_HEADER(__GTK_ICON_VIEW_H__)
 #if IN_FILE(__GTK_ICON_VIEW_C__)
 gtk_icon_view_get_column_spacing
+gtk_icon_view_get_column_spacing_unit
 gtk_icon_view_get_columns
 gtk_icon_view_get_cursor
 gtk_icon_view_get_item_width
+gtk_icon_view_get_item_width_unit
 gtk_icon_view_get_margin
+gtk_icon_view_get_margin_unit
 gtk_icon_view_get_markup_column
 gtk_icon_view_get_model
 gtk_icon_view_get_orientation
@@ -1971,9 +1978,11 @@ gtk_icon_view_get_item_at_pos
 gtk_icon_view_convert_widget_to_bin_window_coords
 gtk_icon_view_get_pixbuf_column
 gtk_icon_view_get_row_spacing
+gtk_icon_view_get_row_spacing_unit
 gtk_icon_view_get_selected_items
 gtk_icon_view_get_selection_mode
 gtk_icon_view_get_spacing
+gtk_icon_view_get_spacing_unit
 gtk_icon_view_get_text_column
 gtk_icon_view_get_type G_GNUC_CONST
 gtk_icon_view_get_visible_range
@@ -4616,8 +4625,11 @@ gtk_tree_view_column_get_cell_renderers
 gtk_tree_view_column_get_clickable
 gtk_tree_view_column_get_expand
 gtk_tree_view_column_get_fixed_width
+gtk_tree_view_column_get_fixed_width_unit
 gtk_tree_view_column_get_max_width
+gtk_tree_view_column_get_max_width_unit
 gtk_tree_view_column_get_min_width
+gtk_tree_view_column_get_min_width_unit
 gtk_tree_view_column_get_reorderable
 gtk_tree_view_column_get_resizable
 gtk_tree_view_column_get_sizing
@@ -4625,6 +4637,7 @@ gtk_tree_view_column_get_sort_column_id
 gtk_tree_view_column_get_sort_indicator
 gtk_tree_view_column_get_sort_order
 gtk_tree_view_column_get_spacing
+gtk_tree_view_column_get_spacing_unit
 gtk_tree_view_column_get_title
 gtk_tree_view_column_get_tree_view
 gtk_tree_view_column_get_type G_GNUC_CONST
@@ -4693,6 +4706,7 @@ gtk_tree_view_get_headers_visible
 gtk_tree_view_get_hover_expand
 gtk_tree_view_get_hover_selection
 gtk_tree_view_get_level_indentation
+gtk_tree_view_get_level_indentation_unit
 gtk_tree_view_get_model
 gtk_tree_view_get_path_at_pos
 gtk_tree_view_get_reorderable
diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c
index c41a7f8..ac7f691 100644
--- a/gtk/gtkcellrenderer.c
+++ b/gtk/gtkcellrenderer.c
@@ -43,6 +43,9 @@ typedef struct _GtkCellRendererPrivate GtkCellRendererPrivate;
 struct _GtkCellRendererPrivate
 {
   GdkColor cell_background;
+  GtkUSize xpad_unit;
+  GtkUSize ypad_unit;
+  GtkTreeViewColumn *column;
 };
 
 
@@ -79,6 +82,8 @@ G_DEFINE_ABSTRACT_TYPE (GtkCellRenderer, gtk_cell_renderer, GTK_TYPE_OBJECT)
 static void
 gtk_cell_renderer_init (GtkCellRenderer *cell)
 {
+  GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
+
   cell->mode = GTK_CELL_RENDERER_MODE_INERT;
   cell->visible = TRUE;
   cell->width = -1;
@@ -87,6 +92,8 @@ gtk_cell_renderer_init (GtkCellRenderer *cell)
   cell->yalign = 0.5;
   cell->xpad = 0;
   cell->ypad = 0;
+  priv->xpad_unit = 0;
+  priv->ypad_unit = 0;
   cell->sensitive = TRUE;
   cell->is_expander = FALSE;
   cell->is_expanded = FALSE;
@@ -217,43 +224,35 @@ gtk_cell_renderer_class_init (GtkCellRendererClass *class)
 
   g_object_class_install_property (object_class,
 				   PROP_XPAD,
-				   g_param_spec_uint ("xpad",
-						      P_("xpad"),
-						      P_("The xpad"),
-						      0,
-						      G_MAXUINT,
-						      0,
-						      GTK_PARAM_READWRITE));
+				   gtk_param_spec_usize ("xpad",
+                                                         P_("xpad"),
+                                                         P_("The xpad"),
+                                                         0, G_MAXINT, 0,
+                                                         GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
 				   PROP_YPAD,
-				   g_param_spec_uint ("ypad",
-						      P_("ypad"),
-						      P_("The ypad"),
-						      0,
-						      G_MAXUINT,
-						      0,
-						      GTK_PARAM_READWRITE));
+				   gtk_param_spec_usize ("ypad",
+                                                         P_("ypad"),
+                                                         P_("The ypad"),
+                                                         0, G_MAXINT, 0,
+                                                         GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
 				   PROP_WIDTH,
-				   g_param_spec_int ("width",
-						     P_("width"),
-						     P_("The fixed width"),
-						     -1,
-						     G_MAXINT,
-						     -1,
-						     GTK_PARAM_READWRITE));
+				   gtk_param_spec_size ("width",
+                                                        P_("width"),
+                                                        P_("The fixed width"),
+                                                        -1, G_MAXINT, -1,
+                                                        GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
 				   PROP_HEIGHT,
-				   g_param_spec_int ("height",
-						     P_("height"),
-						     P_("The fixed height"),
-						     -1,
-						     G_MAXINT,
-						     -1,
-						     GTK_PARAM_READWRITE));
+				   gtk_param_spec_size ("height",
+                                                        P_("height"),
+                                                        P_("The fixed height"),
+                                                        -1, G_MAXINT, -1,
+                                                        GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
 				   PROP_IS_EXPANDER,
@@ -336,16 +335,16 @@ gtk_cell_renderer_get_property (GObject     *object,
       g_value_set_float (value, cell->yalign);
       break;
     case PROP_XPAD:
-      g_value_set_uint (value, cell->xpad);
+      gtk_value_set_usize (value, priv->xpad_unit, gtk_cell_renderer_get_tree_view (cell));
       break;
     case PROP_YPAD:
-      g_value_set_uint (value, cell->ypad);
+      gtk_value_set_usize (value, priv->ypad_unit, gtk_cell_renderer_get_tree_view (cell));
       break;
     case PROP_WIDTH:
-      g_value_set_int (value, cell->width);
+      gtk_value_set_size (value, cell->width, gtk_cell_renderer_get_tree_view (cell));
       break;
     case PROP_HEIGHT:
-      g_value_set_int (value, cell->height);
+      gtk_value_set_size (value, cell->height, gtk_cell_renderer_get_tree_view (cell));
       break;
     case PROP_IS_EXPANDER:
       g_value_set_boolean (value, cell->is_expander);
@@ -382,6 +381,7 @@ gtk_cell_renderer_set_property (GObject      *object,
 				GParamSpec   *pspec)
 {
   GtkCellRenderer *cell = GTK_CELL_RENDERER (object);
+  GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (object);
 
   switch (param_id)
     {
@@ -404,16 +404,18 @@ gtk_cell_renderer_set_property (GObject      *object,
       cell->yalign = g_value_get_float (value);
       break;
     case PROP_XPAD:
-      cell->xpad = g_value_get_uint (value);
+      priv->xpad_unit = gtk_value_get_usize (value);
+      cell->xpad = gtk_widget_size_to_pixel (gtk_cell_renderer_get_tree_view (cell), priv->xpad_unit);
       break;
     case PROP_YPAD:
-      cell->ypad = g_value_get_uint (value);
+      priv->ypad_unit = gtk_value_get_usize (value);
+      cell->ypad = gtk_widget_size_to_pixel (gtk_cell_renderer_get_tree_view (cell), priv->ypad_unit);
       break;
     case PROP_WIDTH:
-      cell->width = g_value_get_int (value);
+      cell->width = gtk_value_get_size (value);
       break;
     case PROP_HEIGHT:
-      cell->height = g_value_get_int (value);
+      cell->height = gtk_value_get_size (value);
       break;
     case PROP_IS_EXPANDER:
       cell->is_expander = g_value_get_boolean (value);
@@ -511,6 +513,59 @@ gtk_cell_renderer_get_size (GtkCellRenderer    *cell,
   if (width && cell->width != -1)
     {
       real_width = NULL;
+      *width = gtk_widget_size_to_pixel (widget, cell->width);
+    }
+  if (height && cell->height != -1)
+    {
+      real_height = NULL;
+      *height = gtk_widget_size_to_pixel (widget, cell->height);
+    }
+
+  GTK_CELL_RENDERER_GET_CLASS (cell)->get_size (cell,
+						widget,
+						(GdkRectangle *) cell_area,
+						x_offset,
+						y_offset,
+						real_width,
+						real_height);
+  if (real_width)
+    *real_width = gtk_widget_size_to_pixel (widget, *real_width);
+  if (real_height)
+    *real_height = gtk_widget_size_to_pixel (widget, *real_height);
+}
+
+/**
+ * gtk_cell_renderer_get_size_unit:
+ * @cell: a #GtkCellRenderer
+ * @widget: the widget the renderer is rendering to
+ * @cell_area: The area a cell will be allocated, or %NULL
+ * @x_offset: location to return x offset of cell relative to @cell_area, or %NULL
+ * @y_offset: location to return y offset of cell relative to @cell_area, or %NULL
+ * @width: location to return width needed to render a cell, or %NULL
+ * @height: location to return height needed to render a cell, or %NULL
+ *
+ * Like gtk_cell_renderer_get_size() but preserves the units.
+ *
+ * Since: 2.14
+ **/
+void
+gtk_cell_renderer_get_size_unit (GtkCellRenderer    *cell,
+                                 GtkWidget          *widget,
+                                 const GdkRectangle *cell_area,
+                                 gint               *x_offset,
+                                 gint               *y_offset,
+                                 GtkSize            *width,
+                                 GtkSize            *height)
+{
+  gint *real_width = width;
+  gint *real_height = height;
+
+  g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
+  g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->get_size != NULL);
+
+  if (width && cell->width != -1)
+    {
+      real_width = NULL;
       *width = cell->width;
     }
   if (height && cell->height != -1)
@@ -689,8 +744,8 @@ gtk_cell_renderer_start_editing (GtkCellRenderer      *cell,
  **/
 void
 gtk_cell_renderer_set_fixed_size (GtkCellRenderer *cell,
-				  gint             width,
-				  gint             height)
+				  GtkSize          width,
+				  GtkSize          height)
 {
   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
   g_return_if_fail (width >= -1 && height >= -1);
@@ -731,6 +786,29 @@ gtk_cell_renderer_get_fixed_size (GtkCellRenderer *cell,
   g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
 
   if (width)
+    (* width) = gtk_widget_size_to_pixel (gtk_cell_renderer_get_tree_view (cell), cell->width);
+  if (height)
+    (* height) = gtk_widget_size_to_pixel (gtk_cell_renderer_get_tree_view (cell), cell->height);
+}
+
+/**
+ * gtk_cell_renderer_get_fixed_size_unit:
+ * @cell: A #GtkCellRenderer
+ * @width: location to fill in with the fixed width of the widget, or %NULL
+ * @height: location to fill in with the fixed height of the widget, or %NULL
+ * 
+ * Like gtk_cell_renderer_get_fixed_size_unit() but preserves the unit information.
+ *
+ * Since: 2.14
+ **/
+void
+gtk_cell_renderer_get_fixed_size_unit (GtkCellRenderer *cell,
+                                       GtkSize         *width,
+                                       GtkSize         *height)
+{
+  g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
+
+  if (width)
     (* width) = cell->width;
   if (height)
     (* height) = cell->height;
@@ -787,5 +865,66 @@ gtk_cell_renderer_stop_editing (GtkCellRenderer *cell,
     }
 }
 
+void
+_gtk_cell_renderer_set_tree_view_column (GtkCellRenderer *cell,
+                                         GtkTreeViewColumn *column)
+{
+  GtkCellRendererPrivate *priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
+  priv->column = column;
+}
+
+/**
+ * gtk_cell_renderer_get_tree_view_column:
+ * @cell: A #GtkCellRenderer
+ *
+ * Gets the #GtkTreeViewColumn wherein @cell has been
+ * inserted. Returns %NULL if @cell is currently not inserted into any
+ * tree column.
+ *
+ * Returns: the #GtkTreeViewColumn that @cell has been inserted into,
+ * %NULL otherwise
+ *
+ * Since: 2.14
+ **/
+GtkTreeViewColumn *
+gtk_cell_renderer_get_tree_view_column (GtkCellRenderer *cell)
+{
+  GtkCellRendererPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CELL_RENDERER (cell), NULL);
+
+  priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
+
+  return priv->column;
+}
+
+/**
+ * gtk_cell_renderer_get_tree_view:
+ * @cell: A #GtkCellRenderer
+ *
+ * Gets the #GtkTreeView wherein the column that @cell has been
+ * inserted belongs to. Returns %NULL if @cell is currently not
+ * inserted into any tree column or if the tree column is currently
+ * not inserted into any tree.
+ *
+ * Returns: a #GtkTreeView
+ *
+ * Since: 2.14
+ */
+GtkWidget *
+gtk_cell_renderer_get_tree_view (GtkCellRenderer *cell)
+{
+  GtkCellRendererPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_CELL_RENDERER (cell), NULL);
+
+  priv = GTK_CELL_RENDERER_GET_PRIVATE (cell);
+
+  if (priv->column == NULL)
+    return NULL;
+
+  return gtk_tree_view_column_get_tree_view (priv->column);
+}
+
 #define __GTK_CELL_RENDERER_C__
 #include "gtkaliasdef.c"
diff --git a/gtk/gtkcellrenderer.h b/gtk/gtkcellrenderer.h
index 8b54292..5484bcc 100644
--- a/gtk/gtkcellrenderer.h
+++ b/gtk/gtkcellrenderer.h
@@ -26,6 +26,9 @@
 
 #include <gtk/gtkcelleditable.h>
 
+/* forward declaration */
+typedef struct _GtkTreeViewColumn      GtkTreeViewColumn;
+
 G_BEGIN_DECLS
 
 typedef enum
@@ -62,8 +65,8 @@ struct _GtkCellRenderer
   gfloat GSEAL (xalign);
   gfloat GSEAL (yalign);
 
-  gint GSEAL (width);
-  gint GSEAL (height);
+  GtkSize GSEAL (width);
+  GtkSize GSEAL (height);
 
   guint16 GSEAL (xpad);
   guint16 GSEAL (ypad);
@@ -87,8 +90,8 @@ struct _GtkCellRendererClass
 				      GdkRectangle         *cell_area,
 				      gint                 *x_offset,
 				      gint                 *y_offset,
-				      gint                 *width,
-				      gint                 *height);
+				      GtkSize              *width,
+				      GtkSize              *height);
   void             (* render)        (GtkCellRenderer      *cell,
 				      GdkDrawable          *window,
 				      GtkWidget            *widget,
@@ -131,6 +134,13 @@ void             gtk_cell_renderer_get_size       (GtkCellRenderer      *cell,
 						   gint                 *y_offset,
 						   gint                 *width,
 						   gint                 *height);
+void             gtk_cell_renderer_get_size_unit  (GtkCellRenderer      *cell,
+						   GtkWidget            *widget,
+						   const GdkRectangle   *cell_area,
+						   gint                 *x_offset,
+						   gint                 *y_offset,
+						   GtkSize              *width,
+						   GtkSize              *height);
 void             gtk_cell_renderer_render         (GtkCellRenderer      *cell,
 						   GdkWindow            *window,
 						   GtkWidget            *widget,
@@ -153,11 +163,18 @@ GtkCellEditable *gtk_cell_renderer_start_editing  (GtkCellRenderer      *cell,
 						   const GdkRectangle   *cell_area,
 						   GtkCellRendererState  flags);
 void             gtk_cell_renderer_set_fixed_size (GtkCellRenderer      *cell,
-						   gint                  width,
-						   gint                  height);
+						   GtkSize               width,
+						   GtkSize               height);
 void             gtk_cell_renderer_get_fixed_size (GtkCellRenderer      *cell,
 						   gint                 *width,
 						   gint                 *height);
+void             gtk_cell_renderer_get_fixed_size_unit (GtkCellRenderer *cell,
+                                                        GtkSize         *width,
+                                                        GtkSize         *height);
+
+GtkTreeViewColumn *gtk_cell_renderer_get_tree_view_column (GtkCellRenderer *cell);
+
+GtkWidget *gtk_cell_renderer_get_tree_view (GtkCellRenderer *cell);
 
 /* For use by cell renderer implementations only */
 #ifndef GTK_DISABLE_DEPRECATED
diff --git a/gtk/gtkcellrendererpixbuf.c b/gtk/gtkcellrendererpixbuf.c
index 0431295..71f9de9 100644
--- a/gtk/gtkcellrendererpixbuf.c
+++ b/gtk/gtkcellrendererpixbuf.c
@@ -431,9 +431,10 @@ gtk_cell_renderer_pixbuf_create_themed_pixbuf (GtkCellRendererPixbuf *cellpixbuf
   icon_theme = gtk_icon_theme_get_for_screen (screen);
   settings = gtk_settings_get_for_screen (screen);
 
-  if (!gtk_icon_size_lookup_for_settings (settings,
-					  priv->stock_size,
-					  &width, &height))
+  if (!gtk_icon_size_lookup_for_settings_for_monitor (settings,
+                                                      gtk_widget_get_monitor_num (widget),
+                                                      priv->stock_size,
+                                                      &width, &height))
     {
       g_warning ("Invalid icon size %u\n", priv->stock_size);
       width = height = 24;
diff --git a/gtk/gtkcellrenderertoggle.c b/gtk/gtkcellrenderertoggle.c
index 5cc826c..9e4159b 100644
--- a/gtk/gtkcellrenderertoggle.c
+++ b/gtk/gtkcellrenderertoggle.c
@@ -71,7 +71,7 @@ enum {
   PROP_INDICATOR_SIZE
 };
 
-#define TOGGLE_WIDTH 13
+#define TOGGLE_WIDTH GTK_SIZE_ONE_TWELFTH_EM(13)
 
 static guint toggle_cell_signals[LAST_SIGNAL] = { 0 };
 
@@ -154,13 +154,11 @@ gtk_cell_renderer_toggle_class_init (GtkCellRendererToggleClass *class)
 
   g_object_class_install_property (object_class,
 				   PROP_INDICATOR_SIZE,
-				   g_param_spec_int ("indicator-size",
-						     P_("Indicator size"),
-						     P_("Size of check or radio indicator"),
-						     0,
-						     G_MAXINT,
-						     TOGGLE_WIDTH,
-						     GTK_PARAM_READWRITE));
+				   gtk_param_spec_size ("indicator-size",
+                                                        P_("Indicator size"),
+                                                        P_("Size of check or radio indicator"),
+                                                        0, G_MAXINT, TOGGLE_WIDTH,
+                                                        GTK_PARAM_READWRITE));
 
   
   /**
@@ -210,7 +208,8 @@ gtk_cell_renderer_toggle_get_property (GObject     *object,
       g_value_set_boolean (value, celltoggle->radio);
       break;
     case PROP_INDICATOR_SIZE:
-      g_value_set_int (value, priv->indicator_size);
+      gtk_value_set_size (value, priv->indicator_size,
+                          gtk_cell_renderer_get_tree_view (GTK_CELL_RENDERER (celltoggle)));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -245,7 +244,7 @@ gtk_cell_renderer_toggle_set_property (GObject      *object,
       celltoggle->radio = g_value_get_boolean (value);
       break;
     case PROP_INDICATOR_SIZE:
-      priv->indicator_size = g_value_get_int (value);
+      priv->indicator_size = gtk_value_get_size (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
@@ -287,8 +286,8 @@ gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
 
   priv = GTK_CELL_RENDERER_TOGGLE_GET_PRIVATE (cell);
 
-  calc_width = (gint) cell->xpad * 2 + priv->indicator_size;
-  calc_height = (gint) cell->ypad * 2 + priv->indicator_size;
+  calc_width = (gint) cell->xpad * 2 + gtk_widget_size_to_pixel (widget, priv->indicator_size);
+  calc_height = (gint) cell->ypad * 2 + gtk_widget_size_to_pixel (widget, priv->indicator_size);
 
   if (width)
     *width = calc_width;
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 57a975d..1648c1d 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -243,6 +243,7 @@ static void     gtk_combo_box_add                  (GtkContainer    *container,
                                                     GtkWidget       *widget);
 static void     gtk_combo_box_remove               (GtkContainer    *container,
                                                     GtkWidget       *widget);
+static void     gtk_combo_box_unit_changed         (GtkWidget       *widget);
 
 static ComboCellInfo *gtk_combo_box_get_cell_info  (GtkComboBox      *combo_box,
                                                     GtkCellRenderer  *cell);
@@ -499,6 +500,7 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
   widget_class->grab_focus = gtk_combo_box_grab_focus;
   widget_class->style_set = gtk_combo_box_style_set;
   widget_class->state_changed = gtk_combo_box_state_changed;
+  widget_class->unit_changed = gtk_combo_box_unit_changed;
 
   gtk_object_class = (GtkObjectClass *)klass;
   gtk_object_class->destroy = gtk_combo_box_destroy;
@@ -861,13 +863,11 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
    * Since: 2.12
    */
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("arrow-size",
-							     P_("Arrow Size"),
-							     P_("The minimum size of the arrow in the combo box"),
-							     0,
-							     G_MAXINT,
-							     15,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("arrow-size",
+                                                                P_("Arrow Size"),
+                                                                P_("The minimum size of the arrow in the combo box"),
+                                                                0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (15),
+                                                                GTK_PARAM_READABLE));
 
   /**
    * GtkComboBox:shadow-type:
@@ -5924,5 +5924,18 @@ gtk_combo_box_buildable_custom_tag_end (GtkBuildable *buildable,
 					    data);
 }
 
+static void
+gtk_combo_box_unit_changed (GtkWidget *widget)
+{
+  GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
+
+  gtk_combo_box_check_appearance (combo_box);
+
+  /* must chain up */
+  if (GTK_WIDGET_CLASS (gtk_combo_box_parent_class)->unit_changed != NULL)
+    GTK_WIDGET_CLASS (gtk_combo_box_parent_class)->unit_changed (widget);
+}
+
+
 #define __GTK_COMBO_BOX_C__
 #include "gtkaliasdef.c"
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index aa1d16e..40ae71e 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -45,8 +45,8 @@
 
 #undef DEBUG_ICON_VIEW
 
-#define SCROLL_EDGE_SIZE 15
-#define ITEM_PADDING     6
+#define SCROLL_EDGE_SIZE GTK_SIZE_ONE_TWELFTH_EM(15)
+#define ITEM_PADDING     GTK_SIZE_ONE_TWELFTH_EM(6)
 
 #define GTK_ICON_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ICON_VIEW, GtkIconViewPrivate))
 
@@ -644,11 +644,11 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
    */
   g_object_class_install_property (gobject_class,
 				   PROP_ITEM_WIDTH,
-				   g_param_spec_int ("item-width",
-						     P_("Width for each item"),
-						     P_("The width used for each item"),
-						     -1, G_MAXINT, -1,
-						     GTK_PARAM_READWRITE));  
+				   gtk_param_spec_size ("item-width",
+                                                        P_("Width for each item"),
+                                                        P_("The width used for each item"),
+                                                        -1, G_MAXINT, -1,
+                                                        GTK_PARAM_READWRITE));  
 
   /**
    * GtkIconView:spacing:
@@ -660,11 +660,11 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
    */
   g_object_class_install_property (gobject_class,
                                    PROP_SPACING,
-                                   g_param_spec_int ("spacing",
-						     P_("Spacing"),
-						     P_("Space which is inserted between cells of an item"),
-						     0, G_MAXINT, 0,
-						     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("spacing",
+                                                        P_("Spacing"),
+                                                        P_("Space which is inserted between cells of an item"),
+                                                        0, G_MAXINT, 0,
+                                                        GTK_PARAM_READWRITE));
 
   /**
    * GtkIconView:row-spacing:
@@ -676,11 +676,11 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
    */
   g_object_class_install_property (gobject_class,
                                    PROP_ROW_SPACING,
-                                   g_param_spec_int ("row-spacing",
-						     P_("Row Spacing"),
-						     P_("Space which is inserted between grid rows"),
-						     0, G_MAXINT, 6,
-						     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("row-spacing",
+                                                        P_("Row Spacing"),
+                                                        P_("Space which is inserted between grid rows"),
+                                                        0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (6),
+                                                        GTK_PARAM_READWRITE));
 
   /**
    * GtkIconView:column-spacing:
@@ -692,11 +692,11 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
    */
   g_object_class_install_property (gobject_class,
                                    PROP_COLUMN_SPACING,
-                                   g_param_spec_int ("column-spacing",
-						     P_("Column Spacing"),
-						     P_("Space which is inserted between grid columns"),
-						     0, G_MAXINT, 6,
-						     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("column-spacing",
+                                                        P_("Column Spacing"),
+                                                        P_("Space which is inserted between grid columns"),
+                                                        0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (6),
+                                                        GTK_PARAM_READWRITE));
 
   /**
    * GtkIconView:margin:
@@ -708,11 +708,11 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
    */
   g_object_class_install_property (gobject_class,
                                    PROP_MARGIN,
-                                   g_param_spec_int ("margin",
-						     P_("Margin"),
-						     P_("Space which is inserted at the edges of the icon view"),
-						     0, G_MAXINT, 6,
-						     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("margin",
+                                                        P_("Margin"),
+                                                        P_("Space which is inserted at the edges of the icon view"),
+                                                        0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (6),
+                                                        GTK_PARAM_READWRITE));
 
 
   /**
@@ -1103,9 +1103,9 @@ gtk_icon_view_init (GtkIconView *icon_view)
   icon_view->priv->columns = -1;
   icon_view->priv->item_width = -1;
   icon_view->priv->spacing = 0;
-  icon_view->priv->row_spacing = 6;
-  icon_view->priv->column_spacing = 6;
-  icon_view->priv->margin = 6;
+  icon_view->priv->row_spacing = GTK_SIZE_ONE_TWELFTH_EM (6);
+  icon_view->priv->column_spacing = GTK_SIZE_ONE_TWELFTH_EM (6);
+  icon_view->priv->margin = GTK_SIZE_ONE_TWELFTH_EM (6);
 
   icon_view->priv->draw_focus = TRUE;
 }
@@ -1194,19 +1194,19 @@ gtk_icon_view_set_property (GObject      *object,
       gtk_icon_view_set_columns (icon_view, g_value_get_int (value));
       break;
     case PROP_ITEM_WIDTH:
-      gtk_icon_view_set_item_width (icon_view, g_value_get_int (value));
+      gtk_icon_view_set_item_width (icon_view, gtk_value_get_size (value));
       break;
     case PROP_SPACING:
-      gtk_icon_view_set_spacing (icon_view, g_value_get_int (value));
+      gtk_icon_view_set_spacing (icon_view, gtk_value_get_size (value));
       break;
     case PROP_ROW_SPACING:
-      gtk_icon_view_set_row_spacing (icon_view, g_value_get_int (value));
+      gtk_icon_view_set_row_spacing (icon_view, gtk_value_get_size (value));
       break;
     case PROP_COLUMN_SPACING:
-      gtk_icon_view_set_column_spacing (icon_view, g_value_get_int (value));
+      gtk_icon_view_set_column_spacing (icon_view, gtk_value_get_size (value));
       break;
     case PROP_MARGIN:
-      gtk_icon_view_set_margin (icon_view, g_value_get_int (value));
+      gtk_icon_view_set_margin (icon_view, gtk_value_get_size (value));
       break;
     case PROP_REORDERABLE:
       gtk_icon_view_set_reorderable (icon_view, g_value_get_boolean (value));
@@ -1256,19 +1256,19 @@ gtk_icon_view_get_property (GObject      *object,
       g_value_set_int (value, icon_view->priv->columns);
       break;
     case PROP_ITEM_WIDTH:
-      g_value_set_int (value, icon_view->priv->item_width);
+      gtk_value_set_size (value, icon_view->priv->item_width, icon_view);
       break;
     case PROP_SPACING:
-      g_value_set_int (value, icon_view->priv->spacing);
+      gtk_value_set_size (value, icon_view->priv->spacing, icon_view);
       break;
     case PROP_ROW_SPACING:
-      g_value_set_int (value, icon_view->priv->row_spacing);
+      gtk_value_set_size (value, icon_view->priv->row_spacing, icon_view);
       break;
     case PROP_COLUMN_SPACING:
-      g_value_set_int (value, icon_view->priv->column_spacing);
+      gtk_value_set_size (value, icon_view->priv->column_spacing, icon_view);
       break;
     case PROP_MARGIN:
-      g_value_set_int (value, icon_view->priv->margin);
+      gtk_value_set_size (value, icon_view->priv->margin, icon_view);
       break;
     case PROP_REORDERABLE:
       g_value_set_boolean (value, icon_view->priv->reorderable);
@@ -2658,8 +2658,8 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
 			"focus-line-width", &focus_width,
 			NULL);
 
-  x += icon_view->priv->margin + focus_width;
-  current_width += 2 * (icon_view->priv->margin + focus_width);
+  x += gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin) + focus_width;
+  current_width += 2 * (gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin) + focus_width);
 
   items = first_item;
   while (items)
@@ -2667,9 +2667,9 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
       GtkIconViewItem *item = items->data;
 
       gtk_icon_view_calculate_item_size (icon_view, item);
-      colspan = 1 + (item->width - 1) / (item_width + icon_view->priv->column_spacing);
+      colspan = 1 + (item->width - 1) / (item_width + gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing));
 
-      item->width = colspan * item_width + (colspan - 1) * icon_view->priv->column_spacing;
+      item->width = colspan * item_width + (colspan - 1) * gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing);
 
       current_width += item->width;
 
@@ -2680,12 +2680,12 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
 	    break;
 	}
 
-      current_width += icon_view->priv->column_spacing + 2 * focus_width;
+      current_width += gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing) + 2 * focus_width;
 
       item->y = *y + focus_width;
       item->x = x;
 
-      x = current_width - (icon_view->priv->margin + focus_width); 
+      x = current_width - (gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin) + focus_width); 
 
       for (i = 0; i < icon_view->priv->n_cells; i++)
 	max_height[i] = MAX (max_height[i], item->box[i].height);
@@ -2716,8 +2716,8 @@ gtk_icon_view_layout_single_row (GtkIconView *icon_view,
       gtk_icon_view_calculate_item_size2 (icon_view, item, max_height);
 
       /* We may want to readjust the new y coordinate. */
-      if (item->y + item->height + focus_width + icon_view->priv->row_spacing > *y)
-	*y = item->y + item->height + focus_width + icon_view->priv->row_spacing;
+      if (item->y + item->height + focus_width + gtk_widget_size_to_pixel (icon_view, icon_view->priv->row_spacing) > *y)
+	*y = item->y + item->height + focus_width + gtk_widget_size_to_pixel (icon_view, icon_view->priv->row_spacing);
     }
 
   g_free (max_height);
@@ -2769,7 +2769,7 @@ gtk_icon_view_layout (GtkIconView *icon_view)
 
   widget = GTK_WIDGET (icon_view);
 
-  item_width = icon_view->priv->item_width;
+  item_width = gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width);
 
   if (item_width < 0)
     {
@@ -2783,7 +2783,7 @@ gtk_icon_view_layout (GtkIconView *icon_view)
 
 
   icons = icon_view->priv->items;
-  y += icon_view->priv->margin;
+  y += gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin);
   row = 0;
 
   if (icons)
@@ -2804,7 +2804,7 @@ gtk_icon_view_layout (GtkIconView *icon_view)
   if (maximum_width != icon_view->priv->width)
     icon_view->priv->width = maximum_width;
 
-  y += icon_view->priv->margin;
+  y += gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin);
   
   if (y != icon_view->priv->height)
     icon_view->priv->height = y;
@@ -2905,22 +2905,22 @@ adjust_wrap_width (GtkIconView     *icon_view,
 				  NULL);
 	  
 
-      if (icon_view->priv->item_width > 0)
-	item_width = icon_view->priv->item_width;
+      if (gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width) > 0)
+	item_width = gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width);
       else
 	item_width = item->width;
 
       if (item->width == -1)
         {
 	  if (item_width > 0)
-	    wrap_width = item_width - pixbuf_width - icon_view->priv->spacing;
+	    wrap_width = item_width - pixbuf_width - gtk_widget_size_to_pixel (icon_view, icon_view->priv->spacing);
 	  else
 	    wrap_width = MAX (2 * pixbuf_width, 50);
 	}
       else if (icon_view->priv->orientation == GTK_ORIENTATION_VERTICAL)
 	wrap_width = item_width;
       else
-	wrap_width = item_width - pixbuf_width - icon_view->priv->spacing;
+	wrap_width = item_width - pixbuf_width - gtk_widget_size_to_pixel (icon_view, icon_view->priv->spacing);
 
       wrap_width -= ITEM_PADDING * 2;
 
@@ -2954,7 +2954,7 @@ gtk_icon_view_calculate_item_size (GtkIconView     *icon_view,
 
   gtk_icon_view_set_cell_data (icon_view, item);
 
-  spacing = icon_view->priv->spacing;
+  spacing = gtk_widget_size_to_pixel (icon_view, icon_view->priv->spacing);
 
   item->width = 0;
   item->height = 0;
@@ -3002,7 +3002,7 @@ gtk_icon_view_calculate_item_size2 (GtkIconView     *icon_view,
 
   gtk_icon_view_set_cell_data (icon_view, item);
 
-  spacing = icon_view->priv->spacing;
+  spacing = gtk_widget_size_to_pixel (icon_view, icon_view->priv->spacing);
 
   item->height = 0;
   for (i = 0; i < icon_view->priv->n_cells; i++)
@@ -3445,8 +3445,8 @@ gtk_icon_view_get_item_at_coords (GtkIconView          *icon_view,
     {
       GtkIconViewItem *item = items->data;
 
-      if (x >= item->x - icon_view->priv->column_spacing/2 && x <= item->x + item->width + icon_view->priv->column_spacing/2 &&
-	  y >= item->y - icon_view->priv->row_spacing/2 && y <= item->y + item->height + icon_view->priv->row_spacing/2)
+      if (x >= item->x - gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing)/2 && x <= item->x + item->width + gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing)/2 &&
+	  y >= item->y - gtk_widget_size_to_pixel (icon_view, icon_view->priv->row_spacing)/2 && y <= item->y + item->height + gtk_widget_size_to_pixel (icon_view, icon_view->priv->row_spacing)/2)
 	{
 	  if (only_in_cell || cell_at_pos)
 	    {
@@ -6011,7 +6011,7 @@ gtk_icon_view_get_columns (GtkIconView *icon_view)
  */
 void 
 gtk_icon_view_set_item_width (GtkIconView *icon_view,
-			      gint         item_width)
+			      GtkSize      item_width)
 {
   g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
   
@@ -6044,6 +6044,24 @@ gtk_icon_view_get_item_width (GtkIconView *icon_view)
 {
   g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
 
+  return gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width);
+}
+
+/**
+ * gtk_icon_view_get_item_width_unit:
+ * @icon_view: a #GtkIconView
+ * 
+ * Like gtk_icon_view_get_item_width() but preserves the unit.
+ * 
+ * Return value: the width_unit of a single item, or -1
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_icon_view_get_item_width_unit (GtkIconView *icon_view)
+{
+  g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
+
   return icon_view->priv->item_width;
 }
 
@@ -6061,7 +6079,7 @@ gtk_icon_view_get_item_width (GtkIconView *icon_view)
  */
 void 
 gtk_icon_view_set_spacing (GtkIconView *icon_view,
-			   gint         spacing)
+			   GtkSize      spacing)
 {
   g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
   
@@ -6092,6 +6110,24 @@ gtk_icon_view_get_spacing (GtkIconView *icon_view)
 {
   g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
 
+  return gtk_widget_size_to_pixel (icon_view, icon_view->priv->spacing);
+}
+
+/**
+ * gtk_icon_view_get_spacing_unit:
+ * @icon_view: a #GtkIconView
+ * 
+ * Like gtk_icon_view_get_spacing() but preserves the unit.
+ * 
+ * Return value: the space between cells 
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_icon_view_get_spacing_unit (GtkIconView *icon_view)
+{
+  g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
+
   return icon_view->priv->spacing;
 }
 
@@ -6107,7 +6143,7 @@ gtk_icon_view_get_spacing (GtkIconView *icon_view)
  */
 void 
 gtk_icon_view_set_row_spacing (GtkIconView *icon_view,
-			       gint         row_spacing)
+			       GtkSize      row_spacing)
 {
   g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
   
@@ -6138,6 +6174,24 @@ gtk_icon_view_get_row_spacing (GtkIconView *icon_view)
 {
   g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
 
+  return gtk_widget_size_to_pixel (icon_view, icon_view->priv->row_spacing);
+}
+
+/**
+ * gtk_icon_view_get_row_spacing_unit:
+ * @icon_view: a #GtkIconView
+ * 
+ * Like gtk_icon_view_get_row_spacing() but preserves the unit.
+ * 
+ * Return value: the space between rows
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_icon_view_get_row_spacing_unit (GtkIconView *icon_view)
+{
+  g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
+
   return icon_view->priv->row_spacing;
 }
 
@@ -6153,7 +6207,7 @@ gtk_icon_view_get_row_spacing (GtkIconView *icon_view)
  */
 void 
 gtk_icon_view_set_column_spacing (GtkIconView *icon_view,
-				  gint         column_spacing)
+				  GtkSize      column_spacing)
 {
   g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
   
@@ -6184,6 +6238,24 @@ gtk_icon_view_get_column_spacing (GtkIconView *icon_view)
 {
   g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
 
+  return gtk_widget_size_to_pixel (icon_view, icon_view->priv->column_spacing);
+}
+
+/**
+ * gtk_icon_view_get_column_spacing_unit:
+ * @icon_view: a #GtkIconView
+ * 
+ * Like gtk_icon_view_get_column_spacing() but preserves the unit.
+ * 
+ * Return value: the space between columns
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_icon_view_get_column_spacing_unit (GtkIconView *icon_view)
+{
+  g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
+
   return icon_view->priv->column_spacing;
 }
 
@@ -6200,7 +6272,7 @@ gtk_icon_view_get_column_spacing (GtkIconView *icon_view)
  */
 void 
 gtk_icon_view_set_margin (GtkIconView *icon_view,
-			  gint         margin)
+			  GtkSize      margin)
 {
   g_return_if_fail (GTK_IS_ICON_VIEW (icon_view));
   
@@ -6231,6 +6303,24 @@ gtk_icon_view_get_margin (GtkIconView *icon_view)
 {
   g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
 
+  return gtk_widget_size_to_pixel (icon_view, icon_view->priv->margin);
+}
+
+/**
+ * gtk_icon_view_get_margin_unit:
+ * @icon_view: a #GtkIconView
+ * 
+ * Like gtk_icon_view_get_margin() but preserves the unit.
+ * 
+ * Return value: the space at the borders 
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_icon_view_get_margin_unit (GtkIconView *icon_view)
+{
+  g_return_val_if_fail (GTK_IS_ICON_VIEW (icon_view), -1);
+
   return icon_view->priv->margin;
 }
 
@@ -6409,13 +6499,13 @@ gtk_icon_view_autoscroll (GtkIconView *icon_view)
   gdk_window_get_geometry (GTK_WIDGET (icon_view)->window, &x, &y, &width, &height, NULL);
 
   /* see if we are near the edge. */
-  voffset = py - (y + 2 * SCROLL_EDGE_SIZE);
+  voffset = py - (y + 2 * gtk_widget_size_to_pixel (icon_view, SCROLL_EDGE_SIZE));
   if (voffset > 0)
-    voffset = MAX (py - (y + height - 2 * SCROLL_EDGE_SIZE), 0);
+    voffset = MAX (py - (y + height - 2 * gtk_widget_size_to_pixel (icon_view, SCROLL_EDGE_SIZE)), 0);
 
-  hoffset = px - (x + 2 * SCROLL_EDGE_SIZE);
+  hoffset = px - (x + 2 * gtk_widget_size_to_pixel (icon_view, SCROLL_EDGE_SIZE));
   if (hoffset > 0)
-    hoffset = MAX (px - (x + width - 2 * SCROLL_EDGE_SIZE), 0);
+    hoffset = MAX (px - (x + width - 2 * gtk_widget_size_to_pixel (icon_view, SCROLL_EDGE_SIZE)), 0);
 
   if (voffset != 0)
     gtk_adjustment_set_value (icon_view->priv->vadjustment,
@@ -8277,7 +8367,7 @@ gtk_icon_view_item_accessible_text_get_character_extents (AtkText      *text,
   atk_component_get_position (ATK_COMPONENT (text), x, y, coord_type);
   *x += item->item->layout_x - item->item->x + char_rect.x / PANGO_SCALE;
   /* Look at gtk_icon_view_paint_item() to see where the text is. */
-  *x -=  ((item->item->width - item->item->layout_width) / 2) + (MAX (item->item->pixbuf_width, icon_view->priv->item_width) - item->item->width) / 2,
+  *x -=  ((item->item->width - item->item->layout_width) / 2) + (MAX (item->item->pixbuf_width, gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width)) - gtk_widget_size_to_pixel (icon_view, item->item->width)) / 2,
   *y += item->item->layout_y - item->item->y + char_rect.y / PANGO_SCALE;
   *width = char_rect.width / PANGO_SCALE;
   *height = char_rect.height / PANGO_SCALE;
@@ -8313,7 +8403,7 @@ gtk_icon_view_item_accessible_text_get_offset_at_point (AtkText      *text,
   gtk_icon_view_update_item_text (icon_view, item->item);
   atk_component_get_position (ATK_COMPONENT (text), &l_x, &l_y, coord_type);
   x -= l_x + item->item->layout_x - item->item->x;
-  x +=  ((item->item->width - item->item->layout_width) / 2) + (MAX (item->item->pixbuf_width, icon_view->priv->item_width) - item->item->width) / 2,
+  x +=  ((item->item->width - item->item->layout_width) / 2) + (MAX (item->item->pixbuf_width, gtk_widget_size_to_pixel (icon_view, icon_view->priv->item_width)) - gtk_widget_size_to_pixel (icon_view, item->item->width)) / 2,
   y -= l_y + item->item->layout_y - item->item->y;
   item_text = pango_layout_get_text (icon_view->priv->layout);
   if (!pango_layout_xy_to_index (icon_view->priv->layout, 
diff --git a/gtk/gtkiconview.h b/gtk/gtkiconview.h
index 65b0588..38ab561 100644
--- a/gtk/gtkiconview.h
+++ b/gtk/gtkiconview.h
@@ -111,20 +111,25 @@ void           gtk_icon_view_set_columns       (GtkIconView    *icon_view,
 		 			        gint            columns);
 gint           gtk_icon_view_get_columns       (GtkIconView    *icon_view);
 void           gtk_icon_view_set_item_width    (GtkIconView    *icon_view,
-					        gint            item_width);
+					        GtkSize         item_width);
 gint           gtk_icon_view_get_item_width    (GtkIconView    *icon_view);
+GtkSize        gtk_icon_view_get_item_width_unit (GtkIconView    *icon_view);
 void           gtk_icon_view_set_spacing       (GtkIconView    *icon_view, 
-		 			        gint            spacing);
+		 			        GtkSize         spacing);
 gint           gtk_icon_view_get_spacing       (GtkIconView    *icon_view);
+GtkSize        gtk_icon_view_get_spacing_unit  (GtkIconView    *icon_view);
 void           gtk_icon_view_set_row_spacing   (GtkIconView    *icon_view, 
-					        gint            row_spacing);
+					        GtkSize         row_spacing);
 gint           gtk_icon_view_get_row_spacing   (GtkIconView    *icon_view);
+GtkSize        gtk_icon_view_get_row_spacing_unit (GtkIconView    *icon_view);
 void           gtk_icon_view_set_column_spacing (GtkIconView    *icon_view, 
-					        gint            column_spacing);
+                                                 GtkSize         column_spacing);
 gint           gtk_icon_view_get_column_spacing (GtkIconView    *icon_view);
+GtkSize        gtk_icon_view_get_column_spacing_unit (GtkIconView    *icon_view);
 void           gtk_icon_view_set_margin        (GtkIconView    *icon_view, 
-					        gint            margin);
+					        GtkSize         margin);
 gint           gtk_icon_view_get_margin        (GtkIconView    *icon_view);
+GtkSize        gtk_icon_view_get_margin_unit   (GtkIconView    *icon_view);
 
 
 GtkTreePath *  gtk_icon_view_get_path_at_pos   (GtkIconView     *icon_view,
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index 384c176..460a3ce 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -440,6 +440,8 @@ void              _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *c
 							    gint              *left,
 							    gint              *right);
 
+void              _gtk_cell_renderer_set_tree_view_column (GtkCellRenderer *cell,
+                                                           GtkTreeViewColumn *column);
 
 G_END_DECLS
 
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index 5078cdb..d83e6d4 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -46,11 +46,13 @@
 #include "gtkprivate.h"
 #include "gtkalias.h"
 
+#define MAKE_EVEN(x) do {x = (((x&1) == 0) ? x : x + 1);} while (0)
+
 #define GTK_TREE_VIEW_PRIORITY_VALIDATE (GDK_PRIORITY_REDRAW + 5)
 #define GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC (GTK_TREE_VIEW_PRIORITY_VALIDATE + 2)
 #define GTK_TREE_VIEW_NUM_ROWS_PER_IDLE 500
 #define SCROLL_EDGE_SIZE 15
-#define EXPANDER_EXTRA_PADDING 4
+#define EXPANDER_EXTRA_PADDING GTK_SIZE_ONE_TWELFTH_EM(4)
 #define GTK_TREE_VIEW_SEARCH_DIALOG_TIMEOUT 5000
 #define AUTO_EXPAND_TIMEOUT 500
 
@@ -205,6 +207,7 @@ static void     gtk_tree_view_grab_notify          (GtkWidget        *widget,
 						    gboolean          was_grabbed);
 static void     gtk_tree_view_state_changed        (GtkWidget        *widget,
 						    GtkStateType      previous_state);
+static void     gtk_tree_view_unit_changed         (GtkWidget        *widget);
 
 /* container signals */
 static void     gtk_tree_view_remove               (GtkContainer     *container,
@@ -546,6 +549,7 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->style_set = gtk_tree_view_style_set;
   widget_class->grab_notify = gtk_tree_view_grab_notify;
   widget_class->state_changed = gtk_tree_view_state_changed;
+  widget_class->unit_changed = gtk_tree_view_unit_changed;
 
   /* GtkContainer signals */
   container_class->remove = gtk_tree_view_remove;
@@ -730,13 +734,11 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
      */
     g_object_class_install_property (o_class,
 				     PROP_LEVEL_INDENTATION,
-				     g_param_spec_int ("level-indentation",
-						       P_("Level Indentation"),
-						       P_("Extra indentation for each level"),
-						       0,
-						       G_MAXINT,
-						       0,
-						       GTK_PARAM_READWRITE));
+				     gtk_param_spec_size ("level-indentation",
+                                                          P_("Level Indentation"),
+                                                          P_("Extra indentation for each level"),
+                                                          0, G_MAXINT, 0,
+                                                          GTK_PARAM_READWRITE));
 
     g_object_class_install_property (o_class,
                                      PROP_RUBBER_BANDING,
@@ -774,36 +776,30 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
 						       GTK_PARAM_READWRITE));
 
   /* Style properties */
-#define _TREE_VIEW_EXPANDER_SIZE 12
+#define _TREE_VIEW_EXPANDER_SIZE GTK_SIZE_ONE_TWELFTH_EM(12)
 #define _TREE_VIEW_VERTICAL_SEPARATOR 2
 #define _TREE_VIEW_HORIZONTAL_SEPARATOR 2
 
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("expander-size",
-							     P_("Expander Size"),
-							     P_("Size of the expander arrow"),
-							     0,
-							     G_MAXINT,
-							     _TREE_VIEW_EXPANDER_SIZE,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("expander-size",
+                                                                P_("Expander Size"),
+                                                                P_("Size of the expander arrow"),
+                                                                0, G_MAXINT, _TREE_VIEW_EXPANDER_SIZE,
+                                                                GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("vertical-separator",
-							     P_("Vertical Separator Width"),
-							     P_("Vertical space between cells.  Must be an even number"),
-							     0,
-							     G_MAXINT,
-							     _TREE_VIEW_VERTICAL_SEPARATOR,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("vertical-separator",
+                                                                P_("Vertical Separator Width"),
+                                                                P_("Vertical space between cells.  Must be an even number"),
+                                                                0, G_MAXINT, _TREE_VIEW_VERTICAL_SEPARATOR,
+                                                                GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("horizontal-separator",
-							     P_("Horizontal Separator Width"),
-							     P_("Horizontal space between cells.  Must be an even number"),
-							     0,
-							     G_MAXINT,
-							     _TREE_VIEW_HORIZONTAL_SEPARATOR,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("horizontal-separator",
+                                                                P_("Horizontal Separator Width"),
+                                                                P_("Horizontal space between cells.  Must be an even number"),
+                                                                0, G_MAXINT, _TREE_VIEW_HORIZONTAL_SEPARATOR,
+                                                                GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
 					   g_param_spec_boolean ("allow-rules",
@@ -841,18 +837,18 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
 								 GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("grid-line-width",
-							     P_("Grid line width"),
-							     P_("Width, in pixels, of the tree view grid lines"),
-							     0, G_MAXINT, 1,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("grid-line-width",
+                                                                P_("Grid line width"),
+                                                                P_("Width, in pixels, of the tree view grid lines"),
+                                                                0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (1),
+                                                                GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
-					   g_param_spec_int ("tree-line-width",
-							     P_("Tree line width"),
-							     P_("Width, in pixels, of the tree view lines"),
-							     0, G_MAXINT, 1,
-							     GTK_PARAM_READABLE));
+					   gtk_param_spec_size ("tree-line-width",
+                                                                P_("Tree line width"),
+                                                                P_("Width, in pixels, of the tree view lines"),
+                                                                0, G_MAXINT, GTK_SIZE_ONE_TWELFTH_EM (1),
+                                                                GTK_PARAM_READABLE));
 
   gtk_widget_class_install_style_property (widget_class,
 					   g_param_spec_string ("grid-line-pattern",
@@ -1443,7 +1439,7 @@ gtk_tree_view_set_property (GObject         *object,
       gtk_tree_view_set_show_expanders (tree_view, g_value_get_boolean (value));
       break;
     case PROP_LEVEL_INDENTATION:
-      tree_view->priv->level_indentation = g_value_get_int (value);
+      tree_view->priv->level_indentation = gtk_value_get_size (value);
       break;
     case PROP_RUBBER_BANDING:
       tree_view->priv->rubber_banding_enable = g_value_get_boolean (value);
@@ -1518,7 +1514,7 @@ gtk_tree_view_get_property (GObject    *object,
       g_value_set_boolean (value, GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_SHOW_EXPANDERS));
       break;
     case PROP_LEVEL_INDENTATION:
-      g_value_set_int (value, tree_view->priv->level_indentation);
+      gtk_value_set_size (value, tree_view->priv->level_indentation, tree_view);
       break;
     case PROP_RUBBER_BANDING:
       g_value_set_boolean (value, tree_view->priv->rubber_banding_enable);
@@ -1856,6 +1852,8 @@ gtk_tree_view_realize (GtkWidget *widget)
   gtk_tree_view_set_grid_lines (tree_view, tree_view->priv->grid_lines);
   gtk_tree_view_set_enable_tree_lines (tree_view, tree_view->priv->tree_lines_enabled);
 
+  gtk_tree_view_unit_changed (widget);
+
   install_presize_handler (tree_view); 
 }
 
@@ -2011,7 +2009,7 @@ gtk_tree_view_update_size (GtkTreeView *tree_view)
 	}
       else if (column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
 	{
-	  real_requested_width = column->fixed_width;
+	  real_requested_width = gtk_widget_size_to_pixel (tree_view, column->fixed_width);
 	}
       else if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
 	{
@@ -2023,9 +2021,9 @@ gtk_tree_view_update_size (GtkTreeView *tree_view)
 	}
 
       if (column->min_width != -1)
-	real_requested_width = MAX (real_requested_width, column->min_width);
+	real_requested_width = MAX (real_requested_width, gtk_widget_size_to_pixel (tree_view, column->min_width));
       if (column->max_width != -1)
-	real_requested_width = MIN (real_requested_width, column->max_width);
+	real_requested_width = MIN (real_requested_width, gtk_widget_size_to_pixel (tree_view, column->max_width));
 
       tree_view->priv->width += real_requested_width;
     }
@@ -2136,7 +2134,7 @@ gtk_tree_view_get_real_requested_width_from_column (GtkTreeView       *tree_view
     }
   else if (column->column_type == GTK_TREE_VIEW_COLUMN_FIXED)
     {
-      real_requested_width = column->fixed_width;
+      real_requested_width = gtk_widget_size_to_pixel (tree_view, column->fixed_width);
     }
   else if (GTK_TREE_VIEW_FLAG_SET (tree_view, GTK_TREE_VIEW_HEADERS_VISIBLE))
     {
@@ -2150,9 +2148,9 @@ gtk_tree_view_get_real_requested_width_from_column (GtkTreeView       *tree_view
     }
 
   if (column->min_width != -1)
-    real_requested_width = MAX (real_requested_width, column->min_width);
+    real_requested_width = MAX (real_requested_width, gtk_widget_size_to_pixel (tree_view, column->min_width));
   if (column->max_width != -1)
-    real_requested_width = MIN (real_requested_width, column->max_width);
+    real_requested_width = MIN (real_requested_width, gtk_widget_size_to_pixel (tree_view, column->max_width));
 
   return real_requested_width;
 }
@@ -2520,6 +2518,8 @@ gtk_tree_view_button_press (GtkWidget      *widget,
 			"vertical-separator", &vertical_separator,
 			"horizontal-separator", &horizontal_separator,
 			NULL);
+  MAKE_EVEN (vertical_separator);
+  MAKE_EVEN (horizontal_separator);
 
 
   /* Because grab_focus can cause reentrancy, we delay grab_focus until after
@@ -2630,8 +2630,8 @@ gtk_tree_view_button_press (GtkWidget      *widget,
 	  if (gtk_tree_view_is_expander_column (tree_view, column))
 	    {
 	      if (!rtl)
-		cell_area.x += (depth - 1) * tree_view->priv->level_indentation;
-	      cell_area.width -= (depth - 1) * tree_view->priv->level_indentation;
+		cell_area.x += (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
+	      cell_area.width -= (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 
               if (TREE_VIEW_DRAW_EXPANDERS (tree_view))
 	        {
@@ -3578,7 +3578,7 @@ gtk_tree_view_motion_resize_column (GtkWidget      *widget,
   new_width = gtk_tree_view_new_column_width (tree_view,
 					      tree_view->priv->drag_pos, &x);
   if (x != tree_view->priv->x_drag &&
-      (new_width != column->fixed_width))
+      (new_width != gtk_widget_size_to_pixel (tree_view, column->fixed_width)))
     {
       column->use_resized_width = TRUE;
       column->resized_width = new_width;
@@ -4245,6 +4245,8 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
 			"focus-line-width", &focus_line_width,
 			"row-ending-details", &row_ending_details,
 			NULL);
+  MAKE_EVEN (vertical_separator);
+  MAKE_EVEN (horizontal_separator);
 
   if (tree_view->priv->tree == NULL)
     {
@@ -4653,8 +4655,8 @@ gtk_tree_view_bin_expose (GtkWidget      *widget,
 	  if (gtk_tree_view_is_expander_column (tree_view, column))
 	    {
 	      if (!rtl)
-		cell_area.x += (depth - 1) * tree_view->priv->level_indentation;
-	      cell_area.width -= (depth - 1) * tree_view->priv->level_indentation;
+		cell_area.x += (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
+	      cell_area.width -= (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 
               if (TREE_VIEW_DRAW_EXPANDERS(tree_view))
 	        {
@@ -5279,12 +5281,12 @@ gtk_tree_view_key_press (GtkWidget   *widget,
                 column->resized_width = MAX (column->button->requisition.width,
                                              column->resized_width);
               else
-                column->resized_width = MAX (column->min_width,
+                column->resized_width = MAX (gtk_widget_size_to_pixel (tree_view, column->min_width),
                                              column->resized_width);
 
               if (column->max_width != -1)
                 column->resized_width = MIN (column->resized_width,
-                                             column->max_width);
+                                             gtk_widget_size_to_pixel (tree_view, column->max_width));
 
               column->use_resized_width = TRUE;
 
@@ -5304,7 +5306,7 @@ gtk_tree_view_key_press (GtkWidget   *widget,
 
               if (column->max_width != -1)
                 column->resized_width = MIN (column->resized_width,
-                                             column->max_width);
+                                             gtk_widget_size_to_pixel (tree_view, column->max_width));
 
               column->use_resized_width = TRUE;
 
@@ -5608,6 +5610,8 @@ validate_row (GtkTreeView *tree_view,
                         "wide-separators",  &wide_separators,
                         "separator-height", &separator_height,
 			NULL);
+  MAKE_EVEN (vertical_separator);
+  MAKE_EVEN (horizontal_separator);
   
   draw_vgrid_lines =
     tree_view->priv->grid_lines == GTK_TREE_VIEW_GRID_LINES_VERTICAL
@@ -5662,7 +5666,7 @@ validate_row (GtkTreeView *tree_view,
 
       if (gtk_tree_view_is_expander_column (tree_view, column))
         {
-	  tmp_width = tmp_width + horizontal_separator + (depth - 1) * tree_view->priv->level_indentation;
+	  tmp_width = tmp_width + horizontal_separator + (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 
 	  if (TREE_VIEW_DRAW_EXPANDERS (tree_view))
 	    tmp_width += depth * tree_view->priv->expander_size;
@@ -7931,7 +7935,7 @@ gtk_tree_view_style_set (GtkWidget *widget,
   gtk_widget_style_get (widget,
 			"expander-size", &tree_view->priv->expander_size,
 			NULL);
-  tree_view->priv->expander_size += EXPANDER_EXTRA_PADDING;
+  tree_view->priv->expander_size += gtk_widget_size_to_pixel (tree_view, EXPANDER_EXTRA_PADDING);
 
   for (list = tree_view->priv->columns; list; list = list->next)
     {
@@ -8803,7 +8807,7 @@ gtk_tree_view_discover_dirty_iter (GtkTreeView *tree_view,
 	{
 	  int tmp = 0;
 
-	  tmp = horizontal_separator + width + (depth - 1) * tree_view->priv->level_indentation;
+	  tmp = horizontal_separator + width + (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 	  if (TREE_VIEW_DRAW_EXPANDERS (tree_view))
 	    tmp += depth * tree_view->priv->expander_size;
 
@@ -9495,7 +9499,8 @@ gtk_tree_view_draw_arrow (GtkTreeView *tree_view,
   gtk_widget_style_get (GTK_WIDGET (tree_view),
 			"vertical-separator", &vertical_separator,
 			NULL);
-  expander_size = tree_view->priv->expander_size - EXPANDER_EXTRA_PADDING;
+  MAKE_EVEN (vertical_separator);
+  expander_size = tree_view->priv->expander_size - gtk_widget_size_to_pixel (tree_view, EXPANDER_EXTRA_PADDING);
 
   if (! GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_PARENT))
     return;
@@ -9779,6 +9784,7 @@ gtk_tree_view_move_cursor_page_up_down (GtkTreeView *tree_view,
     return;
 
   gtk_widget_style_get (GTK_WIDGET (tree_view), "vertical-separator", &vertical_separator, NULL);
+  MAKE_EVEN (vertical_separator);
   _gtk_tree_view_find_node (tree_view, old_cursor_path,
 			    &cursor_tree, &cursor_node);
 
@@ -10357,7 +10363,7 @@ gtk_tree_view_ensure_interactive_directory (GtkTreeView *tree_view)
   vbox = gtk_vbox_new (FALSE, 0);
   gtk_widget_show (vbox);
   gtk_container_add (GTK_CONTAINER (frame), vbox);
-  gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), GTK_SIZE_ONE_TWELFTH_EM (3));
 
   /* add entry */
   tree_view->priv->search_entry = gtk_entry_new ();
@@ -10494,10 +10500,10 @@ gtk_tree_view_new_column_width (GtkTreeView *tree_view,
     width = MAX (column->button->requisition.width,
 		 width);
   else
-    width = MAX (column->min_width,
+    width = MAX (gtk_widget_size_to_pixel (tree_view, column->min_width),
 		 width);
   if (column->max_width != -1)
-    width = MIN (width, column->max_width);
+    width = MIN (width, gtk_widget_size_to_pixel (tree_view, column->max_width));
 
   *x = rtl ? (column->button->allocation.x + column->button->allocation.width - width) : (column->button->allocation.x + width);
  
@@ -12898,6 +12904,8 @@ gtk_tree_view_get_cell_area (GtkTreeView        *tree_view,
 			"vertical-separator", &vertical_separator,
 			"horizontal-separator", &horizontal_separator,
 			NULL);
+  MAKE_EVEN (vertical_separator);
+  MAKE_EVEN (horizontal_separator);
 
   rect->x = 0;
   rect->y = 0;
@@ -12930,8 +12938,8 @@ gtk_tree_view_get_cell_area (GtkTreeView        *tree_view,
 	  rtl = gtk_widget_get_direction (GTK_WIDGET (tree_view)) == GTK_TEXT_DIR_RTL;
 
 	  if (!rtl)
-	    rect->x += (depth - 1) * tree_view->priv->level_indentation;
-	  rect->width -= (depth - 1) * tree_view->priv->level_indentation;
+	    rect->x += (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
+	  rect->width -= (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 
 	  if (TREE_VIEW_DRAW_EXPANDERS (tree_view))
 	    {
@@ -13795,6 +13803,7 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
       gtk_widget_style_get (widget,
 			    "vertical-separator", &vertical_separator,
 			    NULL);
+      MAKE_EVEN (vertical_separator);
 
       cell_area = background_area;
 
@@ -13804,8 +13813,8 @@ gtk_tree_view_create_row_drag_icon (GtkTreeView  *tree_view,
       if (gtk_tree_view_is_expander_column (tree_view, column))
         {
 	  if (!rtl)
-	    cell_area.x += (depth - 1) * tree_view->priv->level_indentation;
-	  cell_area.width -= (depth - 1) * tree_view->priv->level_indentation;
+	    cell_area.x += (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
+	  cell_area.width -= (depth - 1) * gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
 
           if (TREE_VIEW_DRAW_EXPANDERS(tree_view))
 	    {
@@ -15355,7 +15364,7 @@ gtk_tree_view_get_show_expanders (GtkTreeView *tree_view)
  */
 void
 gtk_tree_view_set_level_indentation (GtkTreeView *tree_view,
-				     gint         indentation)
+				     GtkSize      indentation)
 {
   tree_view->priv->level_indentation = indentation;
 
@@ -15379,6 +15388,25 @@ gtk_tree_view_get_level_indentation (GtkTreeView *tree_view)
 {
   g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), 0);
 
+  return gtk_widget_size_to_pixel (tree_view, tree_view->priv->level_indentation);
+}
+
+/**
+ * gtk_tree_view_get_level_indentation_unit:
+ * @tree_view: a #GtkTreeView.
+ *
+ * Like gtk_tree_view_get_level_indentation() but preserves the unit.
+ *
+ * Return value: the amount of extra indentation for child levels in
+ * @tree_view.  A return value of 0 means that this feature is disabled.
+ *
+ * Since: 2.14
+ */
+GtkSize
+gtk_tree_view_get_level_indentation_unit (GtkTreeView *tree_view)
+{
+  g_return_val_if_fail (GTK_IS_TREE_VIEW (tree_view), 0);
+
   return tree_view->priv->level_indentation;
 }
 
@@ -15696,5 +15724,39 @@ gtk_tree_view_get_tooltip_column (GtkTreeView *tree_view)
   return tree_view->priv->tooltip_column;
 }
 
+static void
+gtk_tree_view_unit_changed (GtkWidget *widget)
+{
+  GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
+  GtkTreeViewPrivate *priv = tree_view->priv;
+  GList *l;
+
+  /* must chain up */
+  if (GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unit_changed != NULL)
+    GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->unit_changed (widget);
+
+  /* no need to do this unless we're realized since our realize method does this too */
+  if (!GTK_WIDGET_REALIZED (widget))
+    return;
+
+  gtk_widget_style_get (widget,
+			"expander-size", &tree_view->priv->expander_size,
+			NULL);
+  tree_view->priv->expander_size += gtk_widget_size_to_pixel (tree_view, EXPANDER_EXTRA_PADDING);
+
+  /* rows in the column possibly changed size; mark them as dirty */
+  for (l = priv->columns; l != NULL; l = l->next)
+    {
+      GtkTreeViewColumn *tree_column = GTK_TREE_VIEW_COLUMN (l->data);
+      _gtk_tree_view_column_cell_set_dirty (tree_column, FALSE);
+    }
+
+  do_presize_handler (tree_view);
+  while (validate_rows (tree_view))
+    ;
+
+  gtk_widget_queue_resize (GTK_WIDGET (tree_view));
+}
+
 #define __GTK_TREE_VIEW_C__
 #include "gtkaliasdef.c"
diff --git a/gtk/gtktreeview.h b/gtk/gtktreeview.h
index 098ab5c..fb24055 100644
--- a/gtk/gtktreeview.h
+++ b/gtk/gtktreeview.h
@@ -404,6 +404,7 @@ gboolean                    gtk_tree_view_get_show_expanders     (GtkTreeView
 void                        gtk_tree_view_set_level_indentation  (GtkTreeView                *tree_view,
 								  gint                        indentation);
 gint                        gtk_tree_view_get_level_indentation  (GtkTreeView                *tree_view);
+GtkSize                     gtk_tree_view_get_level_indentation_unit (GtkTreeView            *tree_view);
 
 /* Convenience functions for setting tooltips */
 void          gtk_tree_view_set_tooltip_row    (GtkTreeView       *tree_view,
diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c
index 24f99e4..015369c 100644
--- a/gtk/gtktreeviewcolumn.c
+++ b/gtk/gtktreeviewcolumn.c
@@ -212,13 +212,11 @@ gtk_tree_view_column_class_init (GtkTreeViewColumnClass *class)
 						     GTK_PARAM_READABLE));
   g_object_class_install_property (object_class,
                                    PROP_SPACING,
-                                   g_param_spec_int ("spacing",
-						     P_("Spacing"),
-						     P_("Space which is inserted between cells"),
-						     0,
-						     G_MAXINT,
-						     0,
-						     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("spacing",
+                                                        P_("Spacing"),
+                                                        P_("Space which is inserted between cells"),
+                                                        0, G_MAXINT, 0,
+                                                        GTK_PARAM_READWRITE));
   g_object_class_install_property (object_class,
                                    PROP_SIZING,
                                    g_param_spec_enum ("sizing",
@@ -230,33 +228,27 @@ gtk_tree_view_column_class_init (GtkTreeViewColumnClass *class)
   
   g_object_class_install_property (object_class,
                                    PROP_FIXED_WIDTH,
-                                   g_param_spec_int ("fixed-width",
-                                                     P_("Fixed Width"),
-                                                     P_("Current fixed width of the column"),
-                                                     1,
-                                                     G_MAXINT,
-                                                     1, /* not useful */
-                                                     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("fixed-width",
+                                                        P_("Fixed Width"),
+                                                        P_("Current fixed width of the column"),
+                                                        0, G_MAXINT, 1, /* not useful */
+                                                        GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
                                    PROP_MIN_WIDTH,
-                                   g_param_spec_int ("min-width",
-                                                     P_("Minimum Width"),
-                                                     P_("Minimum allowed width of the column"),
-                                                     -1,
-                                                     G_MAXINT,
-                                                     -1,
-                                                     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("min-width",
+                                                        P_("Minimum Width"),
+                                                        P_("Minimum allowed width of the column"),
+                                                        -1, G_MAXINT, -1,
+                                                        GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
                                    PROP_MAX_WIDTH,
-                                   g_param_spec_int ("max-width",
-                                                     P_("Maximum Width"),
-                                                     P_("Maximum allowed width of the column"),
-                                                     -1,
-                                                     G_MAXINT,
-                                                     -1,
-                                                     GTK_PARAM_READWRITE));
+                                   gtk_param_spec_size ("max-width",
+                                                        P_("Maximum Width"),
+                                                        P_("Maximum allowed width of the column"),
+                                                        -1, G_MAXINT, -1,
+                                                        GTK_PARAM_READWRITE));
 
   g_object_class_install_property (object_class,
                                    PROP_TITLE,
@@ -439,22 +431,22 @@ gtk_tree_view_column_set_property (GObject         *object,
 
     case PROP_FIXED_WIDTH:
       gtk_tree_view_column_set_fixed_width (tree_column,
-					    g_value_get_int (value));
+					    gtk_value_get_size (value));
       break;
 
     case PROP_MIN_WIDTH:
       gtk_tree_view_column_set_min_width (tree_column,
-                                          g_value_get_int (value));
+                                          gtk_value_get_size (value));
       break;
 
     case PROP_MAX_WIDTH:
       gtk_tree_view_column_set_max_width (tree_column,
-                                          g_value_get_int (value));
+                                          gtk_value_get_size (value));
       break;
 
     case PROP_SPACING:
       gtk_tree_view_column_set_spacing (tree_column,
-					g_value_get_int (value));
+					gtk_value_get_size (value));
       break;
 
     case PROP_TITLE:
@@ -531,8 +523,8 @@ gtk_tree_view_column_get_property (GObject         *object,
       break;
 
     case PROP_SPACING:
-      g_value_set_int (value,
-                       gtk_tree_view_column_get_spacing (tree_column));
+      gtk_value_set_size (value,
+                          gtk_tree_view_column_get_spacing_unit (tree_column), tree_column->tree_view);
       break;
 
     case PROP_SIZING:
@@ -541,18 +533,18 @@ gtk_tree_view_column_get_property (GObject         *object,
       break;
 
     case PROP_FIXED_WIDTH:
-      g_value_set_int (value,
-                       gtk_tree_view_column_get_fixed_width (tree_column));
+      gtk_value_set_size (value,
+                          gtk_tree_view_column_get_fixed_width_unit (tree_column), tree_column->tree_view);
       break;
 
     case PROP_MIN_WIDTH:
-      g_value_set_int (value,
-                       gtk_tree_view_column_get_min_width (tree_column));
+      gtk_value_set_size (value,
+                          gtk_tree_view_column_get_min_width_unit (tree_column), tree_column->tree_view);
       break;
 
     case PROP_MAX_WIDTH:
-      g_value_set_int (value,
-                       gtk_tree_view_column_get_max_width (tree_column));
+      gtk_value_set_size (value,
+                          gtk_tree_view_column_get_max_width_unit (tree_column), tree_column->tree_view);
       break;
 
     case PROP_TITLE:
@@ -626,6 +618,8 @@ gtk_tree_view_column_cell_layout_pack_start (GtkCellLayout   *cell_layout,
   cell_info->attributes = NULL;
 
   column->cell_list = g_list_append (column->cell_list, cell_info);
+
+  _gtk_cell_renderer_set_tree_view_column (cell, column);
 }
 
 static void
@@ -650,6 +644,8 @@ gtk_tree_view_column_cell_layout_pack_end (GtkCellLayout   *cell_layout,
   cell_info->attributes = NULL;
 
   column->cell_list = g_list_append (column->cell_list, cell_info);
+
+  _gtk_cell_renderer_set_tree_view_column (cell, column);
 }
 
 static void
@@ -825,7 +821,7 @@ gtk_tree_view_column_create_button (GtkTreeViewColumn *tree_column)
 
   tree_column->alignment = gtk_alignment_new (tree_column->xalign, 0.5, 0.0, 0.0);
 
-  hbox = gtk_hbox_new (FALSE, 2);
+  hbox = gtk_hbox_new (FALSE, GTK_SIZE_ONE_TWELFTH_EM (2));
   tree_column->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN);
 
   if (tree_column->child)
@@ -1698,7 +1694,7 @@ gtk_tree_view_column_clear_attributes (GtkTreeViewColumn *tree_column,
  **/
 void
 gtk_tree_view_column_set_spacing (GtkTreeViewColumn *tree_column,
-				  gint               spacing)
+				  GtkSize            spacing)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
   g_return_if_fail (spacing >= 0);
@@ -1724,6 +1720,24 @@ gtk_tree_view_column_get_spacing (GtkTreeViewColumn *tree_column)
 {
   g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
 
+  return gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing);
+}
+
+/**
+ * gtk_tree_view_column_get_spacing_unit:
+ * @tree_column: A #GtkTreeViewColumn.
+ * 
+ * Like gtk_tree_view_column_get_spacing() but preserve the unit.
+ * 
+ * Return value: the spacing of @tree_column.
+ *
+ * Since: 2.14
+ **/
+GtkSize
+gtk_tree_view_column_get_spacing_unit (GtkTreeViewColumn *tree_column)
+{
+  g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
+
   return tree_column->spacing;
 }
 
@@ -1902,7 +1916,7 @@ gtk_tree_view_column_get_width (GtkTreeViewColumn *tree_column)
  **/
 void
 gtk_tree_view_column_set_fixed_width (GtkTreeViewColumn *tree_column,
-				      gint               fixed_width)
+				      GtkSize            fixed_width)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
   g_return_if_fail (fixed_width > 0);
@@ -1934,6 +1948,24 @@ gtk_tree_view_column_get_fixed_width (GtkTreeViewColumn *tree_column)
 {
   g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
 
+  return gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->fixed_width);
+}
+
+/**
+ * gtk_tree_view_column_get_fixed_width_unit:
+ * @tree_column: a #GtkTreeViewColumn
+ * 
+ * Like gtk_tree_view_column_get_fixed_width() but preserves the unit.
+ * 
+ * Return value: the fixed width of the column
+ *
+ * Since: 2.14
+ **/
+GtkSize
+gtk_tree_view_column_get_fixed_width_unit (GtkTreeViewColumn *tree_column)
+{
+  g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), 0);
+
   return tree_column->fixed_width;
 }
 
@@ -1947,7 +1979,7 @@ gtk_tree_view_column_get_fixed_width (GtkTreeViewColumn *tree_column)
  **/
 void
 gtk_tree_view_column_set_min_width (GtkTreeViewColumn *tree_column,
-				    gint               min_width)
+				    GtkSize            min_width)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
   g_return_if_fail (min_width >= -1);
@@ -1959,13 +1991,13 @@ gtk_tree_view_column_set_min_width (GtkTreeViewColumn *tree_column,
       tree_column->tree_view != NULL &&
       GTK_WIDGET_REALIZED (tree_column->tree_view))
     {
-      if (min_width > tree_column->width)
+      if (gtk_widget_size_to_pixel (tree_column->tree_view, min_width) > tree_column->width)
 	gtk_widget_queue_resize (tree_column->tree_view);
     }
 
   tree_column->min_width = min_width;
   g_object_freeze_notify (G_OBJECT (tree_column));
-  if (tree_column->max_width != -1 && tree_column->max_width < min_width)
+  if (tree_column->max_width != -1 && gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->max_width) < gtk_widget_size_to_pixel (tree_column->tree_view, min_width))
     {
       tree_column->max_width = min_width;
       g_object_notify (G_OBJECT (tree_column), "max-width");
@@ -1992,6 +2024,24 @@ gtk_tree_view_column_get_min_width (GtkTreeViewColumn *tree_column)
 {
   g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
 
+  return gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->min_width);
+}
+
+/**
+ * gtk_tree_view_column_get_min_width_unit:
+ * @tree_column: A #GtkTreeViewColumn.
+ * 
+ * Like gtk_tree_view_column_get_min_width() but preserves the unit.
+ * 
+ * Return value: The minimum width of the @tree_column.
+ *
+ * Since: 2.14
+ **/
+GtkSize
+gtk_tree_view_column_get_min_width_unit (GtkTreeViewColumn *tree_column)
+{
+  g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
+
   return tree_column->min_width;
 }
 
@@ -2007,7 +2057,7 @@ gtk_tree_view_column_get_min_width (GtkTreeViewColumn *tree_column)
  **/
 void
 gtk_tree_view_column_set_max_width (GtkTreeViewColumn *tree_column,
-				    gint               max_width)
+				    GtkSize            max_width)
 {
   g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
   g_return_if_fail (max_width >= -1);
@@ -2019,13 +2069,13 @@ gtk_tree_view_column_set_max_width (GtkTreeViewColumn *tree_column,
       tree_column->tree_view != NULL &&
       GTK_WIDGET_REALIZED (tree_column->tree_view))
     {
-      if (max_width != -1 && max_width < tree_column->width)
+      if (max_width != -1 && gtk_widget_size_to_pixel (tree_column->tree_view, max_width) < tree_column->width)
 	gtk_widget_queue_resize (tree_column->tree_view);
     }
 
   tree_column->max_width = max_width;
   g_object_freeze_notify (G_OBJECT (tree_column));
-  if (max_width != -1 && max_width < tree_column->min_width)
+  if (max_width != -1 && gtk_widget_size_to_pixel (tree_column->tree_view, max_width) < gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->min_width))
     {
       tree_column->min_width = max_width;
       g_object_notify (G_OBJECT (tree_column), "min-width");
@@ -2052,6 +2102,24 @@ gtk_tree_view_column_get_max_width (GtkTreeViewColumn *tree_column)
 {
   g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
 
+  return gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->max_width);
+}
+
+/**
+ * gtk_tree_view_column_get_max_width_unit:
+ * @tree_column: A #GtkTreeViewColumn.
+ * 
+ * Like gtk_tree_view_column_get_max_width() but preserves the unit.
+ * 
+ * Return value: The maximum width of the @tree_column.
+ *
+ * Since: 2.14
+ **/
+GtkSize
+gtk_tree_view_column_get_max_width_unit (GtkTreeViewColumn *tree_column)
+{
+  g_return_val_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column), -1);
+
   return tree_column->max_width;
 }
 
@@ -2585,6 +2653,7 @@ gtk_tree_view_column_cell_get_size (GtkTreeViewColumn  *tree_column,
   GList *list;
   gboolean first_cell = TRUE;
   gint focus_line_width;
+  gint spacing_pixels;
 
   g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (tree_column));
 
@@ -2594,6 +2663,8 @@ gtk_tree_view_column_cell_get_size (GtkTreeViewColumn  *tree_column,
     * width = 0;
 
   gtk_widget_style_get (tree_column->tree_view, "focus-line-width", &focus_line_width, NULL);
+
+  spacing_pixels = gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing);
   
   for (list = tree_column->cell_list; list; list = list->next)
     {
@@ -2607,7 +2678,7 @@ gtk_tree_view_column_cell_get_size (GtkTreeViewColumn  *tree_column,
 	continue;
 
       if (first_cell == FALSE && width)
-	*width += tree_column->spacing;
+	*width += spacing_pixels;
 
       gtk_cell_renderer_get_size (info->cell,
 				  tree_column->tree_view,
@@ -2736,7 +2807,7 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
       full_requested_width += info->requested_width;
 
       if (!first_cell)
-	full_requested_width += tree_column->spacing;
+	full_requested_width += gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing);
 
       first_cell = FALSE;
     }
@@ -2915,8 +2986,8 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
 
       flags &= ~GTK_CELL_RENDERER_FOCUSED;
 
-      real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + tree_column->spacing);
-      real_background_area.x += real_background_area.width + tree_column->spacing;
+      real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing));
+      real_background_area.x += real_background_area.width + gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing);
 
       /* Only needed for first cell */
       depth = 0;
@@ -3079,8 +3150,8 @@ gtk_tree_view_column_cell_process_action (GtkTreeViewColumn  *tree_column,
 
       flags &= ~GTK_CELL_RENDERER_FOCUSED;
 
-      real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + tree_column->spacing);
-      real_background_area.x += (real_background_area.width + tree_column->spacing);
+      real_cell_area.x += (real_cell_area.width + 2 * focus_line_width + gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing));
+      real_background_area.x += (real_background_area.width + gtk_widget_size_to_pixel (tree_column->tree_view, tree_column->spacing));
 
       /* Only needed for first cell */
       depth = 0;
@@ -3641,7 +3712,7 @@ _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
 	break;
       
       if (info->cell->visible)
-	l += info->real_width + column->spacing;
+	l += info->real_width + gtk_widget_size_to_pixel (column->tree_view, column->spacing);
     }
 
   while (list)
@@ -3651,7 +3722,7 @@ _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *column,
       list = gtk_tree_view_column_cell_next (column, list);
 
       if (info->cell->visible)
-	r += info->real_width + column->spacing;
+	r += info->real_width + gtk_widget_size_to_pixel (column->tree_view, column->spacing);
     }
 
   rtl = (gtk_widget_get_direction (GTK_WIDGET (column->tree_view)) == GTK_TEXT_DIR_RTL);
diff --git a/gtk/gtktreeviewcolumn.h b/gtk/gtktreeviewcolumn.h
index 9238a62..343aae6 100644
--- a/gtk/gtktreeviewcolumn.h
+++ b/gtk/gtktreeviewcolumn.h
@@ -49,7 +49,6 @@ typedef enum
   GTK_TREE_VIEW_COLUMN_FIXED
 } GtkTreeViewColumnSizing;
 
-typedef struct _GtkTreeViewColumn      GtkTreeViewColumn;
 typedef struct _GtkTreeViewColumnClass GtkTreeViewColumnClass;
 
 typedef void (* GtkTreeCellDataFunc) (GtkTreeViewColumn *tree_column,
@@ -72,7 +71,7 @@ struct _GtkTreeViewColumn
   GtkCellEditable *GSEAL (editable_widget);
   gfloat GSEAL (xalign);
   guint GSEAL (property_changed_signal);
-  gint GSEAL (spacing);
+  GtkSize GSEAL (spacing);
 
   /* Sizing fields */
   /* see gtk+/doc/tree-column-sizing.txt for more information on them */
@@ -81,9 +80,9 @@ struct _GtkTreeViewColumn
   gint GSEAL (button_request);
   gint GSEAL (resized_width);
   gint GSEAL (width);
-  gint GSEAL (fixed_width);
-  gint GSEAL (min_width);
-  gint GSEAL (max_width);
+  GtkSize GSEAL (fixed_width);
+  GtkSize GSEAL (min_width);
+  GtkSize GSEAL (max_width);
 
   /* dragging columns */
   gint GSEAL (drag_x);
@@ -151,8 +150,9 @@ void                    gtk_tree_view_column_set_cell_data_func  (GtkTreeViewCol
 void                    gtk_tree_view_column_clear_attributes    (GtkTreeViewColumn       *tree_column,
 								  GtkCellRenderer         *cell_renderer);
 void                    gtk_tree_view_column_set_spacing         (GtkTreeViewColumn       *tree_column,
-								  gint                     spacing);
+								  GtkSize                  spacing);
 gint                    gtk_tree_view_column_get_spacing         (GtkTreeViewColumn       *tree_column);
+GtkSize                 gtk_tree_view_column_get_spacing_unit    (GtkTreeViewColumn       *tree_column);
 void                    gtk_tree_view_column_set_visible         (GtkTreeViewColumn       *tree_column,
 								  gboolean                 visible);
 gboolean                gtk_tree_view_column_get_visible         (GtkTreeViewColumn       *tree_column);
@@ -164,14 +164,17 @@ void                    gtk_tree_view_column_set_sizing          (GtkTreeViewCol
 GtkTreeViewColumnSizing gtk_tree_view_column_get_sizing          (GtkTreeViewColumn       *tree_column);
 gint                    gtk_tree_view_column_get_width           (GtkTreeViewColumn       *tree_column);
 gint                    gtk_tree_view_column_get_fixed_width     (GtkTreeViewColumn       *tree_column);
+GtkSize                 gtk_tree_view_column_get_fixed_width_unit(GtkTreeViewColumn       *tree_column);
 void                    gtk_tree_view_column_set_fixed_width     (GtkTreeViewColumn       *tree_column,
-								  gint                     fixed_width);
+								  GtkSize                  fixed_width);
 void                    gtk_tree_view_column_set_min_width       (GtkTreeViewColumn       *tree_column,
-								  gint                     min_width);
+								  GtkSize                  min_width);
 gint                    gtk_tree_view_column_get_min_width       (GtkTreeViewColumn       *tree_column);
+GtkSize                 gtk_tree_view_column_get_min_width_unit  (GtkTreeViewColumn       *tree_column);
 void                    gtk_tree_view_column_set_max_width       (GtkTreeViewColumn       *tree_column,
-								  gint                     max_width);
+								  GtkSize                  max_width);
 gint                    gtk_tree_view_column_get_max_width       (GtkTreeViewColumn       *tree_column);
+GtkSize                 gtk_tree_view_column_get_max_width_unit  (GtkTreeViewColumn       *tree_column);
 void                    gtk_tree_view_column_clicked             (GtkTreeViewColumn       *tree_column);
 
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]