2011-11-24 [wwp] 3.7.10cvs101
[claws.git] / src / gtk / gtkcmctree.c
index 356d0999029ea9b1700c1c81b9027526aecfbc24..59a1b161d9ee10076a6deb0b2e9b37cb4b04d3c4 100644 (file)
 
 #include <config.h>
 #include <stdlib.h>
+
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 #include "gtkcmctree.h"
 #include "claws-marshal.h"
+#include "utils.h"
+#include "gtkutils.c"
 
 #define PM_SIZE                    8
 #define TAB_SIZE                   (PM_SIZE + 6)
@@ -62,7 +65,7 @@ gtk_cmctree_pos_get_type (void)
       { GTK_CMCTREE_POS_AFTER, "GTK_CMCTREE_POS_AFTER", "after" },
       { 0, NULL, NULL }
     };
-#if GTK_CHECK_VERSION(2,10,0)
+#if GLIB_CHECK_VERSION(2,10,0)
     etype = g_enum_register_static (g_intern_static_string ("GtkCMCTreePos"), values);
 #else
     etype = g_enum_register_static ("GtkCMCTreePos", values);
@@ -77,12 +80,9 @@ gtk_cmctree_line_style_get_type (void)
   if (etype == 0) {
     static const GEnumValue values[] = {
       { GTK_CMCTREE_LINES_NONE, "GTK_CMCTREE_LINES_NONE", "none" },
-      { GTK_CMCTREE_LINES_SOLID, "GTK_CMCTREE_LINES_SOLID", "solid" },
-      { GTK_CMCTREE_LINES_DOTTED, "GTK_CMCTREE_LINES_DOTTED", "dotted" },
-      { GTK_CMCTREE_LINES_TABBED, "GTK_CMCTREE_LINES_TABBED", "tabbed" },
       { 0, NULL, NULL }
     };
-#if GTK_CHECK_VERSION(2,10,0)
+#if GLIB_CHECK_VERSION(2,10,0)
     etype = g_enum_register_static (g_intern_static_string ("GtkCMCTreeLineStyle"), values);
 #else
     etype = g_enum_register_static ("GtkCMCTreeLineStyle", values);
@@ -97,12 +97,10 @@ gtk_cmctree_expander_style_get_type (void)
   if (etype == 0) {
     static const GEnumValue values[] = {
       { GTK_CMCTREE_EXPANDER_NONE, "GTK_CMCTREE_EXPANDER_NONE", "none" },
-      { GTK_CMCTREE_EXPANDER_SQUARE, "GTK_CMCTREE_EXPANDER_SQUARE", "square" },
       { GTK_CMCTREE_EXPANDER_TRIANGLE, "GTK_CMCTREE_EXPANDER_TRIANGLE", "triangle" },
-      { GTK_CMCTREE_EXPANDER_CIRCULAR, "GTK_CMCTREE_EXPANDER_CIRCULAR", "circular" },
       { 0, NULL, NULL }
     };
-#if GTK_CHECK_VERSION(2,10,0)
+#if GLIB_CHECK_VERSION(2,10,0)
     etype = g_enum_register_static (g_intern_static_string ("GtkCMCTreeExpanderStyle"), values);
 #else
     etype = g_enum_register_static ("GtkCMCTreeExpanderStyle", values);
@@ -124,7 +122,7 @@ gtk_cmctree_expansion_type_get_type (void)
       { GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE, "GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE", "toggle-recursive" },
       { 0, NULL, NULL }
     };
-#if GTK_CHECK_VERSION(2,10,0)
+#if GLIB_CHECK_VERSION(2,10,0)
     etype = g_enum_register_static (g_intern_static_string ("GtkCMCTreeExpansionType"), values);
 #else
     etype = g_enum_register_static ("GtkCMCTreeExpansionType", values);
@@ -196,63 +194,19 @@ static void ctree_attach_styles         (GtkCMCTree       *ctree,
 static void ctree_detach_styles         (GtkCMCTree       *ctree,
                                         GtkCMCTreeNode   *node, 
                                         gpointer        data);
-static gint draw_cell_pixmap            (GdkWindow      *window,
-                                        GdkRectangle   *clip_rectangle,
-                                        GdkGC          *fg_gc,
-                                        GdkPixmap      *pixmap,
-                                        GdkBitmap      *mask,
-                                        gint            x,
-                                        gint            y,
-                                        gint            width,
-                                        gint            height);
-static void get_cell_style              (GtkCMCList       *clist,
-                                        GtkCMCListRow    *clist_row,
-                                        gint            state,
-                                        gint            column,
-                                        GtkStyle      **style,
-                                        GdkGC         **fg_gc,
-                                        GdkGC         **bg_gc);
-static gint gtk_cmctree_draw_expander     (GtkCMCTree       *ctree,
-                                        GtkCMCTreeRow    *ctree_row,
-                                        GtkStyle       *style,
-                                        GdkRectangle   *clip_rectangle,
-                                        gint            x);
-static gint gtk_cmctree_draw_lines        (GtkCMCTree       *ctree,
-                                        GtkCMCTreeRow    *ctree_row,
-                                        gint            row,
-                                        gint            column,
-                                        gint            state,
-                                        GdkRectangle   *clip_rectangle,
-                                        GdkRectangle   *cell_rectangle,
-                                        GdkRectangle   *crect,
-                                        GdkRectangle   *area,
-                                        GtkStyle       *style);
-static void draw_row                    (GtkCMCList       *clist,
-                                        GdkRectangle   *area,
-                                        gint            row,
-                                        GtkCMCListRow    *clist_row);
-static void draw_drag_highlight         (GtkCMCList        *clist,
-                                        GtkCMCListRow     *dest_row,
-                                        gint             dest_row_number,
-                                        GtkCMCListDragPos  drag_pos);
-static void tree_draw_node              (GtkCMCTree      *ctree,
-                                        GtkCMCTreeNode  *node);
 static void set_cell_contents           (GtkCMCList      *clist,
                                         GtkCMCListRow   *clist_row,
                                         gint           column,
                                         GtkCMCellType    type,
                                         const gchar   *text,
                                         guint8         spacing,
-                                        GdkPixmap     *pixmap,
-                                        GdkBitmap     *mask);
+                                        GdkPixbuf     *pixbuf);
 static void set_node_info               (GtkCMCTree      *ctree,
                                         GtkCMCTreeNode  *node,
                                         const gchar   *text,
                                         guint8         spacing,
-                                        GdkPixmap     *pixmap_closed,
-                                        GdkBitmap     *mask_closed,
-                                        GdkPixmap     *pixmap_opened,
-                                        GdkBitmap     *mask_opened,
+                                        GdkPixbuf     *pixbuf_closed,
+                                        GdkPixbuf     *pixbuf_opened,
                                         gboolean       is_leaf,
                                         gboolean       expanded);
 static GtkCMCTreeRow *row_new             (GtkCMCTree      *ctree);
@@ -431,1726 +385,1097 @@ gtk_cmctree_get_type (void)
   return ctree_type;
 }
 
-static void
-gtk_cmctree_class_init (GtkCMCTreeClass *klass)
+static gint
+draw_cell_pixbuf (GdkWindow    *window,
+                 GdkRectangle *clip_rectangle,
+                 cairo_t      *cr,
+                 GdkPixbuf    *pixbuf,
+                 gint          x,
+                 gint          y,
+                 gint          width,
+                 gint          height)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-  GtkObjectClass *object_class;
-  GtkWidgetClass *widget_class;
-  GtkCMCListClass *clist_class;
-  GtkBindingSet *binding_set;
-
-  gobject_class->constructor = gtk_cmctree_constructor;
-
-  object_class = (GtkObjectClass *) klass;
-  widget_class = (GtkWidgetClass *) klass;
-  container_class = (GtkContainerClass *) klass;
-  clist_class = (GtkCMCListClass *) klass;
-
-  parent_class = gtk_type_class (GTK_TYPE_CMCLIST);
-  container_class = gtk_type_class (GTK_TYPE_CONTAINER);
-
-  gobject_class->set_property = gtk_cmctree_set_arg;
-  gobject_class->get_property = gtk_cmctree_get_arg;
-
-  widget_class->realize = gtk_cmctree_realize;
-  widget_class->unrealize = gtk_cmctree_unrealize;
-  widget_class->button_press_event = gtk_cmctree_button_press;
-
-  widget_class->drag_begin = gtk_cmctree_drag_begin;
-  widget_class->drag_motion = gtk_cmctree_drag_motion;
-  widget_class->drag_data_received = gtk_cmctree_drag_data_received;
+  gint xsrc = 0;
+  gint ysrc = 0;
 
-  clist_class->select_row = real_select_row;
-  clist_class->unselect_row = real_unselect_row;
-  clist_class->row_move = real_row_move;
-  clist_class->undo_selection = real_undo_selection;
-  clist_class->resync_selection = resync_selection;
-  clist_class->selection_find = selection_find;
-  clist_class->click_column = NULL;
-  clist_class->draw_row = draw_row;
-  clist_class->draw_drag_highlight = draw_drag_highlight;
-  clist_class->clear = real_clear;
-  clist_class->select_all = real_select_all;
-  clist_class->unselect_all = real_unselect_all;
-  clist_class->fake_unselect_all = fake_unselect_all;
-  clist_class->insert_row = real_insert_row;
-  clist_class->remove_row = real_remove_row;
-  clist_class->sort_list = real_sort_list;
-  clist_class->set_cell_contents = set_cell_contents;
-  clist_class->cell_size_request = cell_size_request;
+  if (!pixbuf || (width == 0 && height == 0))
+       return x;
 
-  klass->tree_select_row = real_tree_select;
-  klass->tree_unselect_row = real_tree_unselect;
-  klass->tree_expand = real_tree_expand;
-  klass->tree_collapse = real_tree_collapse;
-  klass->tree_move = real_tree_move;
-  klass->change_focus_row_expansion = change_focus_row_expansion;
+  if (x < clip_rectangle->x)
+    {
+      xsrc = clip_rectangle->x - x;
+      width -= xsrc;
+      x = clip_rectangle->x;
+    }
+  if (x + width > clip_rectangle->x + clip_rectangle->width)
+    width = clip_rectangle->x + clip_rectangle->width - x;
 
-  g_object_class_install_property (gobject_class,
-                               ARG_N_COLUMNS,
-                               g_param_spec_uint ("n-columns",
-                               "N-Columns",
-                               "N-Columns",
-                               1,
-                               G_MAXINT,
-                               1,
-                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-  g_object_class_install_property (gobject_class,
-                               ARG_TREE_COLUMN,
-                               g_param_spec_uint ("tree-column",
-                               "tree-column",
-                               "tree-column",
-                               0,
-                               G_MAXINT,
-                               0,
-                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-  g_object_class_install_property (gobject_class,
-                               ARG_INDENT,
-                               g_param_spec_uint ("indent",
-                               "indent",
-                               "indent",
-                               1,
-                               G_MAXINT,
-                               1,
-                               G_PARAM_READWRITE));
-  g_object_class_install_property (gobject_class,
-                               ARG_SPACING,
-                               g_param_spec_uint ("spacing",
-                               "spacing",
-                               "spacing",
-                               1,
-                               G_MAXINT,
-                               1,
-                               G_PARAM_READWRITE));
-  g_object_class_install_property (gobject_class,
-                               ARG_SHOW_STUB,
-                               g_param_spec_boolean ("show-stub",
-                               "show-stub",
-                               "show-stub",
-                               TRUE,
-                               G_PARAM_READWRITE));
-  g_object_class_install_property (gobject_class,
-                               ARG_LINE_STYLE,
-                               g_param_spec_enum ("line-style",
-                               "line-style",
-                               "line-style",
-                               GTK_TYPE_CMCTREE_LINE_STYLE, 0,
-                               G_PARAM_READWRITE));
-  g_object_class_install_property (gobject_class,
-                               ARG_EXPANDER_STYLE,
-                               g_param_spec_enum ("expander-style",
-                               "expander-style",
-                               "expander-style",
-                               GTK_TYPE_CMCTREE_EXPANDER_STYLE, 0,
-                               G_PARAM_READWRITE));
+  if (y < clip_rectangle->y)
+    {
+      ysrc = clip_rectangle->y - y;
+      height -= ysrc;
+      y = clip_rectangle->y;
+    }
 
-  ctree_signals[TREE_SELECT_ROW] =
-               g_signal_new ("tree_select_row",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_FIRST,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_select_row),
-                             NULL, NULL,
-                             claws_marshal_VOID__POINTER_INT,
-                             G_TYPE_NONE, 2,
-                             GTK_TYPE_CMCTREE_NODE,
-                             G_TYPE_INT);
-  ctree_signals[TREE_UNSELECT_ROW] =
-               g_signal_new ("tree_unselect_row",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_FIRST,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_unselect_row),
-                             NULL, NULL,
-                             claws_marshal_VOID__POINTER_INT,
-                             G_TYPE_NONE, 2,
-                             GTK_TYPE_CMCTREE_NODE,
-                             G_TYPE_INT);
-  ctree_signals[TREE_EXPAND] =
-               g_signal_new ("tree_expand",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_expand),
-                             NULL, NULL,
-                             claws_marshal_VOID__POINTER,
-                             G_TYPE_NONE, 1,
-                             GTK_TYPE_CMCTREE_NODE);
-  ctree_signals[TREE_COLLAPSE] =
-               g_signal_new ("tree_collapse",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_collapse),
-                             NULL, NULL,
-                             claws_marshal_VOID__POINTER,
-                             G_TYPE_NONE, 1,
-                             GTK_TYPE_CMCTREE_NODE);
-  ctree_signals[TREE_MOVE] =
-               g_signal_new ("tree_move",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_LAST,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_move),
-                             NULL, NULL,
-                             claws_marshal_VOID__POINTER_POINTER_POINTER,
-                             G_TYPE_NONE, 3,
-                             GTK_TYPE_CMCTREE_NODE,GTK_TYPE_CMCTREE_NODE,GTK_TYPE_CMCTREE_NODE);
-  ctree_signals[CHANGE_FOCUS_ROW_EXPANSION] =
-               g_signal_new ("change_focus_row_expansion",
-                             G_TYPE_FROM_CLASS (object_class),
-                             G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-                             G_STRUCT_OFFSET (GtkCMCTreeClass, change_focus_row_expansion),
-                             NULL, NULL,
-                             claws_marshal_VOID__ENUM,
-                             G_TYPE_NONE, 1, GTK_TYPE_CMCTREE_EXPANSION_TYPE);
+  if (y + height > clip_rectangle->y + clip_rectangle->height)
+    height = clip_rectangle->y + clip_rectangle->height - y;
 
-  binding_set = gtk_binding_set_by_class (klass);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_plus, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_plus, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE);
+  gdk_cairo_set_source_pixbuf(cr, pixbuf, x, y);
+  cairo_paint(cr);
 
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Add, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Add, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE);
-  
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_minus, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_COLLAPSE);
-  gtk_binding_entry_add_signal (binding_set,
-                                GDK_minus, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM,
-                               GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Subtract, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_COLLAPSE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Subtract, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM,
-                               GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_equal, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Equal, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Multiply, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_asterisk, 0,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_KP_Multiply, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM,
-                               GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE);
-  gtk_binding_entry_add_signal (binding_set,
-                               GDK_asterisk, GDK_CONTROL_MASK,
-                               "change_focus_row_expansion", 1,
-                               G_TYPE_ENUM,
-                               GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE);  
+  return x + MAX (width, 0);
 }
 
-static void
-gtk_cmctree_set_arg (GObject *object,
-                               guint      arg_id,
-                               const GValue *value,
-                               GParamSpec *spec)
+static gint
+draw_expander (GtkCMCTree     *ctree,
+               GtkCMCTreeRow  *ctree_row,
+              GtkStyle     *style,
+              GdkRectangle *clip_rectangle,
+              cairo_t      *cr,
+              gint          x)
 {
-  GtkCMCTree *ctree;
   GtkCMCList *clist;
+  gint justification_factor;
+  gint y;
 
-  ctree = GTK_CMCTREE (object);
-  clist = GTK_CMCLIST (ctree);
+ if (ctree->expander_style == GTK_CMCTREE_EXPANDER_NONE)
+   return x;
 
-  switch (arg_id)
+  clist = GTK_CMCLIST (ctree);
+  if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT)
+    justification_factor = -1;
+  else
+    justification_factor = 1;
+  if (!GTK_CMCLIST_ROW_HEIGHT_SET(GTK_CMCLIST(clist)))
+      y = (clip_rectangle->y + (clip_rectangle->height - PM_SIZE) / 2 -
+          (clip_rectangle->height + 1) % 2) + 1;
+  else
+      y = (clip_rectangle->y + (clip_rectangle->height/2 - PM_SIZE) / 2 -
+          (clip_rectangle->height/2 + 1) % 2) + 1;
+
+  if (!ctree_row->children)
     {
-    case ARG_N_COLUMNS: /* construct-only arg, only set at construction time */
-      clist->columns = MAX (1, g_value_get_uint (value));
-      ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns);
-      break;
-    case ARG_TREE_COLUMN: /* construct-only arg, only set at construction time */
-      ctree->tree_column = g_value_get_uint (value);
-      ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns);
-      break;
-    case ARG_INDENT:
-      gtk_cmctree_set_indent (ctree, g_value_get_uint (value));
-      break;
-    case ARG_SPACING:
-      gtk_cmctree_set_spacing (ctree, g_value_get_uint (value));
-      break;
-    case ARG_SHOW_STUB:
-      gtk_cmctree_set_show_stub (ctree, g_value_get_boolean (value));
-      break;
-    case ARG_LINE_STYLE:
-      gtk_cmctree_set_line_style (ctree, g_value_get_enum (value));
-      break;
-    case ARG_EXPANDER_STYLE:
-      gtk_cmctree_set_expander_style (ctree, g_value_get_enum (value));
-      break;
-    default:
-      break;
+         return x + justification_factor * (PM_SIZE + 3);
     }
+
+  /* pixel offsets +/- 1 or +/- justification_factor here and there ..
+   * to fill correctly, somewhat ... what do I do wrong?
+   */
+  gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(ctree))->fg[GTK_STATE_NORMAL]);
+  if (ctree_row->expanded)
+  {
+    gint tmp3 = PM_SIZE / 2;
+    gint tmp6 = PM_SIZE / 6;
+    cairo_move_to(cr, x + justification_factor * (tmp3 + tmp6) + (PM_SIZE / 2), y + 1);
+    cairo_rel_line_to(cr, 0, tmp3 + tmp6 + 1);
+    cairo_rel_line_to(cr, -justification_factor * (tmp3 + tmp6) - justification_factor, -1);
+  }
+  else
+  {
+    gint tmp3 = PM_SIZE / 2;
+    gint tmp6 = PM_SIZE / 6;
+    cairo_move_to(cr, x + tmp6 - justification_factor + (PM_SIZE / 2), y + tmp6 - 1);
+    cairo_rel_line_to(cr, justification_factor * tmp3, tmp3);
+    cairo_rel_line_to(cr, -justification_factor * tmp3, tmp3);
+  }
+  cairo_fill(cr);
+
+  x += justification_factor * (PM_SIZE + 3);
+
+  return x;
 }
 
-static void
-gtk_cmctree_get_arg (GObject *object,
-                               guint      arg_id,
-                               GValue *value,
-                               GParamSpec *spec)
+static gint
+get_offset(GtkCMCTree     *ctree,
+                     GtkCMCTreeRow  *ctree_row,
+                     gint            column,
+                     GdkRectangle   *clip_rectangle)
 {
-  GtkCMCTree *ctree;
+  gint justify_right;
+  justify_right = (GTK_CMCLIST (ctree)->column[column].justification == GTK_JUSTIFY_RIGHT);
 
-  ctree = GTK_CMCTREE (object);
+  if (justify_right)
+      return (clip_rectangle->x + clip_rectangle->width - 1 -
+               ctree->tree_indent * (ctree_row->level - 1));
 
-  switch (arg_id)
-    {
-    case ARG_N_COLUMNS:
-      g_value_set_uint(value, GTK_CMCLIST (ctree)->columns);
-      break;
-    case ARG_TREE_COLUMN:
-      g_value_set_uint(value, ctree->tree_column);
-      break;
-    case ARG_INDENT:
-      g_value_set_uint(value, ctree->tree_indent);
-      break;
-    case ARG_SPACING:
-      g_value_set_uint(value, ctree->tree_spacing);
-      break;
-    case ARG_SHOW_STUB:
-      g_value_set_boolean(value, ctree->show_stub);
-      break;
-    case ARG_LINE_STYLE:
-      g_value_set_enum(value, ctree->line_style);
-      break;
-    case ARG_EXPANDER_STYLE:
-      g_value_set_enum(value, ctree->expander_style);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, arg_id, spec);
-      break;
-    }
+  return clip_rectangle->x + ctree->tree_indent * (ctree_row->level - 1);
 }
 
-static void
-gtk_cmctree_init (GtkCMCTree *ctree)
+ static void
+get_cell_style (GtkCMCList     *clist,
+               GtkCMCListRow  *clist_row,
+               gint          state,
+               gint          column,
+               GtkStyle    **style)
 {
-  GtkCMCList *clist;
+  GtkStyle *gtkstyle;
 
-  GTK_CMCLIST_SET_FLAG (ctree, CMCLIST_DRAW_DRAG_RECT);
-  GTK_CMCLIST_SET_FLAG (ctree, CMCLIST_DRAW_DRAG_LINE);
+  gtkstyle = gtk_widget_get_style (GTK_WIDGET (clist));
 
-  clist = GTK_CMCLIST (ctree);
+  if (clist_row->cell[column].style)
+    {
+      if (style)
+       *style = clist_row->cell[column].style;
+    }
+  else if (clist_row->style)
+    {
+      if (style)
+       *style = clist_row->style;
+    }
+  else
+    {
+      if (style)
+       *style = gtkstyle;
+    }
+}
 
-  ctree->tree_indent    = 20;
-  ctree->tree_spacing   = 5;
-  ctree->tree_column    = 0;
-  ctree->line_style     = GTK_CMCTREE_LINES_SOLID;
-  ctree->expander_style = GTK_CMCTREE_EXPANDER_SQUARE;
-  ctree->drag_compare   = NULL;
-  ctree->show_stub      = TRUE;
+static gboolean filter_fg (PangoAttribute *attribute, gpointer data)
+{
+       const PangoAttrClass *klass = attribute->klass;
+       if (klass->type == PANGO_ATTR_FOREGROUND)
+               return TRUE;
 
-  clist->button_actions[0] |= GTK_CMBUTTON_EXPANDS;
+       return FALSE;   
 }
 
-static void
-ctree_attach_styles (GtkCMCTree     *ctree,
-                    GtkCMCTreeNode *node,
-                    gpointer      data)
+static PangoLayout *
+create_cell_layout (GtkCMCList       *clist,
+                              GtkCMCListRow    *clist_row,
+                              gint            column)
 {
-  GtkCMCList *clist;
-  gint i;
+  PangoLayout *layout;
+  GtkStyle *style;
+  GtkCMCell *cell;
+  gchar *text;
 
-  clist = GTK_CMCLIST (ctree);
+  get_cell_style (clist, clist_row, GTK_STATE_NORMAL, column, &style);
 
-  if (GTK_CMCTREE_ROW (node)->row.style)
-    GTK_CMCTREE_ROW (node)->row.style =
-      gtk_style_attach (GTK_CMCTREE_ROW (node)->row.style, clist->clist_window);
 
-  if (GTK_CMCTREE_ROW (node)->row.fg_set || GTK_CMCTREE_ROW (node)->row.bg_set)
+  cell = &clist_row->cell[column];
+  switch (cell->type)
     {
-      GdkColormap *colormap;
+    case GTK_CMCELL_TEXT:
+    case GTK_CMCELL_PIXTEXT:
+      text = ((cell->type == GTK_CMCELL_PIXTEXT) ?
+             GTK_CMCELL_PIXTEXT (*cell)->text :
+             GTK_CMCELL_TEXT (*cell)->text);
 
-      colormap = gtk_widget_get_colormap (GTK_WIDGET (ctree));
-      if (GTK_CMCTREE_ROW (node)->row.fg_set)
-       gdk_colormap_alloc_color (colormap, &(GTK_CMCTREE_ROW (node)->row.foreground), TRUE, TRUE);
-      if (GTK_CMCTREE_ROW (node)->row.bg_set)
-       gdk_colormap_alloc_color (colormap, &(GTK_CMCTREE_ROW (node)->row.background), TRUE, TRUE);
+      if (!text)
+       return NULL;
+      
+      if (!GTK_SCTREE(clist)->use_markup[column]) {
+             layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist),
+                                                      ((cell->type == GTK_CMCELL_PIXTEXT) ?
+                                                       GTK_CMCELL_PIXTEXT (*cell)->text :
+                                                       GTK_CMCELL_TEXT (*cell)->text));
+             pango_layout_set_font_description (layout, style->font_desc);
+      } else {
+             PangoContext *context = gtk_widget_get_pango_context (GTK_WIDGET(clist));
+             layout = pango_layout_new (context);
+             pango_layout_set_markup (layout, text, -1);
+             pango_layout_set_font_description (layout, style->font_desc);
+             if (clist_row->state == GTK_STATE_SELECTED) {
+                     /* for selected row, we should remove any forced foreground color
+                      * or it looks like shit */
+                     PangoAttrList *list = pango_layout_get_attributes(layout);
+                     PangoAttrList *rem = pango_attr_list_filter(list, filter_fg, NULL);
+                     if (rem)
+                             pango_attr_list_unref(rem);
+             }
+      }
+      
+      return layout;
+      
+    default:
+      return NULL;
     }
-
-  for (i = 0; i < clist->columns; i++)
-    if  (GTK_CMCTREE_ROW (node)->row.cell[i].style)
-      GTK_CMCTREE_ROW (node)->row.cell[i].style =
-       gtk_style_attach (GTK_CMCTREE_ROW (node)->row.cell[i].style,
-                         clist->clist_window);
 }
 
+
 static void
-ctree_detach_styles (GtkCMCTree     *ctree,
-                    GtkCMCTreeNode *node,
-                    gpointer      data)
+draw_row (GtkCMCList     *clist,
+         GdkRectangle *area,
+         gint          row,
+         GtkCMCListRow  *clist_row)
 {
-  GtkCMCList *clist;
+  GtkWidget *widget;
+  GtkStyle *style;
+  GtkCMCTree  *ctree;
+  GdkRectangle *crect;
+  GdkRectangle row_rectangle;
+  GdkRectangle cell_rectangle; 
+  GdkRectangle clip_rectangle;
+  GdkRectangle intersect_rectangle;
+  gint last_column;
+  gint offset = 0;
+  gint state;
   gint i;
+  static GdkColor greybg={0, 0, 0, 0};
+  static gboolean color_change = TRUE;
+  cairo_t *cr;
+  GdkColor *fgcolor, *bgcolor;
 
-  clist = GTK_CMCLIST (ctree);
+  cm_return_if_fail (clist != NULL);
+  widget = GTK_WIDGET (clist);
+  style = clist_row->style ? clist_row->style : gtk_widget_get_style (widget);
+
+  if (greybg.pixel == 0 &&
+      greybg.red == 0 &&
+      greybg.green == 0 &&
+      greybg.blue == 0) {
+       GdkColor normalbg = {0, 0xffff, 0xffff, 0xffff};
+       if (style) {
+               normalbg = style->base[GTK_STATE_NORMAL];
+       }
+       if (normalbg.red > 0x8888 && normalbg.green > 0x8888 && normalbg.blue > 0x8888) {
+               greybg.pixel = normalbg.pixel;
+               greybg.red = normalbg.red - prefs_common.stripes_color_offset;
+               greybg.green = normalbg.green - prefs_common.stripes_color_offset;
+               greybg.blue = normalbg.blue - prefs_common.stripes_color_offset;
+       } else if (normalbg.red < 0x8888 && normalbg.green < 0x8888 && normalbg.blue < 0x8888) {
+               greybg.pixel = normalbg.pixel;
+               greybg.red = normalbg.red + prefs_common.stripes_color_offset;
+               greybg.green = normalbg.green + prefs_common.stripes_color_offset;
+               greybg.blue = normalbg.blue + prefs_common.stripes_color_offset;
+       } else {
+               color_change = FALSE;
+       }
+  }
 
-  if (GTK_CMCTREE_ROW (node)->row.style)
-    gtk_style_detach (GTK_CMCTREE_ROW (node)->row.style);
-  for (i = 0; i < clist->columns; i++)
-    if  (GTK_CMCTREE_ROW (node)->row.cell[i].style)
-      gtk_style_detach (GTK_CMCTREE_ROW (node)->row.cell[i].style);
-}
+  /* bail now if we arn't drawable yet */
+  if (!gtk_widget_is_drawable (GTK_WIDGET(clist)) || row < 0 || row >= clist->rows)
+    return;
 
-static void
-gtk_cmctree_realize (GtkWidget *widget)
-{
-  GtkCMCTree *ctree;
-  GtkCMCList *clist;
-  GdkGCValues values;
-  GtkCMCTreeNode *node;
-  GtkCMCTreeNode *child;
-  gint i;
+  ctree  = GTK_CMCTREE  (clist);
 
-  g_return_if_fail (GTK_IS_CMCTREE (widget));
+  /* if the function is passed the pointer to the row instead of null,
+   * it avoids this expensive lookup */
+  if (!clist_row)
+    clist_row = (g_list_nth (clist->row_list, row))->data;
 
-  GTK_WIDGET_CLASS (parent_class)->realize (widget);
+  /* rectangle of the entire row */
+  row_rectangle.x = 0;
+  row_rectangle.y = ROW_TOP_YPIXEL (clist, row);
+  row_rectangle.width = clist->clist_window_width;
+  row_rectangle.height = clist->row_height;
 
-  ctree = GTK_CMCTREE (widget);
-  clist = GTK_CMCLIST (widget);
+  /* rectangle of the cell spacing above the row */
+  cell_rectangle.x = 0;
+  cell_rectangle.y = row_rectangle.y - CELL_SPACING;
+  cell_rectangle.width = row_rectangle.width;
+  cell_rectangle.height = CELL_SPACING;
 
-  node = GTK_CMCTREE_NODE (clist->row_list);
-  for (i = 0; i < clist->rows; i++)
-    {
-      if (GTK_CMCTREE_ROW (node)->children && !GTK_CMCTREE_ROW (node)->expanded)
-       for (child = GTK_CMCTREE_ROW (node)->children; child;
-            child = GTK_CMCTREE_ROW (child)->sibling)
-         gtk_cmctree_pre_recursive (ctree, child, ctree_attach_styles, NULL);
-      node = GTK_CMCTREE_NODE_NEXT (node);
-    }
+  /* rectangle used to clip drawing operations, its y and height
+   * positions only need to be set once, so we set them once here. 
+   * the x and width are set withing the drawing loop below once per
+   * column */
+  clip_rectangle.y = row_rectangle.y;
+  clip_rectangle.height = row_rectangle.height;
 
-  values.foreground = widget->style->fg[GTK_STATE_NORMAL];
-  values.background = widget->style->base[GTK_STATE_NORMAL];
-  values.subwindow_mode = GDK_INCLUDE_INFERIORS;
-  values.line_style = GDK_LINE_SOLID;
-  ctree->lines_gc = gdk_gc_new_with_values (GTK_CMCLIST(widget)->clist_window, 
-                                           &values,
-                                           GDK_GC_FOREGROUND |
-                                           GDK_GC_BACKGROUND |
-                                           GDK_GC_SUBWINDOW |
-                                           GDK_GC_LINE_STYLE);
+  if (prefs_common.use_stripes_everywhere && GTK_SCTREE(ctree)->show_stripes
+      && color_change && row % 2) {
+    bgcolor = &greybg;
+  } else {
+    bgcolor = &style->base[GTK_STATE_NORMAL];
+  }
+  state = clist_row->state;
 
-  if (ctree->line_style == GTK_CMCTREE_LINES_DOTTED)
+  cr = gdk_cairo_create(clist->clist_window);
+  
+  if (clist_row->fg_set && state != GTK_STATE_SELECTED)
+       fgcolor = &clist_row->foreground;
+  else
+       fgcolor = &style->fg[clist_row->state];
+  /* draw the cell borders */
+  if (area)
     {
-      gdk_gc_set_line_attributes (ctree->lines_gc, 1, 
-                                 GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER);
-      gdk_gc_set_dashes (ctree->lines_gc, 0, "\1\1", 2);
+      crect = &intersect_rectangle;
+
+      if (gdk_rectangle_intersect (area, &cell_rectangle, crect)) {
+        gdk_cairo_rectangle(cr, &cell_rectangle);
+       gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]);
+       cairo_fill(cr);
+      }
     }
-}
+  else
+    {
+      crect = &cell_rectangle;
 
-static void
-gtk_cmctree_unrealize (GtkWidget *widget)
-{
-  GtkCMCTree *ctree;
-  GtkCMCList *clist;
+      gdk_cairo_rectangle(cr, &cell_rectangle);
+      gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]);
+      cairo_fill(cr);
+    }
 
-  g_return_if_fail (GTK_IS_CMCTREE (widget));
+  /* the last row has to clear its bottom cell spacing too */
+  if (clist_row == clist->row_list_end->data)
+    {
+      cell_rectangle.y += clist->row_height + CELL_SPACING;
 
-  GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
+      if (!area || gdk_rectangle_intersect (area, &cell_rectangle, crect))
+       {
+          gdk_cairo_rectangle(cr, crect);
+         gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]);
+         cairo_fill(cr);
+       }
+    }    
 
-  ctree = GTK_CMCTREE (widget);
-  clist = GTK_CMCLIST (widget);
+  for (last_column = clist->columns - 1;
+       last_column >= 0 && !clist->column[last_column].visible; last_column--)
+    ;
 
-  if (GTK_WIDGET_REALIZED (widget))
+  /* iterate and draw all the columns (row cells) and draw their contents */
+  for (i = 0; i < clist->columns; i++)
     {
-      GtkCMCTreeNode *node;
-      GtkCMCTreeNode *child;
-      gint i;
+      GtkStyle *style;
+      PangoLayout *layout = NULL;
+      PangoRectangle logical_rect;
 
-      node = GTK_CMCTREE_NODE (clist->row_list);
-      for (i = 0; i < clist->rows; i++)
-       {
-         if (GTK_CMCTREE_ROW (node)->children &&
-             !GTK_CMCTREE_ROW (node)->expanded)
-           for (child = GTK_CMCTREE_ROW (node)->children; child;
-                child = GTK_CMCTREE_ROW (child)->sibling)
-             gtk_cmctree_pre_recursive(ctree, child, ctree_detach_styles, NULL);
-         node = GTK_CMCTREE_NODE_NEXT (node);
-       }
-    }
+      gint width;
+      gint height;
+      gint pixbuf_width;
+      gint string_width;
+      gint old_offset;
 
-  g_object_unref (ctree->lines_gc);
-}
+      if (!clist->column[i].visible)
+       continue;
 
-static gint
-gtk_cmctree_button_press (GtkWidget      *widget,
-                       GdkEventButton *event)
-{
-  GtkCMCTree *ctree;
-  GtkCMCList *clist;
-  gint button_actions;
+      get_cell_style (clist, clist_row, state, i, &style);
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
+      /* calculate clipping region */
+      clip_rectangle.x = clist->column[i].area.x + clist->hoffset;
+      clip_rectangle.width = clist->column[i].area.width;
 
-  ctree = GTK_CMCTREE (widget);
-  clist = GTK_CMCLIST (widget);
+      cell_rectangle.x = clip_rectangle.x - COLUMN_INSET - CELL_SPACING;
+      cell_rectangle.width = (clip_rectangle.width + 2 * COLUMN_INSET +
+                             (1 + (i == last_column)) * CELL_SPACING);
+      cell_rectangle.y = clip_rectangle.y;
+      cell_rectangle.height = clip_rectangle.height;
 
-  button_actions = clist->button_actions[event->button - 1];
+      string_width = 0;
+      pixbuf_width = 0;
+      height = 0;
 
-  if (button_actions == GTK_CMBUTTON_IGNORED)
-    return FALSE;
+      if (area && !gdk_rectangle_intersect (area, &cell_rectangle,
+                                           &intersect_rectangle))
+       {
+         if (i != ctree->tree_column)
+           continue;
+       }
+      else
+       {
+         gdk_cairo_rectangle(cr, &cell_rectangle);
+         if (state == GTK_STATE_NORMAL)
+               gdk_cairo_set_source_color(cr, bgcolor);
+         else
+               gdk_cairo_set_source_color(cr, &style->base[state]);
+         cairo_fill(cr);
 
-  if (event->window == clist->clist_window)
-    {
-      GtkCMCTreeNode *work;
-      gint x;
-      gint y;
-      gint row;
-      gint column;
+         layout = create_cell_layout (clist, clist_row, i);
+         if (layout)
+           {
+             pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
+             width = logical_rect.width;
+           }
+         else
+           width = 0;
 
-      x = event->x;
-      y = event->y;
+         switch (clist_row->cell[i].type)
+           {
+           case GTK_CMCELL_PIXBUF:
+             pixbuf_width = gdk_pixbuf_get_width(GTK_CMCELL_PIXBUF (clist_row->cell[i])->pixbuf);
+             height = gdk_pixbuf_get_height(GTK_CMCELL_PIXBUF (clist_row->cell[i])->pixbuf);
+             width += pixbuf_width;
+             break;
+           case GTK_CMCELL_PIXTEXT:
+             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf)
+               {
+                 pixbuf_width = gdk_pixbuf_get_width(GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf);
+                 height = gdk_pixbuf_get_height(GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf);
+                 width += pixbuf_width;
+               }
 
-      if (!gtk_cmclist_get_selection_info (clist, x, y, &row, &column))
-       return FALSE;
+             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->text &&
+                 GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf)
+               width +=  GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
 
-      work = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, row));
-         
-      if (button_actions & GTK_CMBUTTON_EXPANDS &&
-         (GTK_CMCTREE_ROW (work)->children && !GTK_CMCTREE_ROW (work)->is_leaf  &&
-          (event->type == GDK_2BUTTON_PRESS ||
-           ctree_is_hot_spot (ctree, work, row, x, y))))
-       {
-         if (GTK_CMCTREE_ROW (work)->expanded)
-           gtk_cmctree_collapse (ctree, work);
-         else
-           gtk_cmctree_expand (ctree, work);
+             if (i == ctree->tree_column)
+               width += (ctree->tree_indent *
+                         ((GtkCMCTreeRow *)clist_row)->level);
+             break;
+           default:
+             break;
+           }
 
-         return TRUE;
+         switch (clist->column[i].justification)
+           {
+           case GTK_JUSTIFY_LEFT:
+             offset = clip_rectangle.x + clist_row->cell[i].horizontal;
+             break;
+           case GTK_JUSTIFY_RIGHT:
+             offset = (clip_rectangle.x + clist_row->cell[i].horizontal +
+                       clip_rectangle.width - width);
+             break;
+           case GTK_JUSTIFY_CENTER:
+           case GTK_JUSTIFY_FILL:
+             offset = (clip_rectangle.x + clist_row->cell[i].horizontal +
+                       (clip_rectangle.width / 2) - (width / 2));
+             break;
+           };
+
+         if (i != ctree->tree_column)
+           {
+             int start_y = (clip_rectangle.height - height) / 2;
+             if (GTK_CMCLIST_ROW_HEIGHT_SET(GTK_CMCLIST(clist)))
+                     start_y = (clip_rectangle.height/2 - height) / 2;
+
+             offset += clist_row->cell[i].horizontal;
+             switch (clist_row->cell[i].type)
+               {
+               case GTK_CMCELL_PIXBUF:
+                 draw_cell_pixbuf
+                   (clist->clist_window, &clip_rectangle, cr,
+                    GTK_CMCELL_PIXBUF (clist_row->cell[i])->pixbuf,
+                    offset,
+                    clip_rectangle.y + clist_row->cell[i].vertical +
+                    start_y,
+                    pixbuf_width, height);
+                 break;
+               case GTK_CMCELL_PIXTEXT:
+                 offset = draw_cell_pixbuf
+                   (clist->clist_window, &clip_rectangle, cr,
+                    GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf,
+                    offset,
+                    clip_rectangle.y + clist_row->cell[i].vertical +
+                    start_y,
+                    pixbuf_width, height);
+                 offset += GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
+
+                 /* Fall through */
+               case GTK_CMCELL_TEXT:
+                 if (layout)
+                   {
+                     gint row_center_offset = (clist->row_height - logical_rect.height) / 2;
+                     gdk_cairo_set_source_color(cr, fgcolor);
+                     cairo_move_to(cr, offset, row_rectangle.y + row_center_offset + clist_row->cell[i].vertical);
+                     pango_cairo_show_layout(cr, layout);
+                     g_object_unref (G_OBJECT (layout));
+                   }
+                 break;
+               default:
+                 break;
+               }
+             continue;
+           }
        }
-    }
-  
-  return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
-}
 
-static void
-draw_drag_highlight (GtkCMCList        *clist,
-                    GtkCMCListRow     *dest_row,
-                    gint             dest_row_number,
-                    GtkCMCListDragPos  drag_pos)
-{
-  GtkCMCTree *ctree;
-  GdkPoint points[4];
-  gint level;
-  gint i;
-  gint y = 0;
+      /* draw ctree->tree_column */
+      cell_rectangle.y -= CELL_SPACING;
+      cell_rectangle.height += CELL_SPACING;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+      if (area && !gdk_rectangle_intersect (area, &cell_rectangle,
+                                           &intersect_rectangle))
+       {
+         if (layout)
+            g_object_unref (G_OBJECT (layout));
+         continue;
+       }
 
-  ctree = GTK_CMCTREE (clist);
 
-  level = ((GtkCMCTreeRow *)(dest_row))->level;
+      /* draw lines */
+      offset = get_offset (ctree, (GtkCMCTreeRow *)clist_row, i,
+                                     &clip_rectangle);
 
-  y = ROW_TOP_YPIXEL (clist, dest_row_number) - 1;
+      /* draw expander */
+      offset = draw_expander (ctree, (GtkCMCTreeRow *)clist_row,
+                                       style, &clip_rectangle, cr, offset);
 
-  switch (drag_pos)
-    {
-    case GTK_CMCLIST_DRAG_NONE:
-      break;
-    case GTK_CMCLIST_DRAG_AFTER:
-      y += clist->row_height + 1;
-    case GTK_CMCLIST_DRAG_BEFORE:
-      
-      if (clist->column[ctree->tree_column].visible)
-       switch (clist->column[ctree->tree_column].justification)
-         {
-         case GTK_JUSTIFY_CENTER:
-         case GTK_JUSTIFY_FILL:
-         case GTK_JUSTIFY_LEFT:
-           if (ctree->tree_column > 0)
-             gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                            COLUMN_LEFT_XPIXEL(clist, 0), y,
-                            COLUMN_LEFT_XPIXEL(clist, ctree->tree_column - 1)+
-                            clist->column[ctree->tree_column - 1].area.width,
-                            y);
-
-           gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                          COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + 
-                          ctree->tree_indent * level -
-                          (ctree->tree_indent - PM_SIZE) / 2, y,
-                          GTK_WIDGET (ctree)->allocation.width, y);
-           break;
-         case GTK_JUSTIFY_RIGHT:
-           if (ctree->tree_column < clist->columns - 1)
-             gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                            COLUMN_LEFT_XPIXEL(clist, ctree->tree_column + 1),
-                            y,
-                            COLUMN_LEFT_XPIXEL(clist, clist->columns - 1) +
-                            clist->column[clist->columns - 1].area.width, y);
-      
-           gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                          0, y, COLUMN_LEFT_XPIXEL(clist, ctree->tree_column)
-                          + clist->column[ctree->tree_column].area.width -
-                          ctree->tree_indent * level +
-                          (ctree->tree_indent - PM_SIZE) / 2, y);
-           break;
-         }
+      if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
+       offset -= ctree->tree_spacing;
       else
-       gdk_draw_line (clist->clist_window, clist->xor_gc, 
-                      0, y, clist->clist_window_width, y);
-      break;
-    case GTK_CMCLIST_DRAG_INTO:
-      y = ROW_TOP_YPIXEL (clist, dest_row_number) + clist->row_height;
+       offset += ctree->tree_spacing;
 
-      if (clist->column[ctree->tree_column].visible)
-       switch (clist->column[ctree->tree_column].justification)
-         {
-         case GTK_JUSTIFY_CENTER:
-         case GTK_JUSTIFY_FILL:
-         case GTK_JUSTIFY_LEFT:
-           points[0].x =  COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) + 
-             ctree->tree_indent * level - (ctree->tree_indent - PM_SIZE) / 2;
-           points[0].y = y;
-           points[3].x = points[0].x;
-           points[3].y = y - clist->row_height - 1;
-           points[1].x = clist->clist_window_width - 1;
-           points[1].y = points[0].y;
-           points[2].x = points[1].x;
-           points[2].y = points[3].y;
-
-           for (i = 0; i < 3; i++)
-             gdk_draw_line (clist->clist_window, clist->xor_gc,
-                            points[i].x, points[i].y,
-                            points[i+1].x, points[i+1].y);
-
-           if (ctree->tree_column > 0)
-             {
-               points[0].x = COLUMN_LEFT_XPIXEL(clist,
-                                                ctree->tree_column - 1) +
-                 clist->column[ctree->tree_column - 1].area.width ;
-               points[0].y = y;
-               points[3].x = points[0].x;
-               points[3].y = y - clist->row_height - 1;
-               points[1].x = 0;
-               points[1].y = points[0].y;
-               points[2].x = 0;
-               points[2].y = points[3].y;
-
-               for (i = 0; i < 3; i++)
-                 gdk_draw_line (clist->clist_window, clist->xor_gc,
-                                points[i].x, points[i].y, points[i+1].x, 
-                                points[i+1].y);
-             }
-           break;
-         case GTK_JUSTIFY_RIGHT:
-           points[0].x =  COLUMN_LEFT_XPIXEL(clist, ctree->tree_column) - 
-             ctree->tree_indent * level + (ctree->tree_indent - PM_SIZE) / 2 +
-             clist->column[ctree->tree_column].area.width;
-           points[0].y = y;
-           points[3].x = points[0].x;
-           points[3].y = y - clist->row_height - 1;
-           points[1].x = 0;
-           points[1].y = points[0].y;
-           points[2].x = 0;
-           points[2].y = points[3].y;
-
-           for (i = 0; i < 3; i++)
-             gdk_draw_line (clist->clist_window, clist->xor_gc,
-                            points[i].x, points[i].y,
-                            points[i+1].x, points[i+1].y);
-
-           if (ctree->tree_column < clist->columns - 1)
-             {
-               points[0].x = COLUMN_LEFT_XPIXEL(clist, ctree->tree_column +1);
-               points[0].y = y;
-               points[3].x = points[0].x;
-               points[3].y = y - clist->row_height - 1;
-               points[1].x = clist->clist_window_width - 1;
-               points[1].y = points[0].y;
-               points[2].x = points[1].x;
-               points[2].y = points[3].y;
-
-               for (i = 0; i < 3; i++)
-                 gdk_draw_line (clist->clist_window, clist->xor_gc,
-                                points[i].x, points[i].y,
-                                points[i+1].x, points[i+1].y);
-             }
-           break;
-         }
+      if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
+       offset -= (pixbuf_width + clist_row->cell[i].horizontal);
       else
-       gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
-                           0, y - clist->row_height,
-                           clist->clist_window_width - 1, clist->row_height);
-      break;
-    }
-}
+       offset += clist_row->cell[i].horizontal;
 
-static gint
-draw_cell_pixmap (GdkWindow    *window,
-                 GdkRectangle *clip_rectangle,
-                 GdkGC        *fg_gc,
-                 GdkPixmap    *pixmap,
-                 GdkBitmap    *mask,
-                 gint          x,
-                 gint          y,
-                 gint          width,
-                 gint          height)
-{
-  gint xsrc = 0;
-  gint ysrc = 0;
+      old_offset = offset;
+      offset = draw_cell_pixbuf (clist->clist_window, &clip_rectangle, cr,
+                                GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf,
+                                offset, 
+                                clip_rectangle.y + clist_row->cell[i].vertical
+                                + (clip_rectangle.height - height) / 2,
+                                pixbuf_width, height);
 
-  if (mask)
-    {
-      gdk_gc_set_clip_mask (fg_gc, mask);
-      gdk_gc_set_clip_origin (fg_gc, x, y);
-    }
-  if (x < clip_rectangle->x)
-    {
-      xsrc = clip_rectangle->x - x;
-      width -= xsrc;
-      x = clip_rectangle->x;
-    }
-  if (x + width > clip_rectangle->x + clip_rectangle->width)
-    width = clip_rectangle->x + clip_rectangle->width - x;
+      if (layout)
+       {
+         gint row_center_offset = (clist->row_height - logical_rect.height) / 2;
+         
+         if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
+           {
+             offset = (old_offset - string_width);
+             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf)
+               offset -= GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
+           }
+         else
+           {
+             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf)
+               offset += GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
+           }
+         
+         cairo_move_to(cr, offset, row_rectangle.y + row_center_offset + clist_row->cell[i].vertical);
+         gdk_cairo_set_source_color(cr, fgcolor);
+         pango_cairo_show_layout(cr, layout);
 
-  if (y < clip_rectangle->y)
-    {
-      ysrc = clip_rectangle->y - y;
-      height -= ysrc;
-      y = clip_rectangle->y;
+          g_object_unref (G_OBJECT (layout));
+       }
     }
-  if (y + height > clip_rectangle->y + clip_rectangle->height)
-    height = clip_rectangle->y + clip_rectangle->height - y;
-
-  if (width > 0 && height > 0)
-    gdk_draw_drawable (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height);
-
-  if (mask)
+   /* draw focus rectangle */
+  if (clist->focus_row == row &&
+      gtk_widget_get_can_focus (widget) && gtk_widget_has_focus (widget))
     {
-      gdk_gc_set_clip_rectangle (fg_gc, NULL);
-      gdk_gc_set_clip_origin (fg_gc, 0, 0);
-    }
-
-  return x + MAX (width, 0);
+      if (!area || gdk_rectangle_intersect (area, &row_rectangle,
+                                       &intersect_rectangle))
+       {
+           cairo_set_line_width(cr, 1.0);
+           cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+           gdk_cairo_set_source_color(cr, &style->fg[GTK_STATE_NORMAL]);
+           cairo_rectangle(cr, row_rectangle.x, row_rectangle.y,
+                             row_rectangle.width + 1,
+                             row_rectangle.height);
+           cairo_stroke(cr);
+       }
+     }
+    cairo_destroy(cr);
 }
 
 static void
-get_cell_style (GtkCMCList     *clist,
-               GtkCMCListRow  *clist_row,
-               gint          state,
-               gint          column,
-               GtkStyle    **style,
-               GdkGC       **fg_gc,
-               GdkGC       **bg_gc)
+gtk_cmctree_class_init (GtkCMCTreeClass *klass)
 {
-  gint fg_state;
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GtkObjectClass *object_class;
+  GtkWidgetClass *widget_class;
+  GtkCMCListClass *clist_class;
+  GtkBindingSet *binding_set;
 
-  if ((state == GTK_STATE_NORMAL) &&
-      (GTK_WIDGET (clist)->state == GTK_STATE_INSENSITIVE))
-    fg_state = GTK_STATE_INSENSITIVE;
-  else
-    fg_state = state;
+  gobject_class->constructor = gtk_cmctree_constructor;
 
-  if (clist_row->cell[column].style)
-    {
-      if (style)
-       *style = clist_row->cell[column].style;
-      if (fg_gc)
-       *fg_gc = clist_row->cell[column].style->fg_gc[fg_state];
-      if (bg_gc) {
-       if (state == GTK_STATE_SELECTED)
-         *bg_gc = clist_row->cell[column].style->bg_gc[state];
-       else
-         *bg_gc = clist_row->cell[column].style->base_gc[state];
-      }
-    }
-  else if (clist_row->style)
-    {
-      if (style)
-       *style = clist_row->style;
-      if (fg_gc)
-       *fg_gc = clist_row->style->fg_gc[fg_state];
-      if (bg_gc) {
-       if (state == GTK_STATE_SELECTED)
-         *bg_gc = clist_row->style->bg_gc[state];
-       else
-         *bg_gc = clist_row->style->base_gc[state];
-      }
-    }
-  else
-    {
-      if (style)
-       *style = GTK_WIDGET (clist)->style;
-      if (fg_gc)
-       *fg_gc = GTK_WIDGET (clist)->style->fg_gc[fg_state];
-      if (bg_gc) {
-       if (state == GTK_STATE_SELECTED)
-         *bg_gc = GTK_WIDGET (clist)->style->bg_gc[state];
-       else
-         *bg_gc = GTK_WIDGET (clist)->style->base_gc[state];
-      }
-
-      if (state != GTK_STATE_SELECTED)
-       {
-         if (fg_gc && clist_row->fg_set)
-           *fg_gc = clist->fg_gc;
-         if (bg_gc && clist_row->bg_set)
-           *bg_gc = clist->bg_gc;
-       }
-    }
-}
-
-static gint
-gtk_cmctree_draw_expander (GtkCMCTree     *ctree,
-                        GtkCMCTreeRow  *ctree_row,
-                        GtkStyle     *style,
-                        GdkRectangle *clip_rectangle,
-                        gint          x)
-{
-  GtkCMCList *clist;
-  GdkPoint points[3];
-  gint justification_factor;
-  gint y;
-
- if (ctree->expander_style == GTK_CMCTREE_EXPANDER_NONE)
-   return x;
-
-  clist = GTK_CMCLIST (ctree);
-  if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT)
-    justification_factor = -1;
-  else
-    justification_factor = 1;
-  y = (clip_rectangle->y + (clip_rectangle->height - PM_SIZE) / 2 -
-       (clip_rectangle->height + 1) % 2);
-
-  if (!ctree_row->children)
-    {
-      switch (ctree->expander_style)
-       {
-       case GTK_CMCTREE_EXPANDER_NONE:
-         return x;
-       case GTK_CMCTREE_EXPANDER_TRIANGLE:
-         return x + justification_factor * (PM_SIZE + 3);
-       case GTK_CMCTREE_EXPANDER_SQUARE:
-       case GTK_CMCTREE_EXPANDER_CIRCULAR:
-         return x + justification_factor * (PM_SIZE + 1);
-       }
-    }
+  object_class = (GtkObjectClass *) klass;
+  widget_class = (GtkWidgetClass *) klass;
+  container_class = (GtkContainerClass *) klass;
+  clist_class = (GtkCMCListClass *) klass;
 
-  gdk_gc_set_clip_rectangle (style->fg_gc[GTK_STATE_NORMAL], clip_rectangle);
-  gdk_gc_set_clip_rectangle (style->base_gc[GTK_STATE_NORMAL], clip_rectangle);
+  parent_class = g_type_class_peek (GTK_TYPE_CMCLIST);
+  container_class = g_type_class_peek (GTK_TYPE_CONTAINER);
 
-  switch (ctree->expander_style)
-    {
-    case GTK_CMCTREE_EXPANDER_NONE:
-      break;
-    case GTK_CMCTREE_EXPANDER_TRIANGLE:
-      if (ctree_row->expanded)
-       {
-         points[0].x = x;
-         points[0].y = y + (PM_SIZE + 2) / 6;
-         points[1].x = points[0].x + justification_factor * (PM_SIZE + 2);
-         points[1].y = points[0].y;
-         points[2].x = (points[0].x +
-                        justification_factor * (PM_SIZE + 2) / 2);
-         points[2].y = y + 2 * (PM_SIZE + 2) / 3;
-       }
-      else
-       {
-         points[0].x = x + justification_factor * ((PM_SIZE + 2) / 6 + 2);
-         points[0].y = y - 1;
-         points[1].x = points[0].x;
-         points[1].y = points[0].y + (PM_SIZE + 2);
-         points[2].x = (points[0].x +
-                        justification_factor * (2 * (PM_SIZE + 2) / 3 - 1));
-         points[2].y = points[0].y + (PM_SIZE + 2) / 2;
-       }
+  gobject_class->set_property = gtk_cmctree_set_arg;
+  gobject_class->get_property = gtk_cmctree_get_arg;
 
-      gdk_draw_polygon (clist->clist_window, style->base_gc[GTK_STATE_NORMAL],
-                       TRUE, points, 3);
-      gdk_draw_polygon (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL],
-                       FALSE, points, 3);
+  widget_class->realize = gtk_cmctree_realize;
+  widget_class->unrealize = gtk_cmctree_unrealize;
+  widget_class->button_press_event = gtk_cmctree_button_press;
 
-      x += justification_factor * (PM_SIZE + 3);
-      break;
-    case GTK_CMCTREE_EXPANDER_SQUARE:
-    case GTK_CMCTREE_EXPANDER_CIRCULAR:
-      if (justification_factor == -1)
-       x += justification_factor * (PM_SIZE + 1);
+  widget_class->drag_begin = gtk_cmctree_drag_begin;
+  widget_class->drag_motion = gtk_cmctree_drag_motion;
+  widget_class->drag_data_received = gtk_cmctree_drag_data_received;
 
-      if (ctree->expander_style == GTK_CMCTREE_EXPANDER_CIRCULAR)
-       {
-         gdk_draw_arc (clist->clist_window, style->base_gc[GTK_STATE_NORMAL],
-                       TRUE, x, y, PM_SIZE, PM_SIZE, 0, 360 * 64);
-         gdk_draw_arc (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL],
-                       FALSE, x, y, PM_SIZE, PM_SIZE, 0, 360 * 64);
-       }
-      else
-       {
-         gdk_draw_rectangle (clist->clist_window,
-                             style->base_gc[GTK_STATE_NORMAL], TRUE,
-                             x, y, PM_SIZE, PM_SIZE);
-         gdk_draw_rectangle (clist->clist_window,
-                             style->fg_gc[GTK_STATE_NORMAL], FALSE,
-                             x, y, PM_SIZE, PM_SIZE);
-       }
+  clist_class->select_row = real_select_row;
+  clist_class->unselect_row = real_unselect_row;
+  clist_class->row_move = real_row_move;
+  clist_class->undo_selection = real_undo_selection;
+  clist_class->resync_selection = resync_selection;
+  clist_class->selection_find = selection_find;
+  clist_class->click_column = NULL;
+  clist_class->draw_row = draw_row;
+  clist_class->clear = real_clear;
+  clist_class->select_all = real_select_all;
+  clist_class->unselect_all = real_unselect_all;
+  clist_class->fake_unselect_all = fake_unselect_all;
+  clist_class->insert_row = real_insert_row;
+  clist_class->remove_row = real_remove_row;
+  clist_class->sort_list = real_sort_list;
+  clist_class->set_cell_contents = set_cell_contents;
+  clist_class->cell_size_request = cell_size_request;
 
-      gdk_draw_line (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL], 
-                    x + 2, y + PM_SIZE / 2, x + PM_SIZE - 2, y + PM_SIZE / 2);
+  klass->tree_select_row = real_tree_select;
+  klass->tree_unselect_row = real_tree_unselect;
+  klass->tree_expand = real_tree_expand;
+  klass->tree_collapse = real_tree_collapse;
+  klass->tree_move = real_tree_move;
+  klass->change_focus_row_expansion = change_focus_row_expansion;
 
-      if (!ctree_row->expanded)
-       gdk_draw_line (clist->clist_window, style->fg_gc[GTK_STATE_NORMAL],
-                      x + PM_SIZE / 2, y + 2,
-                      x + PM_SIZE / 2, y + PM_SIZE - 2);
+  g_object_class_install_property (gobject_class,
+                               ARG_N_COLUMNS,
+                               g_param_spec_uint ("n-columns",
+                               "N-Columns",
+                               "N-Columns",
+                               1,
+                               G_MAXINT,
+                               1,
+                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property (gobject_class,
+                               ARG_TREE_COLUMN,
+                               g_param_spec_uint ("tree-column",
+                               "tree-column",
+                               "tree-column",
+                               0,
+                               G_MAXINT,
+                               0,
+                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
+  g_object_class_install_property (gobject_class,
+                               ARG_INDENT,
+                               g_param_spec_uint ("indent",
+                               "indent",
+                               "indent",
+                               1,
+                               G_MAXINT,
+                               1,
+                               G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                               ARG_SPACING,
+                               g_param_spec_uint ("spacing",
+                               "spacing",
+                               "spacing",
+                               1,
+                               G_MAXINT,
+                               1,
+                               G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                               ARG_SHOW_STUB,
+                               g_param_spec_boolean ("show-stub",
+                               "show-stub",
+                               "show-stub",
+                               TRUE,
+                               G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                               ARG_LINE_STYLE,
+                               g_param_spec_enum ("line-style",
+                               "line-style",
+                               "line-style",
+                               GTK_TYPE_CMCTREE_LINE_STYLE, 0,
+                               G_PARAM_READWRITE));
+  g_object_class_install_property (gobject_class,
+                               ARG_EXPANDER_STYLE,
+                               g_param_spec_enum ("expander-style",
+                               "expander-style",
+                               "expander-style",
+                               GTK_TYPE_CMCTREE_EXPANDER_STYLE, 0,
+                               G_PARAM_READWRITE));
 
-      if (justification_factor == 1)
-       x += justification_factor * (PM_SIZE + 1);
-      break;
-    }
+  ctree_signals[TREE_SELECT_ROW] =
+               g_signal_new ("tree_select_row",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_select_row),
+                             NULL, NULL,
+                             claws_marshal_VOID__POINTER_INT,
+                             G_TYPE_NONE, 2,
+                             GTK_TYPE_CMCTREE_NODE,
+                             G_TYPE_INT);
+  ctree_signals[TREE_UNSELECT_ROW] =
+               g_signal_new ("tree_unselect_row",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_unselect_row),
+                             NULL, NULL,
+                             claws_marshal_VOID__POINTER_INT,
+                             G_TYPE_NONE, 2,
+                             GTK_TYPE_CMCTREE_NODE,
+                             G_TYPE_INT);
+  ctree_signals[TREE_EXPAND] =
+               g_signal_new ("tree_expand",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_expand),
+                             NULL, NULL,
+                             claws_marshal_VOID__POINTER,
+                             G_TYPE_NONE, 1,
+                             GTK_TYPE_CMCTREE_NODE);
+  ctree_signals[TREE_COLLAPSE] =
+               g_signal_new ("tree_collapse",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_collapse),
+                             NULL, NULL,
+                             claws_marshal_VOID__POINTER,
+                             G_TYPE_NONE, 1,
+                             GTK_TYPE_CMCTREE_NODE);
+  ctree_signals[TREE_MOVE] =
+               g_signal_new ("tree_move",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_LAST,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, tree_move),
+                             NULL, NULL,
+                             claws_marshal_VOID__POINTER_POINTER_POINTER,
+                             G_TYPE_NONE, 3,
+                             GTK_TYPE_CMCTREE_NODE,GTK_TYPE_CMCTREE_NODE,GTK_TYPE_CMCTREE_NODE);
+  ctree_signals[CHANGE_FOCUS_ROW_EXPANSION] =
+               g_signal_new ("change_focus_row_expansion",
+                             G_TYPE_FROM_CLASS (object_class),
+                             G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                             G_STRUCT_OFFSET (GtkCMCTreeClass, change_focus_row_expansion),
+                             NULL, NULL,
+                             claws_marshal_VOID__ENUM,
+                             G_TYPE_NONE, 1, GTK_TYPE_CMCTREE_EXPANSION_TYPE);
 
-  gdk_gc_set_clip_rectangle (style->fg_gc[GTK_STATE_NORMAL], NULL);
-  gdk_gc_set_clip_rectangle (style->base_gc[GTK_STATE_NORMAL], NULL);
+  binding_set = gtk_binding_set_by_class (klass);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_plus, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_plus, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE);
 
-  return x;
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Add, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Add, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE);
+  
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_minus, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_COLLAPSE);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_minus, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM,
+                               GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Subtract, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_COLLAPSE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Subtract, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM,
+                               GTK_CMCTREE_EXPANSION_COLLAPSE_RECURSIVE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_equal, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Equal, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Multiply, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_asterisk, 0,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_TOGGLE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_KP_Multiply, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM,
+                               GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE);
+  gtk_binding_entry_add_signal (binding_set,
+                               GDK_KEY_asterisk, GDK_CONTROL_MASK,
+                               "change_focus_row_expansion", 1,
+                               G_TYPE_ENUM,
+                               GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE);  
 }
 
-
-static gint
-gtk_cmctree_draw_lines (GtkCMCTree     *ctree,
-                     GtkCMCTreeRow  *ctree_row,
-                     gint          row,
-                     gint          column,
-                     gint          state,
-                     GdkRectangle *clip_rectangle,
-                     GdkRectangle *cell_rectangle,
-                     GdkRectangle *crect,
-                     GdkRectangle *area,
-                     GtkStyle     *style)
+static void
+gtk_cmctree_set_arg (GObject *object,
+                               guint      arg_id,
+                               const GValue *value,
+                               GParamSpec *spec)
 {
+  GtkCMCTree *ctree;
   GtkCMCList *clist;
-  GtkCMCTreeNode *node;
-  GtkCMCTreeNode *parent;
-  GdkRectangle tree_rectangle;
-  GdkRectangle tc_rectangle;
-  GdkGC *bg_gc;
-  gint offset;
-  gint offset_x;
-  gint offset_y;
-  gint xcenter;
-  gint ycenter;
-  gint next_level;
-  gint column_right;
-  gint column_left;
-  gint justify_right;
-  gint justification_factor;
-  
-  clist = GTK_CMCLIST (ctree);
-  ycenter = clip_rectangle->y + (clip_rectangle->height / 2);
-  justify_right = (clist->column[column].justification == GTK_JUSTIFY_RIGHT);
 
-  if (justify_right)
-    {
-      offset = (clip_rectangle->x + clip_rectangle->width - 1 -
-               ctree->tree_indent * (ctree_row->level - 1));
-      justification_factor = -1;
-    }
-  else
-    {
-      offset = clip_rectangle->x + ctree->tree_indent * (ctree_row->level - 1);
-      justification_factor = 1;
-    }
+  ctree = GTK_CMCTREE (object);
+  clist = GTK_CMCLIST (ctree);
 
-  switch (ctree->line_style)
+  switch (arg_id)
     {
-    case GTK_CMCTREE_LINES_NONE:
+    case ARG_N_COLUMNS: /* construct-only arg, only set at construction time */
+#if !GLIB_CHECK_VERSION(2,10,0)
+      cm_return_if_fail (clist->row_mem_chunk == NULL);
+#endif
+      clist->columns = MAX (1, g_value_get_uint (value));
+#if !GLIB_CHECK_VERSION(2,10,0)
+      clist->row_mem_chunk = g_mem_chunk_new ("ctree row mem chunk",
+                                             sizeof (GtkCMCTreeRow),
+                                             sizeof (GtkCMCTreeRow)
+                                             * CLIST_OPTIMUM_SIZE,
+                                             G_ALLOC_AND_FREE);
+      clist->cell_mem_chunk = g_mem_chunk_new ("ctree cell mem chunk",
+                                              sizeof (GtkCMCell) * clist->columns,
+                                              sizeof (GtkCMCell) * clist->columns
+                                              * CLIST_OPTIMUM_SIZE,
+                                              G_ALLOC_AND_FREE);
+#endif
+      ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns);
       break;
-    case GTK_CMCTREE_LINES_TABBED:
-      xcenter = offset + justification_factor * TAB_SIZE;
-
-      column_right = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) +
-                     clist->column[ctree->tree_column].area.width +
-                     COLUMN_INSET);
-      column_left = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) -
-                    COLUMN_INSET - CELL_SPACING);
-
-      if (area)
-       {
-         tree_rectangle.y = crect->y;
-         tree_rectangle.height = crect->height;
-
-         if (justify_right)
-           {
-             tree_rectangle.x = xcenter;
-             tree_rectangle.width = column_right - xcenter;
-           }
-         else
-           {
-             tree_rectangle.x = column_left;
-             tree_rectangle.width = xcenter - column_left;
-           }
-
-         if (!gdk_rectangle_intersect (area, &tree_rectangle, &tc_rectangle))
-           {
-             offset += justification_factor * 3;
-             break;
-           }
-       }
-
-      gdk_gc_set_clip_rectangle (ctree->lines_gc, crect);
-
-      next_level = ctree_row->level;
-
-      if (!ctree_row->sibling || (ctree_row->children && ctree_row->expanded))
-       {
-         node = gtk_cmctree_find_node_ptr (ctree, ctree_row);
-         if (GTK_CMCTREE_NODE_NEXT (node))
-           next_level = GTK_CMCTREE_ROW (GTK_CMCTREE_NODE_NEXT (node))->level;
-         else
-           next_level = 0;
-       }
-
-      if (ctree->tree_indent > 0)
-       {
-         node = ctree_row->parent;
-         while (node)
-           {
-             xcenter -= (justification_factor * ctree->tree_indent);
-
-             if ((justify_right && xcenter < column_left) ||
-                 (!justify_right && xcenter > column_right))
-               {
-                 node = GTK_CMCTREE_ROW (node)->parent;
-                 continue;
-               }
-
-             tree_rectangle.y = cell_rectangle->y;
-             tree_rectangle.height = cell_rectangle->height;
-             if (justify_right)
-               {
-                 tree_rectangle.x = MAX (xcenter - ctree->tree_indent + 1,
-                                         column_left);
-                 tree_rectangle.width = MIN (xcenter - column_left,
-                                             ctree->tree_indent);
-               }
-             else
-               {
-                 tree_rectangle.x = xcenter;
-                 tree_rectangle.width = MIN (column_right - xcenter,
-                                             ctree->tree_indent);
-               }
-
-             if (!area || gdk_rectangle_intersect (area, &tree_rectangle,
-                                                   &tc_rectangle))
-               {
-                 get_cell_style (clist, &GTK_CMCTREE_ROW (node)->row,
-                                 state, column, NULL, NULL, &bg_gc);
-
-                 if (bg_gc == clist->bg_gc)
-                   gdk_gc_set_foreground
-                     (clist->bg_gc, &GTK_CMCTREE_ROW (node)->row.background);
-
-                 if (!area)
-                   gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE,
-                                       tree_rectangle.x,
-                                       tree_rectangle.y,
-                                       tree_rectangle.width,
-                                       tree_rectangle.height);
-                 else 
-                   gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE,
-                                       tc_rectangle.x,
-                                       tc_rectangle.y,
-                                       tc_rectangle.width,
-                                       tc_rectangle.height);
-               }
-             if (next_level > GTK_CMCTREE_ROW (node)->level)
-               gdk_draw_line (clist->clist_window, ctree->lines_gc,
-                              xcenter, crect->y,
-                              xcenter, crect->y + crect->height);
-             else
-               {
-                 gint width;
-
-                 offset_x = MIN (ctree->tree_indent, 2 * TAB_SIZE);
-                 width = offset_x / 2 + offset_x % 2;
-
-                 parent = GTK_CMCTREE_ROW (node)->parent;
-
-                 tree_rectangle.y = ycenter;
-                 tree_rectangle.height = (cell_rectangle->y - ycenter +
-                                          cell_rectangle->height);
-
-                 if (justify_right)
-                   {
-                     tree_rectangle.x = MAX(xcenter + 1 - width, column_left);
-                     tree_rectangle.width = MIN (xcenter + 1 - column_left,
-                                                 width);
-                   }
-                 else
-                   {
-                     tree_rectangle.x = xcenter;
-                     tree_rectangle.width = MIN (column_right - xcenter,
-                                                 width);
-                   }
-
-                 if (!area ||
-                     gdk_rectangle_intersect (area, &tree_rectangle,
-                                              &tc_rectangle))
-                   {
-                     if (parent)
-                       {
-                         get_cell_style (clist, &GTK_CMCTREE_ROW (parent)->row,
-                                         state, column, NULL, NULL, &bg_gc);
-                         if (bg_gc == clist->bg_gc)
-                           gdk_gc_set_foreground
-                             (clist->bg_gc,
-                              &GTK_CMCTREE_ROW (parent)->row.background);
-                       }
-                     else if (state == GTK_STATE_SELECTED)
-                       bg_gc = style->base_gc[state];
-                     else
-                       bg_gc = GTK_WIDGET (clist)->style->base_gc[state];
-
-                     if (!area)
-                       gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE,
-                                           tree_rectangle.x,
-                                           tree_rectangle.y,
-                                           tree_rectangle.width,
-                                           tree_rectangle.height);
-                     else
-                       gdk_draw_rectangle (clist->clist_window,
-                                           bg_gc, TRUE,
-                                           tc_rectangle.x,
-                                           tc_rectangle.y,
-                                           tc_rectangle.width,
-                                           tc_rectangle.height);
-                   }
-
-                 get_cell_style (clist, &GTK_CMCTREE_ROW (node)->row,
-                                 state, column, NULL, NULL, &bg_gc);
-                 if (bg_gc == clist->bg_gc)
-                   gdk_gc_set_foreground
-                     (clist->bg_gc, &GTK_CMCTREE_ROW (node)->row.background);
-
-                 gdk_gc_set_clip_rectangle (bg_gc, crect);
-                 gdk_draw_arc (clist->clist_window, bg_gc, TRUE,
-                               xcenter - (justify_right * offset_x),
-                               cell_rectangle->y,
-                               offset_x, clist->row_height,
-                               (180 + (justify_right * 90)) * 64, 90 * 64);
-                 gdk_gc_set_clip_rectangle (bg_gc, NULL);
-
-                 gdk_draw_line (clist->clist_window, ctree->lines_gc, 
-                                xcenter, cell_rectangle->y, xcenter, ycenter);
-
-                 if (justify_right)
-                   gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE,
-                                 xcenter - offset_x, cell_rectangle->y,
-                                 offset_x, clist->row_height,
-                                 270 * 64, 90 * 64);
-                 else
-                   gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE,
-                                 xcenter, cell_rectangle->y,
-                                 offset_x, clist->row_height,
-                                 180 * 64, 90 * 64);
-               }
-             node = GTK_CMCTREE_ROW (node)->parent;
-           }
-       }
-
-      if (state != GTK_STATE_SELECTED)
-       {
-         tree_rectangle.y = clip_rectangle->y;
-         tree_rectangle.height = clip_rectangle->height;
-         tree_rectangle.width = COLUMN_INSET + CELL_SPACING +
-           MIN (clist->column[ctree->tree_column].area.width + COLUMN_INSET,
-                TAB_SIZE);
-
-         if (justify_right)
-           tree_rectangle.x = MAX (xcenter + 1, column_left);
-         else
-           tree_rectangle.x = column_left;
-
-         if (!area)
-           gdk_draw_rectangle (clist->clist_window,
-                               GTK_WIDGET
-                               (ctree)->style->base_gc[GTK_STATE_NORMAL],
-                               TRUE,
-                               tree_rectangle.x,
-                               tree_rectangle.y,
-                               tree_rectangle.width,
-                               tree_rectangle.height);
-         else if (gdk_rectangle_intersect (area, &tree_rectangle,
-                                           &tc_rectangle))
-           gdk_draw_rectangle (clist->clist_window,
-                               GTK_WIDGET
-                               (ctree)->style->base_gc[GTK_STATE_NORMAL],
-                               TRUE,
-                               tc_rectangle.x,
-                               tc_rectangle.y,
-                               tc_rectangle.width,
-                               tc_rectangle.height);
-       }
-
-      xcenter = offset + (justification_factor * ctree->tree_indent / 2);
-
-      get_cell_style (clist, &ctree_row->row, state, column, NULL, NULL,
-                     &bg_gc);
-      if (bg_gc == clist->bg_gc)
-       gdk_gc_set_foreground (clist->bg_gc, &ctree_row->row.background);
-
-      gdk_gc_set_clip_rectangle (bg_gc, crect);
-      if (ctree_row->is_leaf)
-       {
-         GdkPoint points[6];
-
-         points[0].x = offset + justification_factor * TAB_SIZE;
-         points[0].y = cell_rectangle->y;
-
-         points[1].x = points[0].x - justification_factor * 4;
-         points[1].y = points[0].y;
-
-         points[2].x = points[1].x - justification_factor * 2;
-         points[2].y = points[1].y + 3;
-
-         points[3].x = points[2].x;
-         points[3].y = points[2].y + clist->row_height - 5;
-
-         points[4].x = points[3].x + justification_factor * 2;
-         points[4].y = points[3].y + 3;
-
-         points[5].x = points[4].x + justification_factor * 4;
-         points[5].y = points[4].y;
-
-         gdk_draw_polygon (clist->clist_window, bg_gc, TRUE, points, 6);
-         gdk_draw_lines (clist->clist_window, ctree->lines_gc, points, 6);
-       }
-      else 
-       {
-         gdk_draw_arc (clist->clist_window, bg_gc, TRUE,
-                       offset - (justify_right * 2 * TAB_SIZE),
-                       cell_rectangle->y,
-                       2 * TAB_SIZE, clist->row_height,
-                       (90 + (180 * justify_right)) * 64, 180 * 64);
-         gdk_draw_arc (clist->clist_window, ctree->lines_gc, FALSE,
-                       offset - (justify_right * 2 * TAB_SIZE),
-                       cell_rectangle->y,
-                       2 * TAB_SIZE, clist->row_height,
-                       (90 + (180 * justify_right)) * 64, 180 * 64);
-       }
-      gdk_gc_set_clip_rectangle (bg_gc, NULL);
-      gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
-
-      offset += justification_factor * 3;
+    case ARG_TREE_COLUMN: /* construct-only arg, only set at construction time */
+      ctree->tree_column = g_value_get_uint (value);
+#if !GLIB_CHECK_VERSION(2,10,0)
+      if (clist->row_mem_chunk)
+#endif
+        ctree->tree_column = CLAMP (ctree->tree_column, 0, clist->columns);
+      break;
+    case ARG_INDENT:
+      gtk_cmctree_set_indent (ctree, g_value_get_uint (value));
+      break;
+    case ARG_SPACING:
+      gtk_cmctree_set_spacing (ctree, g_value_get_uint (value));
+      break;
+    case ARG_SHOW_STUB:
+      gtk_cmctree_set_show_stub (ctree, g_value_get_boolean (value));
+      break;
+    case ARG_LINE_STYLE:
+      gtk_cmctree_set_line_style (ctree, g_value_get_enum (value));
+      break;
+    case ARG_EXPANDER_STYLE:
+      gtk_cmctree_set_expander_style (ctree, g_value_get_enum (value));
       break;
     default:
-      xcenter = offset + justification_factor * PM_SIZE / 2;
-
-      if (area)
-       {
-         tree_rectangle.y = crect->y;
-         tree_rectangle.height = crect->height;
-
-         if (justify_right)
-           {
-             tree_rectangle.x = xcenter - PM_SIZE / 2 - 2;
-             tree_rectangle.width = (clip_rectangle->x +
-                                     clip_rectangle->width -tree_rectangle.x);
-           }
-         else
-           {
-             tree_rectangle.x = clip_rectangle->x + PM_SIZE / 2;
-             tree_rectangle.width = (xcenter + PM_SIZE / 2 + 2 -
-                                     clip_rectangle->x);
-           }
-
-         if (!gdk_rectangle_intersect (area, &tree_rectangle, &tc_rectangle))
-           break;
-       }
-
-      offset_x = 1;
-      offset_y = 0;
-      if (ctree->line_style == GTK_CMCTREE_LINES_DOTTED)
-       {
-         offset_x += abs((clip_rectangle->x + clist->hoffset) % 2);
-         offset_y  = abs((cell_rectangle->y + clist->voffset) % 2);
-       }
-
-      clip_rectangle->y--;
-      clip_rectangle->height++;
-      gdk_gc_set_clip_rectangle (ctree->lines_gc, clip_rectangle);
-      gdk_draw_line (clist->clist_window, ctree->lines_gc,
-                    xcenter,
-                    (ctree->show_stub || clist->row_list->data != ctree_row) ?
-                    cell_rectangle->y + offset_y : ycenter,
-                    xcenter,
-                    (ctree_row->sibling) ? crect->y +crect->height : ycenter);
-
-      gdk_draw_line (clist->clist_window, ctree->lines_gc,
-                    xcenter + (justification_factor * offset_x), ycenter,
-                    xcenter + (justification_factor * (PM_SIZE / 2 + 2)),
-                    ycenter);
-
-      node = ctree_row->parent;
-      while (node)
-       {
-         xcenter -= (justification_factor * ctree->tree_indent);
-
-         if (GTK_CMCTREE_ROW (node)->sibling)
-           gdk_draw_line (clist->clist_window, ctree->lines_gc, 
-                          xcenter, cell_rectangle->y + offset_y,
-                          xcenter, crect->y + crect->height);
-         node = GTK_CMCTREE_ROW (node)->parent;
-       }
-      gdk_gc_set_clip_rectangle (ctree->lines_gc, NULL);
-      clip_rectangle->y++;
-      clip_rectangle->height--;
       break;
     }
-  return offset;
 }
 
 static void
-draw_row (GtkCMCList     *clist,
-         GdkRectangle *area,
-         gint          row,
-         GtkCMCListRow  *clist_row)
+gtk_cmctree_get_arg (GObject *object,
+                               guint      arg_id,
+                               GValue *value,
+                               GParamSpec *spec)
 {
-  GtkWidget *widget;
-  GtkCMCTree  *ctree;
-  GdkRectangle *crect;
-  GdkRectangle row_rectangle;
-  GdkRectangle cell_rectangle; 
-  GdkRectangle clip_rectangle;
-  GdkRectangle intersect_rectangle;
-  gint last_column;
-  gint column_left = 0;
-  gint column_right = 0;
-  gint offset = 0;
-  gint state;
-  gint i;
-
-  g_return_if_fail (clist != NULL);
-
-  /* bail now if we arn't drawable yet */
-  if (!GTK_WIDGET_DRAWABLE (clist) || row < 0 || row >= clist->rows)
-    return;
-
-  widget = GTK_WIDGET (clist);
-  ctree  = GTK_CMCTREE  (clist);
-
-  /* if the function is passed the pointer to the row instead of null,
-   * it avoids this expensive lookup */
-  if (!clist_row)
-    clist_row = (g_list_nth (clist->row_list, row))->data;
-
-  /* rectangle of the entire row */
-  row_rectangle.x = 0;
-  row_rectangle.y = ROW_TOP_YPIXEL (clist, row);
-  row_rectangle.width = clist->clist_window_width;
-  row_rectangle.height = clist->row_height;
-
-  /* rectangle of the cell spacing above the row */
-  cell_rectangle.x = 0;
-  cell_rectangle.y = row_rectangle.y - CELL_SPACING;
-  cell_rectangle.width = row_rectangle.width;
-  cell_rectangle.height = CELL_SPACING;
+  GtkCMCTree *ctree;
 
-  /* rectangle used to clip drawing operations, its y and height
-   * positions only need to be set once, so we set them once here. 
-   * the x and width are set withing the drawing loop below once per
-   * column */
-  clip_rectangle.y = row_rectangle.y;
-  clip_rectangle.height = row_rectangle.height;
+  ctree = GTK_CMCTREE (object);
 
-  if (clist_row->state == GTK_STATE_NORMAL)
+  switch (arg_id)
     {
-      if (clist_row->fg_set)
-       gdk_gc_set_foreground (clist->fg_gc, &clist_row->foreground);
-      if (clist_row->bg_set)
-       gdk_gc_set_foreground (clist->bg_gc, &clist_row->background);
+    case ARG_N_COLUMNS:
+      g_value_set_uint(value, GTK_CMCLIST (ctree)->columns);
+      break;
+    case ARG_TREE_COLUMN:
+      g_value_set_uint(value, ctree->tree_column);
+      break;
+    case ARG_INDENT:
+      g_value_set_uint(value, ctree->tree_indent);
+      break;
+    case ARG_SPACING:
+      g_value_set_uint(value, ctree->tree_spacing);
+      break;
+    case ARG_SHOW_STUB:
+      g_value_set_boolean(value, ctree->show_stub);
+      break;
+    case ARG_LINE_STYLE:
+      g_value_set_enum(value, ctree->line_style);
+      break;
+    case ARG_EXPANDER_STYLE:
+      g_value_set_enum(value, ctree->expander_style);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, arg_id, spec);
+      break;
     }
-  
-  state = clist_row->state;
-
-  gdk_gc_set_foreground (ctree->lines_gc,
-                        &widget->style->fg[clist_row->state]);
-
-  /* draw the cell borders */
-  if (area)
-    {
-      crect = &intersect_rectangle;
+}
 
-      if (gdk_rectangle_intersect (area, &cell_rectangle, crect))
-       gdk_draw_rectangle (clist->clist_window,
-                           widget->style->base_gc[GTK_STATE_NORMAL], TRUE,
-                           crect->x, crect->y, crect->width, crect->height);
-    }
-  else
-    {
-      crect = &cell_rectangle;
+static void
+gtk_cmctree_init (GtkCMCTree *ctree)
+{
+  GtkCMCList *clist;
 
-      gdk_draw_rectangle (clist->clist_window,
-                         widget->style->base_gc[GTK_STATE_NORMAL], TRUE,
-                         crect->x, crect->y, crect->width, crect->height);
-    }
+  GTK_CMCLIST_SET_FLAG (ctree, CMCLIST_DRAW_DRAG_RECT);
+  GTK_CMCLIST_SET_FLAG (ctree, CMCLIST_DRAW_DRAG_LINE);
 
-  /* horizontal black lines */
-  if (ctree->line_style == GTK_CMCTREE_LINES_TABBED)
-    { 
+  clist = GTK_CMCLIST (ctree);
 
-      column_right = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) +
-                     clist->column[ctree->tree_column].area.width +
-                     COLUMN_INSET);
-      column_left = (COLUMN_LEFT_XPIXEL (clist, ctree->tree_column) -
-                    COLUMN_INSET - (ctree->tree_column != 0) * CELL_SPACING);
+  ctree->tree_indent    = 20;
+  ctree->tree_spacing   = 5;
+  ctree->tree_column    = 0;
+  ctree->line_style     = GTK_CMCTREE_LINES_NONE;
+  ctree->expander_style = GTK_CMCTREE_EXPANDER_TRIANGLE;
+  ctree->drag_compare   = NULL;
+  ctree->show_stub      = TRUE;
 
-      switch (clist->column[ctree->tree_column].justification)
-       {
-       case GTK_JUSTIFY_CENTER:
-       case GTK_JUSTIFY_FILL:
-       case GTK_JUSTIFY_LEFT:
-         offset = (column_left + ctree->tree_indent *
-                   (((GtkCMCTreeRow *)clist_row)->level - 1));
-
-         gdk_draw_line (clist->clist_window, ctree->lines_gc, 
-                        MIN (offset + TAB_SIZE, column_right),
-                        cell_rectangle.y,
-                        clist->clist_window_width, cell_rectangle.y);
-         break;
-       case GTK_JUSTIFY_RIGHT:
-         offset = (column_right - 1 - ctree->tree_indent *
-                   (((GtkCMCTreeRow *)clist_row)->level - 1));
-
-         gdk_draw_line (clist->clist_window, ctree->lines_gc,
-                        -1, cell_rectangle.y,
-                        MAX (offset - TAB_SIZE, column_left),
-                        cell_rectangle.y);
-         break;
-       }
-    }
+  clist->button_actions[0] |= GTK_CMBUTTON_EXPANDS;
+}
 
-  /* the last row has to clear its bottom cell spacing too */
-  if (clist_row == clist->row_list_end->data)
-    {
-      cell_rectangle.y += clist->row_height + CELL_SPACING;
+static void
+ctree_attach_styles (GtkCMCTree     *ctree,
+                    GtkCMCTreeNode *node,
+                    gpointer      data)
+{
+  GtkCMCList *clist;
+  gint i;
 
-      if (!area || gdk_rectangle_intersect (area, &cell_rectangle, crect))
-       {
-         gdk_draw_rectangle (clist->clist_window,
-                             widget->style->base_gc[GTK_STATE_NORMAL], TRUE,
-                             crect->x, crect->y, crect->width, crect->height);
-
-         /* horizontal black lines */
-         if (ctree->line_style == GTK_CMCTREE_LINES_TABBED)
-           { 
-             switch (clist->column[ctree->tree_column].justification)
-               {
-               case GTK_JUSTIFY_CENTER:
-               case GTK_JUSTIFY_FILL:
-               case GTK_JUSTIFY_LEFT:
-                 gdk_draw_line (clist->clist_window, ctree->lines_gc, 
-                                MIN (column_left + TAB_SIZE + COLUMN_INSET +
-                                     (((GtkCMCTreeRow *)clist_row)->level > 1) *
-                                     MIN (ctree->tree_indent / 2, TAB_SIZE),
-                                     column_right),
-                                cell_rectangle.y,
-                                clist->clist_window_width, cell_rectangle.y);
-                 break;
-               case GTK_JUSTIFY_RIGHT:
-                 gdk_draw_line (clist->clist_window, ctree->lines_gc, 
-                                -1, cell_rectangle.y,
-                                MAX (column_right - TAB_SIZE - 1 -
-                                     COLUMN_INSET -
-                                     (((GtkCMCTreeRow *)clist_row)->level > 1) *
-                                     MIN (ctree->tree_indent / 2, TAB_SIZE),
-                                     column_left - 1), cell_rectangle.y);
-                 break;
-               }
-           }
-       }
-    }    
+  clist = GTK_CMCLIST (ctree);
 
-  for (last_column = clist->columns - 1;
-       last_column >= 0 && !clist->column[last_column].visible; last_column--)
-    ;
+  if (GTK_CMCTREE_ROW (node)->row.style)
+    GTK_CMCTREE_ROW (node)->row.style =
+      gtk_style_attach (GTK_CMCTREE_ROW (node)->row.style, clist->clist_window);
 
-  /* iterate and draw all the columns (row cells) and draw their contents */
-  for (i = 0; i < clist->columns; i++)
+  if (GTK_CMCTREE_ROW (node)->row.fg_set || GTK_CMCTREE_ROW (node)->row.bg_set)
     {
-      GtkStyle *style;
-      GdkGC *fg_gc; 
-      GdkGC *bg_gc;
-      PangoLayout *layout = NULL;
-      PangoRectangle logical_rect;
-
-      gint width;
-      gint height;
-      gint pixmap_width;
-      gint string_width;
-      gint old_offset;
-
-      if (!clist->column[i].visible)
-       continue;
-
-      get_cell_style (clist, clist_row, state, i, &style, &fg_gc, &bg_gc);
-
-      /* calculate clipping region */
-      clip_rectangle.x = clist->column[i].area.x + clist->hoffset;
-      clip_rectangle.width = clist->column[i].area.width;
-
-      cell_rectangle.x = clip_rectangle.x - COLUMN_INSET - CELL_SPACING;
-      cell_rectangle.width = (clip_rectangle.width + 2 * COLUMN_INSET +
-                             (1 + (i == last_column)) * CELL_SPACING);
-      cell_rectangle.y = clip_rectangle.y;
-      cell_rectangle.height = clip_rectangle.height;
-
-      string_width = 0;
-      pixmap_width = 0;
-
-      if (area && !gdk_rectangle_intersect (area, &cell_rectangle,
-                                           &intersect_rectangle))
-       {
-         if (i != ctree->tree_column)
-           continue;
-       }
-      else
-       {
-         gdk_draw_rectangle (clist->clist_window, bg_gc, TRUE,
-                             crect->x, crect->y, crect->width, crect->height);
-
-
-         layout = _gtk_cmclist_create_cell_layout (clist, clist_row, i);
-         if (layout)
-           {
-             pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
-             width = logical_rect.width;
-           }
-         else
-           width = 0;
-
-         switch (clist_row->cell[i].type)
-           {
-           case GTK_CMCELL_PIXMAP:
-             gdk_drawable_get_size
-               (GTK_CMCELL_PIXMAP (clist_row->cell[i])->pixmap, &pixmap_width,
-                &height);
-             width += pixmap_width;
-             break;
-           case GTK_CMCELL_PIXTEXT:
-             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap)
-               {
-                 gdk_drawable_get_size 
-                   (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap,
-                    &pixmap_width, &height);
-                 width += pixmap_width;
-               }
-
-             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->text &&
-                 GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap)
-               width +=  GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
-
-             if (i == ctree->tree_column)
-               width += (ctree->tree_indent *
-                         ((GtkCMCTreeRow *)clist_row)->level);
-             break;
-           default:
-             break;
-           }
+      GdkColormap *colormap;
 
-         switch (clist->column[i].justification)
-           {
-           case GTK_JUSTIFY_LEFT:
-             offset = clip_rectangle.x + clist_row->cell[i].horizontal;
-             break;
-           case GTK_JUSTIFY_RIGHT:
-             offset = (clip_rectangle.x + clist_row->cell[i].horizontal +
-                       clip_rectangle.width - width);
-             break;
-           case GTK_JUSTIFY_CENTER:
-           case GTK_JUSTIFY_FILL:
-             offset = (clip_rectangle.x + clist_row->cell[i].horizontal +
-                       (clip_rectangle.width / 2) - (width / 2));
-             break;
-           };
+      colormap = gtk_widget_get_colormap (GTK_WIDGET (ctree));
+      if (GTK_CMCTREE_ROW (node)->row.fg_set)
+       gdk_colormap_alloc_color (colormap, &(GTK_CMCTREE_ROW (node)->row.foreground), TRUE, TRUE);
+      if (GTK_CMCTREE_ROW (node)->row.bg_set)
+       gdk_colormap_alloc_color (colormap, &(GTK_CMCTREE_ROW (node)->row.background), TRUE, TRUE);
+    }
 
-         if (i != ctree->tree_column)
-           {
-             offset += clist_row->cell[i].horizontal;
-             switch (clist_row->cell[i].type)
-               {
-               case GTK_CMCELL_PIXMAP:
-                 draw_cell_pixmap
-                   (clist->clist_window, &clip_rectangle, fg_gc,
-                    GTK_CMCELL_PIXMAP (clist_row->cell[i])->pixmap,
-                    GTK_CMCELL_PIXMAP (clist_row->cell[i])->mask,
-                    offset,
-                    clip_rectangle.y + clist_row->cell[i].vertical +
-                    (clip_rectangle.height - height) / 2,
-                    pixmap_width, height);
-                 break;
-               case GTK_CMCELL_PIXTEXT:
-                 offset = draw_cell_pixmap
-                   (clist->clist_window, &clip_rectangle, fg_gc,
-                    GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap,
-                    GTK_CMCELL_PIXTEXT (clist_row->cell[i])->mask,
-                    offset,
-                    clip_rectangle.y + clist_row->cell[i].vertical +
-                    (clip_rectangle.height - height) / 2,
-                    pixmap_width, height);
-                 offset += GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
+  for (i = 0; i < clist->columns; i++)
+    if  (GTK_CMCTREE_ROW (node)->row.cell[i].style)
+      GTK_CMCTREE_ROW (node)->row.cell[i].style =
+       gtk_style_attach (GTK_CMCTREE_ROW (node)->row.cell[i].style,
+                         clist->clist_window);
+}
 
-                 /* Fall through */
-               case GTK_CMCELL_TEXT:
-                 if (layout)
-                   {
-                     gint row_center_offset = (clist->row_height - logical_rect.height) / 2;
+static void
+ctree_detach_styles (GtkCMCTree     *ctree,
+                    GtkCMCTreeNode *node,
+                    gpointer      data)
+{
+  GtkCMCList *clist;
+  gint i;
 
-                     gdk_gc_set_clip_rectangle (fg_gc, &clip_rectangle);
-                     gdk_draw_layout (clist->clist_window, fg_gc,
-                                      offset,
-                                      row_rectangle.y + row_center_offset + clist_row->cell[i].vertical,
-                                      layout);
-                     gdk_gc_set_clip_rectangle (fg_gc, NULL);
-                     g_object_unref (G_OBJECT (layout));
-                   }
-                 break;
-               default:
-                 break;
-               }
-             continue;
-           }
-       }
+  clist = GTK_CMCLIST (ctree);
 
-      if (bg_gc == clist->bg_gc)
-       gdk_gc_set_background (ctree->lines_gc, &clist_row->background);
+  if (GTK_CMCTREE_ROW (node)->row.style)
+    gtk_style_detach (GTK_CMCTREE_ROW (node)->row.style);
+  for (i = 0; i < clist->columns; i++)
+    if  (GTK_CMCTREE_ROW (node)->row.cell[i].style)
+      gtk_style_detach (GTK_CMCTREE_ROW (node)->row.cell[i].style);
+}
 
-      /* draw ctree->tree_column */
-      cell_rectangle.y -= CELL_SPACING;
-      cell_rectangle.height += CELL_SPACING;
+static void
+gtk_cmctree_realize (GtkWidget *widget)
+{
+  GtkCMCTree *ctree;
+  GtkCMCList *clist;
+  GtkCMCTreeNode *node;
+  GtkCMCTreeNode *child;
+  gint i;
 
-      if (area && !gdk_rectangle_intersect (area, &cell_rectangle,
-                                           &intersect_rectangle))
-       {
-         if (layout)
-            g_object_unref (G_OBJECT (layout));
-         continue;
-       }
+  cm_return_if_fail (GTK_IS_CMCTREE (widget));
 
-      /* draw lines */
-      offset = gtk_cmctree_draw_lines (ctree, (GtkCMCTreeRow *)clist_row, row, i,
-                                    state, &clip_rectangle, &cell_rectangle,
-                                    crect, area, style);
+  GTK_WIDGET_CLASS (parent_class)->realize (widget);
 
-      /* draw expander */
-      offset = gtk_cmctree_draw_expander (ctree, (GtkCMCTreeRow *)clist_row,
-                                       style, &clip_rectangle, offset);
+  ctree = GTK_CMCTREE (widget);
+  clist = GTK_CMCLIST (widget);
 
-      if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
-       offset -= ctree->tree_spacing;
-      else
-       offset += ctree->tree_spacing;
+  node = GTK_CMCTREE_NODE (clist->row_list);
+  for (i = 0; i < clist->rows; i++)
+    {
+      if (GTK_CMCTREE_ROW (node)->children && !GTK_CMCTREE_ROW (node)->expanded)
+       for (child = GTK_CMCTREE_ROW (node)->children; child;
+            child = GTK_CMCTREE_ROW (child)->sibling)
+         gtk_cmctree_pre_recursive (ctree, child, ctree_attach_styles, NULL);
+      node = GTK_CMCTREE_NODE_NEXT (node);
+    }
+}
 
-      if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
-       offset -= (pixmap_width + clist_row->cell[i].horizontal);
-      else
-       offset += clist_row->cell[i].horizontal;
+static void
+gtk_cmctree_unrealize (GtkWidget *widget)
+{
+  GtkCMCTree *ctree;
+  GtkCMCList *clist;
 
-      old_offset = offset;
-      offset = draw_cell_pixmap (clist->clist_window, &clip_rectangle, fg_gc,
-                                GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap,
-                                GTK_CMCELL_PIXTEXT (clist_row->cell[i])->mask,
-                                offset, 
-                                clip_rectangle.y + clist_row->cell[i].vertical
-                                + (clip_rectangle.height - height) / 2,
-                                pixmap_width, height);
+  cm_return_if_fail (GTK_IS_CMCTREE (widget));
 
-      if (layout)
-       {
-         gint row_center_offset = (clist->row_height - logical_rect.height) / 2;
-         
-         if (clist->column[i].justification == GTK_JUSTIFY_RIGHT)
-           {
-             offset = (old_offset - string_width);
-             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap)
-               offset -= GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
-           }
-         else
-           {
-             if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixmap)
-               offset += GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing;
-           }
-         
-         gdk_gc_set_clip_rectangle (fg_gc, &clip_rectangle);
-         gdk_draw_layout (clist->clist_window, fg_gc,
-                          offset,
-                          row_rectangle.y + row_center_offset + clist_row->cell[i].vertical,
-                          layout);
+  GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
 
-          g_object_unref (G_OBJECT (layout));
-       }
-      gdk_gc_set_clip_rectangle (fg_gc, NULL);
-    }
+  ctree = GTK_CMCTREE (widget);
+  clist = GTK_CMCLIST (widget);
 
-  /* draw focus rectangle */
-  if (clist->focus_row == row &&
-      GTK_WIDGET_CAN_FOCUS (widget) && GTK_WIDGET_HAS_FOCUS (widget))
+  if (gtk_widget_get_realized (widget))
     {
-      if (!area)
-       gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
-                           row_rectangle.x, row_rectangle.y,
-                           row_rectangle.width - 1, row_rectangle.height - 1);
-      else if (gdk_rectangle_intersect (area, &row_rectangle,
-                                       &intersect_rectangle))
+      GtkCMCTreeNode *node;
+      GtkCMCTreeNode *child;
+      gint i;
+
+      node = GTK_CMCTREE_NODE (clist->row_list);
+      for (i = 0; i < clist->rows; i++)
        {
-         gdk_gc_set_clip_rectangle (clist->xor_gc, &intersect_rectangle);
-         gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
-                             row_rectangle.x, row_rectangle.y,
-                             row_rectangle.width - 1,
-                             row_rectangle.height - 1);
-         gdk_gc_set_clip_rectangle (clist->xor_gc, NULL);
+         if (GTK_CMCTREE_ROW (node)->children &&
+             !GTK_CMCTREE_ROW (node)->expanded)
+           for (child = GTK_CMCTREE_ROW (node)->children; child;
+                child = GTK_CMCTREE_ROW (child)->sibling)
+             gtk_cmctree_pre_recursive(ctree, child, ctree_detach_styles, NULL);
+         node = GTK_CMCTREE_NODE_NEXT (node);
        }
     }
 }
 
-static void
-tree_draw_node (GtkCMCTree     *ctree, 
-               GtkCMCTreeNode *node)
+static gint
+gtk_cmctree_button_press (GtkWidget      *widget,
+                       GdkEventButton *event)
 {
+  GtkCMCTree *ctree;
   GtkCMCList *clist;
-  
-  clist = GTK_CMCLIST (ctree);
+  gint button_actions;
 
-  if (CLIST_UNFROZEN (clist) && gtk_cmctree_is_viewable (ctree, node))
+  cm_return_val_if_fail (GTK_IS_CMCTREE (widget), FALSE);
+  cm_return_val_if_fail (event != NULL, FALSE);
+
+  ctree = GTK_CMCTREE (widget);
+  clist = GTK_CMCLIST (widget);
+
+  button_actions = clist->button_actions[event->button - 1];
+
+  if (button_actions == GTK_CMBUTTON_IGNORED)
+    return FALSE;
+
+  if (event->window == clist->clist_window)
     {
       GtkCMCTreeNode *work;
-      gint num = 0;
-      
-      work = GTK_CMCTREE_NODE (clist->row_list);
-      while (work && work != node)
+      gint x;
+      gint y;
+      gint row;
+      gint column;
+
+      x = event->x;
+      y = event->y;
+
+      if (!gtk_cmclist_get_selection_info (clist, x, y, &row, &column))
+       return FALSE;
+
+      work = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, row));
+         
+      if (button_actions & GTK_CMBUTTON_EXPANDS &&
+         (GTK_CMCTREE_ROW (work)->children && !GTK_CMCTREE_ROW (work)->is_leaf  &&
+          (event->type == GDK_2BUTTON_PRESS ||
+           ctree_is_hot_spot (ctree, work, row, x, y))))
        {
-         work = GTK_CMCTREE_NODE_NEXT (work);
-         num++;
+         if (GTK_CMCTREE_ROW (work)->expanded)
+           gtk_cmctree_collapse (ctree, work);
+         else
+           gtk_cmctree_expand (ctree, work);
+
+         return TRUE;
        }
-      if (work && gtk_cmclist_row_is_visible (clist, num) != GTK_VISIBILITY_NONE)
-       GTK_CMCLIST_GET_CLASS (clist)->draw_row
-         (clist, NULL, num, GTK_CMCLIST_ROW ((GList *) node));
     }
+  
+  return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
+}
+
+static gint
+gtk_cmctree_get_offset(GtkCMCTree     *ctree,
+                     GtkCMCTreeRow  *ctree_row,
+                     gint          column,
+                     GdkRectangle *clip_rectangle)
+{
+  gint justify_right = (GTK_CMCLIST (ctree)->column[column].justification == GTK_JUSTIFY_RIGHT);
+
+  if (justify_right)
+      return (clip_rectangle->x + clip_rectangle->width - 1 -
+               ctree->tree_indent * (ctree_row->level - 1));
+
+  return clip_rectangle->x + ctree->tree_indent * (ctree_row->level - 1);
 }
 
 static GtkCMCTreeNode *
@@ -2188,10 +1513,10 @@ gtk_cmctree_link (GtkCMCTree     *ctree,
   gint rows = 0;
   
   if (sibling)
-    g_return_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent);
-  g_return_if_fail (node != NULL);
-  g_return_if_fail (node != sibling);
-  g_return_if_fail (node != parent);
+    cm_return_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent);
+  cm_return_if_fail (node != NULL);
+  cm_return_if_fail (node != sibling);
+  cm_return_if_fail (node != parent);
 
   clist = GTK_CMCLIST (ctree);
 
@@ -2334,8 +1659,8 @@ gtk_cmctree_unlink (GtkCMCTree     *ctree,
   GtkCMCTreeNode *parent;
   GList *list;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   clist = GTK_CMCLIST (ctree);
   
@@ -2452,7 +1777,7 @@ real_row_move (GtkCMCList *clist,
   GtkCMCTree *ctree;
   GtkCMCTreeNode *node;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   if (GTK_CMCLIST_AUTO_SORT (clist))
     return;
@@ -2503,9 +1828,9 @@ real_tree_move (GtkCMCTree     *ctree,
   GtkCMCTreeNode *work;
   gboolean visible = FALSE;
 
-  g_return_if_fail (ctree != NULL);
-  g_return_if_fail (node != NULL);
-  g_return_if_fail (!new_sibling || 
+  cm_return_if_fail (ctree != NULL);
+  cm_return_if_fail (node != NULL);
+  cm_return_if_fail (!new_sibling || 
                    GTK_CMCTREE_ROW (new_sibling)->parent == new_parent);
 
   if (new_parent && GTK_CMCTREE_ROW (new_parent)->is_leaf)
@@ -2583,12 +1908,12 @@ change_focus_row_expansion (GtkCMCTree          *ctree,
   GtkCMCList *clist;
   GtkCMCTreeNode *node;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
   if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (ctree))) && 
-      GTK_WIDGET_HAS_GRAB (ctree))
+      gtk_widget_has_grab (GTK_WIDGET(ctree)))
     return;
   
   if (!(node =
@@ -2628,7 +1953,7 @@ real_tree_expand (GtkCMCTree     *ctree,
   GtkRequisition requisition;
   gboolean visible;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (!node || GTK_CMCTREE_ROW (node)->expanded || GTK_CMCTREE_ROW (node)->is_leaf)
     return;
@@ -2646,39 +1971,24 @@ real_tree_expand (GtkCMCTree     *ctree,
     GTK_CMCLIST_GET_CLASS (clist)->cell_size_request
       (clist, &GTK_CMCTREE_ROW (node)->row, ctree->tree_column, &requisition);
 
-  /* unref/unset closed pixmap */
+  /* unref/unset closed pixbuf */
   if (GTK_CMCELL_PIXTEXT 
-      (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap)
+      (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf)
     {
       g_object_unref
        (GTK_CMCELL_PIXTEXT
-        (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap);
+        (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf);
       
       GTK_CMCELL_PIXTEXT
-       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = NULL;
-      
-      if (GTK_CMCELL_PIXTEXT 
-         (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask)
-       {
-         g_object_unref
-           (GTK_CMCELL_PIXTEXT 
-            (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask);
-         GTK_CMCELL_PIXTEXT 
-           (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = NULL;
-       }
+       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = NULL;
     }
 
-  /* set/ref opened pixmap */
-  if (GTK_CMCTREE_ROW (node)->pixmap_opened)
+  /* set/ref opened pixbuf */
+  if (GTK_CMCTREE_ROW (node)->pixbuf_opened)
     {
       GTK_CMCELL_PIXTEXT 
-       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = 
-       g_object_ref (GTK_CMCTREE_ROW (node)->pixmap_opened);
-
-      if (GTK_CMCTREE_ROW (node)->mask_opened) 
-       GTK_CMCELL_PIXTEXT 
-         (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = 
-         g_object_ref (GTK_CMCTREE_ROW (node)->mask_opened);
+       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = 
+       g_object_ref (GTK_CMCTREE_ROW (node)->pixbuf_opened);
     }
 
 
@@ -2736,7 +2046,7 @@ real_tree_expand (GtkCMCTree     *ctree,
       list = (GList *)node;
       list->next = (GList *)(GTK_CMCTREE_ROW (node)->children);
 
-      if (visible)
+      if (visible && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist))
        {
          /* resize auto_resize columns if needed */
          for (i = 0; i < clist->columns; i++)
@@ -2770,7 +2080,7 @@ real_tree_collapse (GtkCMCTree     *ctree,
   gboolean visible;
   gint level;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (!node || !GTK_CMCTREE_ROW (node)->expanded ||
       GTK_CMCTREE_ROW (node)->is_leaf)
@@ -2790,39 +2100,24 @@ real_tree_collapse (GtkCMCTree     *ctree,
     GTK_CMCLIST_GET_CLASS (clist)->cell_size_request
       (clist, &GTK_CMCTREE_ROW (node)->row, ctree->tree_column, &requisition);
 
-  /* unref/unset opened pixmap */
+  /* unref/unset opened pixbuf */
   if (GTK_CMCELL_PIXTEXT 
-      (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap)
+      (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf)
     {
       g_object_unref
        (GTK_CMCELL_PIXTEXT
-        (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap);
+        (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf);
       
       GTK_CMCELL_PIXTEXT
-       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = NULL;
-      
-      if (GTK_CMCELL_PIXTEXT 
-         (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask)
-       {
-         g_object_unref
-           (GTK_CMCELL_PIXTEXT 
-            (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask);
-         GTK_CMCELL_PIXTEXT 
-           (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = NULL;
-       }
+       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = NULL;
     }
 
-  /* set/ref closed pixmap */
-  if (GTK_CMCTREE_ROW (node)->pixmap_closed)
+  /* set/ref closed pixbuf */
+  if (GTK_CMCTREE_ROW (node)->pixbuf_closed)
     {
       GTK_CMCELL_PIXTEXT 
-       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap = 
-       g_object_ref (GTK_CMCTREE_ROW (node)->pixmap_closed);
-
-      if (GTK_CMCTREE_ROW (node)->mask_closed) 
-       GTK_CMCELL_PIXTEXT 
-         (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask = 
-         g_object_ref (GTK_CMCTREE_ROW (node)->mask_closed);
+       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = 
+       g_object_ref (GTK_CMCTREE_ROW (node)->pixbuf_closed);
     }
 
   work = GTK_CMCTREE_ROW (node)->children;
@@ -2904,8 +2199,12 @@ column_auto_resize (GtkCMCList    *clist,
       /* run a "gtk_cmclist_optimal_column_width" but break, if
        * the column doesn't shrink */
       if (GTK_CMCLIST_SHOW_TITLES (clist) && clist->column[column].button)
-       new_width = (clist->column[column].button->requisition.width -
+        {
+       GtkRequisition req;
+       gtk_widget_get_requisition (clist->column[column].button, &req);
+       new_width = (req.width -
                     (CELL_SPACING + (2 * COLUMN_INSET)));
+        }
       else
        new_width = 0;
 
@@ -2946,12 +2245,12 @@ cell_size_request (GtkCMCList       *clist,
   PangoLayout *layout;
   PangoRectangle logical_rect;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
-  g_return_if_fail (requisition != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (requisition != NULL);
 
   ctree = GTK_CMCTREE (clist);
 
-  layout = _gtk_cmclist_create_cell_layout (clist, clist_row, column);
+  layout = create_cell_layout (clist, clist_row, column);
   if (layout)
     {
       pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
@@ -2970,11 +2269,10 @@ cell_size_request (GtkCMCList       *clist,
   switch (clist_row->cell[column].type)
     {
     case GTK_CMCELL_PIXTEXT:
-      if (GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixmap)
+      if (GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf)
        {
-         gdk_drawable_get_size (GTK_CMCELL_PIXTEXT
-                              (clist_row->cell[column])->pixmap,
-                              &width, &height);
+         width = gdk_pixbuf_get_width(GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf);
+         height = gdk_pixbuf_get_height(GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf);
          width += GTK_CMCELL_PIXTEXT (clist_row->cell[column])->spacing;
        }
       else
@@ -2994,18 +2292,12 @@ cell_size_request (GtkCMCList       *clist,
            case GTK_CMCTREE_EXPANDER_TRIANGLE:
              requisition->width += PM_SIZE + 3;
              break;
-           case GTK_CMCTREE_EXPANDER_SQUARE:
-           case GTK_CMCTREE_EXPANDER_CIRCULAR:
-             requisition->width += PM_SIZE + 1;
-             break;
            }
-         if (ctree->line_style == GTK_CMCTREE_LINES_TABBED)
-           requisition->width += 3;
        }
       break;
-    case GTK_CMCELL_PIXMAP:
-      gdk_drawable_get_size (GTK_CMCELL_PIXMAP (clist_row->cell[column])->pixmap,
-                          &width, &height);
+    case GTK_CMCELL_PIXBUF:
+      width = gdk_pixbuf_get_width(GTK_CMCELL_PIXBUF (clist_row->cell[column])->pixbuf);
+      height = gdk_pixbuf_get_height(GTK_CMCELL_PIXBUF (clist_row->cell[column])->pixbuf);
       requisition->width += width;
       requisition->height = MAX (requisition->height, height);
       break;
@@ -3024,18 +2316,16 @@ set_cell_contents (GtkCMCList    *clist,
                   GtkCMCellType  type,
                   const gchar *text,
                   guint8       spacing,
-                  GdkPixmap   *pixmap,
-                  GdkBitmap   *mask)
+                  GdkPixbuf   *pixbuf)
 {
   gboolean visible = FALSE;
   GtkCMCTree *ctree;
   GtkRequisition requisition;
   gchar *old_text = NULL;
-  GdkPixmap *old_pixmap = NULL;
-  GdkBitmap *old_mask = NULL;
+  GdkPixbuf *old_pixbuf = NULL;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
-  g_return_if_fail (clist_row != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (clist_row != NULL);
 
   ctree = GTK_CMCTREE (clist);
 
@@ -3045,7 +2335,7 @@ set_cell_contents (GtkCMCList    *clist,
       GtkCMCTreeNode *parent;
 
       parent = ((GtkCMCTreeRow *)clist_row)->parent;
-      if (!parent || (parent && GTK_CMCTREE_ROW (parent)->expanded &&
+      if ((parent && GTK_CMCTREE_ROW (parent)->expanded &&
                      gtk_cmctree_is_viewable (ctree, parent)))
        {
          visible = TRUE;
@@ -3061,14 +2351,12 @@ set_cell_contents (GtkCMCList    *clist,
     case GTK_CMCELL_TEXT:
       old_text = GTK_CMCELL_TEXT (clist_row->cell[column])->text;
       break;
-    case GTK_CMCELL_PIXMAP:
-      old_pixmap = GTK_CMCELL_PIXMAP (clist_row->cell[column])->pixmap;
-      old_mask = GTK_CMCELL_PIXMAP (clist_row->cell[column])->mask;
+    case GTK_CMCELL_PIXBUF:
+      old_pixbuf = GTK_CMCELL_PIXBUF (clist_row->cell[column])->pixbuf;
       break;
     case GTK_CMCELL_PIXTEXT:
       old_text = GTK_CMCELL_PIXTEXT (clist_row->cell[column])->text;
-      old_pixmap = GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixmap;
-      old_mask = GTK_CMCELL_PIXTEXT (clist_row->cell[column])->mask;
+      old_pixbuf = GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf;
       break;
     case GTK_CMCELL_WIDGET:
       /* unimplemented */
@@ -3082,7 +2370,7 @@ set_cell_contents (GtkCMCList    *clist,
   if (column == ctree->tree_column && type != GTK_CMCELL_EMPTY)
     type = GTK_CMCELL_PIXTEXT;
 
-  /* Note that pixmap and mask were already ref'ed by the caller
+  /* Note that pixbuf and mask were already ref'ed by the caller
    */
   switch (type)
     {
@@ -3093,13 +2381,11 @@ set_cell_contents (GtkCMCList    *clist,
          GTK_CMCELL_TEXT (clist_row->cell[column])->text = g_strdup (text);
        }
       break;
-    case GTK_CMCELL_PIXMAP:
-      if (pixmap)
+    case GTK_CMCELL_PIXBUF:
+      if (pixbuf)
        {
-         clist_row->cell[column].type = GTK_CMCELL_PIXMAP;
-         GTK_CMCELL_PIXMAP (clist_row->cell[column])->pixmap = pixmap;
-         /* We set the mask even if it is NULL */
-         GTK_CMCELL_PIXMAP (clist_row->cell[column])->mask = mask;
+         clist_row->cell[column].type = GTK_CMCELL_PIXBUF;
+         GTK_CMCELL_PIXBUF (clist_row->cell[column])->pixbuf = pixbuf;
        }
       break;
     case GTK_CMCELL_PIXTEXT:
@@ -3111,24 +2397,21 @@ set_cell_contents (GtkCMCList    *clist,
            GTK_CMCELL_PIXTEXT (clist_row->cell[column])->text = g_strdup (text);
          else
            GTK_CMCELL_PIXTEXT (clist_row->cell[column])->text = NULL;
-         if (pixmap)
+         if (pixbuf)
            {
-             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixmap = pixmap;
-             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->mask = mask;
+             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf = pixbuf;
            }
          else
            {
-             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixmap = NULL;
-             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->mask = NULL;
+             GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf = NULL;
            }
        }
-      else if (text && pixmap)
+      else if (text && pixbuf)
        {
          clist_row->cell[column].type = GTK_CMCELL_PIXTEXT;
          GTK_CMCELL_PIXTEXT (clist_row->cell[column])->text = g_strdup (text);
          GTK_CMCELL_PIXTEXT (clist_row->cell[column])->spacing = spacing;
-         GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixmap = pixmap;
-         GTK_CMCELL_PIXTEXT (clist_row->cell[column])->mask = mask;
+         GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf = pixbuf;
        }
       break;
     default:
@@ -3140,10 +2423,8 @@ set_cell_contents (GtkCMCList    *clist,
     column_auto_resize (clist, clist_row, column, requisition.width);
 
   g_free (old_text);
-  if (old_pixmap)
-    g_object_unref (old_pixmap);
-  if (old_mask)
-    g_object_unref (old_mask);
+  if (old_pixbuf)
+    g_object_unref (old_pixbuf);
 }
 
 static void 
@@ -3151,42 +2432,30 @@ set_node_info (GtkCMCTree     *ctree,
               GtkCMCTreeNode *node,
               const gchar  *text,
               guint8        spacing,
-              GdkPixmap    *pixmap_closed,
-              GdkBitmap    *mask_closed,
-              GdkPixmap    *pixmap_opened,
-              GdkBitmap    *mask_opened,
+              GdkPixbuf    *pixbuf_closed,
+              GdkPixbuf    *pixbuf_opened,
               gboolean      is_leaf,
               gboolean      expanded)
 {
-  if (GTK_CMCTREE_ROW (node)->pixmap_opened)
+  if (GTK_CMCTREE_ROW (node)->pixbuf_opened)
     {
-      g_object_unref (GTK_CMCTREE_ROW (node)->pixmap_opened);
-      if (GTK_CMCTREE_ROW (node)->mask_opened) 
-       g_object_unref (GTK_CMCTREE_ROW (node)->mask_opened);
+      g_object_unref (GTK_CMCTREE_ROW (node)->pixbuf_opened);
     }
-  if (GTK_CMCTREE_ROW (node)->pixmap_closed)
+  if (GTK_CMCTREE_ROW (node)->pixbuf_closed)
     {
-      g_object_unref (GTK_CMCTREE_ROW (node)->pixmap_closed);
-      if (GTK_CMCTREE_ROW (node)->mask_closed) 
-       g_object_unref (GTK_CMCTREE_ROW (node)->mask_closed);
+      g_object_unref (GTK_CMCTREE_ROW (node)->pixbuf_closed);
     }
 
-  GTK_CMCTREE_ROW (node)->pixmap_opened = NULL;
-  GTK_CMCTREE_ROW (node)->mask_opened   = NULL;
-  GTK_CMCTREE_ROW (node)->pixmap_closed = NULL;
-  GTK_CMCTREE_ROW (node)->mask_closed   = NULL;
+  GTK_CMCTREE_ROW (node)->pixbuf_opened = NULL;
+  GTK_CMCTREE_ROW (node)->pixbuf_closed = NULL;
 
-  if (pixmap_closed)
+  if (pixbuf_closed)
     {
-      GTK_CMCTREE_ROW (node)->pixmap_closed = g_object_ref (pixmap_closed);
-      if (mask_closed) 
-       GTK_CMCTREE_ROW (node)->mask_closed = g_object_ref (mask_closed);
+      GTK_CMCTREE_ROW (node)->pixbuf_closed = g_object_ref (pixbuf_closed);
     }
-  if (pixmap_opened)
+  if (pixbuf_opened)
     {
-      GTK_CMCTREE_ROW (node)->pixmap_opened = g_object_ref (pixmap_opened);
-      if (mask_opened) 
-       GTK_CMCTREE_ROW (node)->mask_opened = g_object_ref (mask_opened);
+      GTK_CMCTREE_ROW (node)->pixbuf_opened = g_object_ref (pixbuf_opened);
     }
 
   GTK_CMCTREE_ROW (node)->is_leaf  = is_leaf;
@@ -3194,10 +2463,10 @@ set_node_info (GtkCMCTree     *ctree,
 
   if (GTK_CMCTREE_ROW (node)->expanded)
     gtk_cmctree_node_set_pixtext (ctree, node, ctree->tree_column,
-                               text, spacing, pixmap_opened, mask_opened);
+                               text, spacing, pixbuf_opened);
   else 
     gtk_cmctree_node_set_pixtext (ctree, node, ctree->tree_column,
-                               text, spacing, pixmap_closed, mask_closed);
+                               text, spacing, pixbuf_closed);
 }
 
 static void
@@ -3241,7 +2510,7 @@ tree_select (GtkCMCTree     *ctree,
 {
   if (node && GTK_CMCTREE_ROW (node)->row.state != GTK_STATE_SELECTED &&
       GTK_CMCTREE_ROW (node)->row.selectable)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], 0,
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], 0,
                     node, -1);
 }
 
@@ -3251,7 +2520,7 @@ tree_unselect (GtkCMCTree     *ctree,
               gpointer      data)
 {
   if (node && GTK_CMCTREE_ROW (node)->row.state == GTK_STATE_SELECTED)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], 0,
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], 0,
                     node, -1);
 }
 
@@ -3261,7 +2530,7 @@ tree_expand (GtkCMCTree     *ctree,
             gpointer      data)
 {
   if (node && !GTK_CMCTREE_ROW (node)->expanded)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0,node);
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0,node);
 }
 
 static void
@@ -3270,7 +2539,7 @@ tree_collapse (GtkCMCTree     *ctree,
               gpointer      data)
 {
   if (node && GTK_CMCTREE_ROW (node)->expanded)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0,node);
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0,node);
 }
 
 static void
@@ -3291,9 +2560,9 @@ tree_toggle_expansion (GtkCMCTree     *ctree,
     return;
 
   if (GTK_CMCTREE_ROW (node)->expanded)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0,node);
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0,node);
   else
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0,node);
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0,node);
 }
 
 static GtkCMCTreeRow *
@@ -3319,7 +2588,6 @@ row_new (GtkCMCTree *ctree)
       ctree_row->row.cell[i].horizontal = 0;
       ctree_row->row.cell[i].style = NULL;
     }
-
   GTK_CMCELL_PIXTEXT (ctree_row->row.cell[ctree->tree_column])->text = NULL;
 
   ctree_row->row.fg_set     = FALSE;
@@ -3335,10 +2603,8 @@ row_new (GtkCMCTree *ctree)
   ctree_row->parent        = NULL;
   ctree_row->sibling       = NULL;
   ctree_row->children      = NULL;
-  ctree_row->pixmap_closed = NULL;
-  ctree_row->mask_closed   = NULL;
-  ctree_row->pixmap_opened = NULL;
-  ctree_row->mask_opened   = NULL;
+  ctree_row->pixbuf_closed = NULL;
+  ctree_row->pixbuf_opened = NULL;
   
   return ctree_row;
 }
@@ -3355,10 +2621,10 @@ row_delete (GtkCMCTree    *ctree,
   for (i = 0; i < clist->columns; i++)
     {
       GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
-       (clist, &(ctree_row->row), i, GTK_CMCELL_EMPTY, NULL, 0, NULL, NULL);
+       (clist, &(ctree_row->row), i, GTK_CMCELL_EMPTY, NULL, 0, NULL);
       if (ctree_row->row.cell[i].style)
        {
-         if (GTK_WIDGET_REALIZED (ctree))
+         if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
            gtk_style_detach (ctree_row->row.cell[i].style);
          g_object_unref (ctree_row->row.cell[i].style);
        }
@@ -3366,28 +2632,24 @@ row_delete (GtkCMCTree    *ctree,
 
   if (ctree_row->row.style)
     {
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
        gtk_style_detach (ctree_row->row.style);
       g_object_unref (ctree_row->row.style);
     }
 
-  if (ctree_row->pixmap_closed)
+  if (ctree_row->pixbuf_closed)
     {
-      g_object_unref (ctree_row->pixmap_closed);
-      if (ctree_row->mask_closed)
-       g_object_unref (ctree_row->mask_closed);
+      g_object_unref (ctree_row->pixbuf_closed);
     }
 
-  if (ctree_row->pixmap_opened)
+  if (ctree_row->pixbuf_opened)
     {
-      g_object_unref (ctree_row->pixmap_opened);
-      if (ctree_row->mask_opened)
-       g_object_unref (ctree_row->mask_opened);
+      g_object_unref (ctree_row->pixbuf_opened);
     }
 
   if (ctree_row->row.destroy)
     {
-      GtkDestroyNotify dnotify = ctree_row->row.destroy;
+      GDestroyNotify dnotify = ctree_row->row.destroy;
       gpointer ddata = ctree_row->row.data;
 
       ctree_row->row.destroy = NULL;
@@ -3413,11 +2675,11 @@ real_select_row (GtkCMCList *clist,
 {
   GList *node;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
   
   if ((node = g_list_nth (clist->row_list, row)) &&
       GTK_CMCTREE_ROW (node)->row.selectable)
-    g_signal_emit (GTK_OBJECT (clist), ctree_signals[TREE_SELECT_ROW],0,
+    g_signal_emit (G_OBJECT (clist), ctree_signals[TREE_SELECT_ROW],0,
                     node, column);
 }
 
@@ -3429,13 +2691,38 @@ real_unselect_row (GtkCMCList *clist,
 {
   GList *node;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   if ((node = g_list_nth (clist->row_list, row)))
-    g_signal_emit (GTK_OBJECT (clist), ctree_signals[TREE_UNSELECT_ROW],0,
+    g_signal_emit (G_OBJECT (clist), ctree_signals[TREE_UNSELECT_ROW],0,
                     node, column);
 }
 
+static void
+tree_draw_node (GtkCMCTree     *ctree, 
+               GtkCMCTreeNode *node)
+{
+  GtkCMCList *clist;
+  
+  clist = GTK_CMCLIST (ctree);
+
+  if (CLIST_UNFROZEN (clist) && gtk_cmctree_is_viewable (ctree, node))
+    {
+      GtkCMCTreeNode *work;
+      gint num = 0;
+
+      work = GTK_CMCTREE_NODE (clist->row_list);
+      while (work && work != node)
+       {
+         work = GTK_CMCTREE_NODE_NEXT (work);
+         num++;
+       }
+      if (work && gtk_cmclist_row_is_visible (clist, num) != GTK_VISIBILITY_NONE)
+       GTK_CMCLIST_GET_CLASS(ctree)->draw_row
+         (clist, NULL, num, GTK_CMCLIST_ROW ((GList *) node));
+    }
+}
+
 static void
 real_tree_select (GtkCMCTree     *ctree,
                  GtkCMCTreeNode *node,
@@ -3446,7 +2733,7 @@ real_tree_select (GtkCMCTree     *ctree,
   GtkCMCTreeNode *sel_row;
   gboolean node_selected;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (!node || GTK_CMCTREE_ROW (node)->row.state == GTK_STATE_SELECTED ||
       !GTK_CMCTREE_ROW (node)->row.selectable)
@@ -3470,7 +2757,7 @@ real_tree_select (GtkCMCTree     *ctree,
          if (node == sel_row)
            node_selected = TRUE;
          else
-           g_signal_emit (GTK_OBJECT (ctree),
+           g_signal_emit (G_OBJECT (ctree),
                             ctree_signals[TREE_UNSELECT_ROW], 0, sel_row, column);
        }
 
@@ -3501,7 +2788,7 @@ real_tree_unselect (GtkCMCTree     *ctree,
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (!node || GTK_CMCTREE_ROW (node)->row.state != GTK_STATE_SELECTED)
     return;
@@ -3538,7 +2825,7 @@ real_select_all (GtkCMCList *clist)
   GtkCMCTree *ctree;
   GtkCMCTreeNode *node;
   
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   ctree = GTK_CMCTREE (clist);
 
@@ -3582,7 +2869,7 @@ real_unselect_all (GtkCMCList *clist)
   GtkCMCTreeNode *node;
   GList *list;
  
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
   
   ctree = GTK_CMCTREE (clist);
 
@@ -3635,8 +2922,8 @@ ctree_is_hot_spot (GtkCMCTree     *ctree,
   gint xl;
   gint yu;
   
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   clist = GTK_CMCLIST (ctree);
 
@@ -3652,12 +2939,10 @@ ctree_is_hot_spot (GtkCMCTree     *ctree,
   if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT)
     xl = (clist->column[ctree->tree_column].area.x + 
          clist->column[ctree->tree_column].area.width - 1 + clist->hoffset -
-         (tree_row->level - 1) * ctree->tree_indent - PM_SIZE -
-         (ctree->line_style == GTK_CMCTREE_LINES_TABBED) * 3);
+         (tree_row->level - 1) * ctree->tree_indent - PM_SIZE);
   else
     xl = (clist->column[ctree->tree_column].area.x + clist->hoffset +
-         (tree_row->level - 1) * ctree->tree_indent +
-         (ctree->line_style == GTK_CMCTREE_LINES_TABBED) * 3);
+         (tree_row->level - 1) * ctree->tree_indent);
 
   return (x >= xl && x <= xl + PM_SIZE && y >= yu && y <= yu + PM_SIZE);
 }
@@ -3692,8 +2977,8 @@ gtk_cmctree_new_with_titles (gint         columns,
 {
   GtkWidget *widget;
 
-  g_return_val_if_fail (columns > 0, NULL);
-  g_return_val_if_fail (tree_column >= 0 && tree_column < columns, NULL);
+  cm_return_val_if_fail (columns > 0, NULL);
+  cm_return_val_if_fail (tree_column >= 0 && tree_column < columns, NULL);
 
   widget = gtk_widget_new (GTK_TYPE_CMCTREE,
                           "n_columns", columns,
@@ -3728,14 +3013,14 @@ real_insert_row (GtkCMCList *clist,
   GtkCMCTreeNode *sibling;
   GtkCMCTreeNode *node;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (clist), -1);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (clist), -1);
 
   sibling = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, row));
   if (sibling)
     parent = GTK_CMCTREE_ROW (sibling)->parent;
 
   node = gtk_cmctree_insert_node (GTK_CMCTREE (clist), parent, sibling, text, 5,
-                               NULL, NULL, NULL, NULL, TRUE, FALSE);
+                               NULL, NULL, TRUE, FALSE);
 
   if (GTK_CMCLIST_AUTO_SORT (clist) || !sibling)
     return g_list_position (clist->row_list, (GList *) node);
@@ -3749,10 +3034,8 @@ gtk_cmctree_insert_node (GtkCMCTree     *ctree,
                       GtkCMCTreeNode *sibling,
                       gchar        *text[],
                       guint8        spacing,
-                      GdkPixmap    *pixmap_closed,
-                      GdkBitmap    *mask_closed,
-                      GdkPixmap    *pixmap_opened,
-                      GdkBitmap    *mask_opened,
+                      GdkPixbuf    *pixbuf_closed,
+                      GdkPixbuf    *pixbuf_opened,
                       gboolean      is_leaf,
                       gboolean      expanded)
 {
@@ -3762,9 +3045,9 @@ gtk_cmctree_insert_node (GtkCMCTree     *ctree,
   GList *list;
   gint i;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
   if (sibling)
-    g_return_val_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent, NULL);
+    cm_return_val_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent, NULL);
 
   if (parent && GTK_CMCTREE_ROW (parent)->is_leaf)
     return NULL;
@@ -3781,11 +3064,11 @@ gtk_cmctree_insert_node (GtkCMCTree     *ctree,
     for (i = 0; i < clist->columns; i++)
       if (text[i] && i != ctree->tree_column)
        GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
-         (clist, &(new_row->row), i, GTK_CMCELL_TEXT, text[i], 0, NULL, NULL);
+         (clist, &(new_row->row), i, GTK_CMCELL_TEXT, text[i], 0, NULL);
 
   set_node_info (ctree, node, text ?
-                text[ctree->tree_column] : NULL, spacing, pixmap_closed,
-                mask_closed, pixmap_opened, mask_opened, is_leaf, expanded);
+                text[ctree->tree_column] : NULL, spacing, pixbuf_closed,
+                pixbuf_opened, is_leaf, expanded);
 
   /* sorted insertion */
   if (GTK_CMCLIST_AUTO_SORT (clist))
@@ -3839,11 +3122,11 @@ gtk_cmctree_insert_gnode (GtkCMCTree          *ctree,
   GNode *work;
   guint depth = 1;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (gnode != NULL, NULL);
-  g_return_val_if_fail (func != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (gnode != NULL, NULL);
+  cm_return_val_if_fail (func != NULL, NULL);
   if (sibling)
-    g_return_val_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent, NULL);
+    cm_return_val_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent, NULL);
   
   clist = GTK_CMCLIST (ctree);
 
@@ -3856,7 +3139,7 @@ gtk_cmctree_insert_gnode (GtkCMCTree          *ctree,
 
   gtk_cmclist_freeze (clist);
 
-  set_node_info (ctree, cnode, "", 0, NULL, NULL, NULL, NULL, TRUE, FALSE);
+  set_node_info (ctree, cnode, "", 0, NULL, NULL, TRUE, FALSE);
 
   if (!func (ctree, depth, gnode, cnode, data))
     {
@@ -3904,13 +3187,13 @@ gtk_cmctree_export_to_gnode (GtkCMCTree          *ctree,
   GNode *gnode;
   gint depth;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (node != NULL, NULL);
-  g_return_val_if_fail (func != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (node != NULL, NULL);
+  cm_return_val_if_fail (func != NULL, NULL);
   if (sibling)
     {
-      g_return_val_if_fail (parent != NULL, NULL);
-      g_return_val_if_fail (sibling->parent == parent, NULL);
+      cm_return_val_if_fail (parent != NULL, NULL);
+      cm_return_val_if_fail (sibling->parent == parent, NULL);
     }
 
   gnode = g_node_new (NULL);
@@ -3946,7 +3229,7 @@ real_remove_row (GtkCMCList *clist,
 {
   GtkCMCTreeNode *node;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, row));
 
@@ -3960,7 +3243,7 @@ gtk_cmctree_remove_node (GtkCMCTree     *ctree,
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -3990,7 +3273,7 @@ real_clear (GtkCMCList *clist)
   GtkCMCTreeNode *work;
   GtkCMCTreeNode *ptr;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   ctree = GTK_CMCTREE (clist);
 
@@ -4028,8 +3311,8 @@ gtk_cmctree_post_recursive (GtkCMCTree     *ctree,
   GtkCMCTreeNode *work;
   GtkCMCTreeNode *tmp;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (func != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (func != NULL);
 
   if (node)
     work = GTK_CMCTREE_ROW (node)->children;
@@ -4057,8 +3340,8 @@ gtk_cmctree_post_recursive_to_depth (GtkCMCTree     *ctree,
   GtkCMCTreeNode *work;
   GtkCMCTreeNode *tmp;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (func != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (func != NULL);
 
   if (depth < 0)
     {
@@ -4094,8 +3377,8 @@ gtk_cmctree_pre_recursive (GtkCMCTree     *ctree,
   GtkCMCTreeNode *work;
   GtkCMCTreeNode *tmp;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (func != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (func != NULL);
 
   if (node)
     {
@@ -4123,8 +3406,8 @@ gtk_cmctree_pre_recursive_to_depth (GtkCMCTree     *ctree,
   GtkCMCTreeNode *work;
   GtkCMCTreeNode *tmp;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (func != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (func != NULL);
 
   if (depth < 0)
     {
@@ -4158,12 +3441,12 @@ gtk_cmctree_is_viewable (GtkCMCTree     *ctree,
 { 
   GtkCMCTreeRow *work;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   work = GTK_CMCTREE_ROW (node);
 
-  while (work->parent && GTK_CMCTREE_ROW (work->parent)->expanded)
+  while (work && work->parent && GTK_CMCTREE_ROW (work->parent)->expanded)
     work = GTK_CMCTREE_ROW (work->parent);
 
   if (!work->parent)
@@ -4176,7 +3459,7 @@ GtkCMCTreeNode *
 gtk_cmctree_last (GtkCMCTree     *ctree,
                GtkCMCTreeNode *node)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
 
   if (!node) 
     return NULL;
@@ -4196,8 +3479,8 @@ gtk_cmctree_find_node_ptr (GtkCMCTree    *ctree,
 {
   GtkCMCTreeNode *node;
   
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (ctree_row != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (ctree_row != NULL, NULL);
   
   if (ctree_row->parent)
     node = GTK_CMCTREE_ROW (ctree_row->parent)->children;
@@ -4214,7 +3497,7 @@ GtkCMCTreeNode *
 gtk_cmctree_node_nth (GtkCMCTree *ctree,
                    guint     row)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
 
   if ((row >= GTK_CMCLIST(ctree)->rows))
     return NULL;
@@ -4252,8 +3535,8 @@ gtk_cmctree_is_ancestor (GtkCMCTree     *ctree,
                       GtkCMCTreeNode *node,
                       GtkCMCTreeNode *child)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   if (GTK_CMCTREE_ROW (node)->children)
     return gtk_cmctree_find (ctree, GTK_CMCTREE_ROW (node)->children, child);
@@ -4291,7 +3574,7 @@ gtk_cmctree_find_all_by_row_data (GtkCMCTree     *ctree,
 {
   GList *list = NULL;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
 
   /* if node == NULL then look in the whole tree */
   if (!node)
@@ -4325,7 +3608,7 @@ gtk_cmctree_find_by_row_data_custom (GtkCMCTree     *ctree,
 {
   GtkCMCTreeNode *work;
 
-  g_return_val_if_fail (func != NULL, NULL);
+  cm_return_val_if_fail (func != NULL, NULL);
 
   if (!node)
     node = GTK_CMCTREE_NODE (GTK_CMCLIST (ctree)->row_list);
@@ -4351,8 +3634,8 @@ gtk_cmctree_find_all_by_row_data_custom (GtkCMCTree     *ctree,
 {
   GList *list = NULL;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (func != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (func != NULL, NULL);
 
   /* if node == NULL then look in the whole tree */
   if (!node)
@@ -4388,7 +3671,7 @@ gtk_cmctree_is_hot_spot (GtkCMCTree *ctree,
   gint column;
   gint row;
   
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
 
   if (gtk_cmclist_get_selection_info (GTK_CMCLIST (ctree), x, y, &row, &column))
     if ((node = GTK_CMCTREE_NODE(g_list_nth (GTK_CMCLIST (ctree)->row_list, row))))
@@ -4409,10 +3692,10 @@ gtk_cmctree_move (GtkCMCTree     *ctree,
                GtkCMCTreeNode *new_parent, 
                GtkCMCTreeNode *new_sibling)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
   
-  g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_MOVE], 0, node,
+  g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_MOVE], 0, node,
                   new_parent, new_sibling);
 }
 
@@ -4420,13 +3703,13 @@ void
 gtk_cmctree_expand (GtkCMCTree     *ctree,
                  GtkCMCTreeNode *node)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
   
   if (GTK_CMCTREE_ROW (node)->is_leaf)
     return;
 
-  g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0, node);
+  g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0, node);
 }
 
 void 
@@ -4436,7 +3719,7 @@ gtk_cmctree_expand_recursive (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   gboolean thaw = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -4463,7 +3746,7 @@ gtk_cmctree_expand_to_depth (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   gboolean thaw = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -4487,13 +3770,13 @@ void
 gtk_cmctree_collapse (GtkCMCTree     *ctree,
                    GtkCMCTreeNode *node)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
   
   if (GTK_CMCTREE_ROW (node)->is_leaf)
     return;
 
-  g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0, node);
+  g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0, node);
 }
 
 void 
@@ -4504,7 +3787,7 @@ gtk_cmctree_collapse_recursive (GtkCMCTree     *ctree,
   gboolean thaw = FALSE;
   gint i;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (node && GTK_CMCTREE_ROW (node)->is_leaf)
     return;
@@ -4538,7 +3821,7 @@ gtk_cmctree_collapse_to_depth (GtkCMCTree     *ctree,
   gboolean thaw = FALSE;
   gint i;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (node && GTK_CMCTREE_ROW (node)->is_leaf)
     return;
@@ -4569,8 +3852,8 @@ void
 gtk_cmctree_toggle_expansion (GtkCMCTree     *ctree,
                            GtkCMCTreeNode *node)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
   
   if (GTK_CMCTREE_ROW (node)->is_leaf)
     return;
@@ -4585,7 +3868,7 @@ gtk_cmctree_toggle_expansion_recursive (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   gboolean thaw = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
   
   if (node && GTK_CMCTREE_ROW (node)->is_leaf)
     return;
@@ -4609,11 +3892,11 @@ void
 gtk_cmctree_select (GtkCMCTree     *ctree, 
                  GtkCMCTreeNode *node)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (GTK_CMCTREE_ROW (node)->row.selectable)
-    g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], 0,
+    g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_SELECT_ROW], 0,
                     node, -1);
 }
 
@@ -4621,10 +3904,10 @@ void
 gtk_cmctree_unselect (GtkCMCTree     *ctree, 
                    GtkCMCTreeNode *node)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
-  g_signal_emit (GTK_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], 0,
+  g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_UNSELECT_ROW], 0,
                   node, -1);
 }
 
@@ -4650,7 +3933,7 @@ gtk_cmctree_real_select_recursive (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   gboolean thaw = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -4701,8 +3984,8 @@ gtk_cmctree_node_set_text (GtkCMCTree     *ctree,
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return;
@@ -4711,36 +3994,33 @@ gtk_cmctree_node_set_text (GtkCMCTree     *ctree,
 
   GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
     (clist, &(GTK_CMCTREE_ROW (node)->row), column, GTK_CMCELL_TEXT,
-     text, 0, NULL, NULL);
+     text, 0, NULL);
 
   tree_draw_node (ctree, node);
 }
 
 void 
-gtk_cmctree_node_set_pixmap (GtkCMCTree     *ctree,
+gtk_cmctree_node_set_pixbuf (GtkCMCTree     *ctree,
                           GtkCMCTreeNode *node,
                           gint          column,
-                          GdkPixmap    *pixmap,
-                          GdkBitmap    *mask)
+                          GdkPixbuf    *pixbuf)
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
-  g_return_if_fail (pixmap != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
+  cm_return_if_fail (pixbuf != NULL);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return;
 
-  g_object_ref (pixmap);
-  if (mask) 
-    g_object_ref (mask);
+  g_object_ref (pixbuf);
 
   clist = GTK_CMCLIST (ctree);
 
   GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
-    (clist, &(GTK_CMCTREE_ROW (node)->row), column, GTK_CMCELL_PIXMAP,
-     NULL, 0, pixmap, mask);
+    (clist, &(GTK_CMCTREE_ROW (node)->row), column, GTK_CMCELL_PIXBUF,
+     NULL, 0, pixbuf);
 
   tree_draw_node (ctree, node);
 }
@@ -4751,30 +4031,27 @@ gtk_cmctree_node_set_pixtext (GtkCMCTree     *ctree,
                            gint          column,
                            const gchar  *text,
                            guint8        spacing,
-                           GdkPixmap    *pixmap,
-                           GdkBitmap    *mask)
+                           GdkPixbuf    *pixbuf)
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
   if (column != ctree->tree_column)
-    g_return_if_fail (pixmap != NULL);
+    cm_return_if_fail (pixbuf != NULL);
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return;
 
   clist = GTK_CMCLIST (ctree);
 
-  if (pixmap)
+  if (pixbuf)
     {
-      g_object_ref (pixmap);
-      if (mask) 
-       g_object_ref (mask);
+      g_object_ref (pixbuf);
     }
 
   GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
     (clist, &(GTK_CMCTREE_ROW (node)->row), column, GTK_CMCELL_PIXTEXT,
-     text, spacing, pixmap, mask);
+     text, spacing, pixbuf);
 
   tree_draw_node (ctree, node);
 }
@@ -4784,18 +4061,16 @@ gtk_cmctree_set_node_info (GtkCMCTree     *ctree,
                         GtkCMCTreeNode *node,
                         const gchar  *text,
                         guint8        spacing,
-                        GdkPixmap    *pixmap_closed,
-                        GdkBitmap    *mask_closed,
-                        GdkPixmap    *pixmap_opened,
-                        GdkBitmap    *mask_opened,
+                        GdkPixbuf    *pixbuf_closed,
+                        GdkPixbuf    *pixbuf_opened,
                         gboolean      is_leaf,
                         gboolean      expanded)
 {
   gboolean old_leaf;
   gboolean old_expanded;
  
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   old_leaf = GTK_CMCTREE_ROW (node)->is_leaf;
   old_expanded = GTK_CMCTREE_ROW (node)->expanded;
@@ -4814,8 +4089,8 @@ gtk_cmctree_set_node_info (GtkCMCTree     *ctree,
        }
     }
 
-  set_node_info (ctree, node, text, spacing, pixmap_closed, mask_closed,
-                pixmap_opened, mask_opened, is_leaf, expanded);
+  set_node_info (ctree, node, text, spacing, pixbuf_closed,
+                pixbuf_opened, is_leaf, expanded);
 
   if (!is_leaf && !old_leaf)
     {
@@ -4842,8 +4117,8 @@ gtk_cmctree_node_set_shift (GtkCMCTree     *ctree,
   GtkRequisition requisition;
   gboolean visible = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return;
@@ -4873,7 +4148,7 @@ static void
 remove_grab (GtkCMCList *clist)
 {
   if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) && 
-      GTK_WIDGET_HAS_GRAB (clist))
+      gtk_widget_has_grab (GTK_WIDGET(clist)))
     {
       gtk_grab_remove (GTK_WIDGET (clist));
       gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (clist)),
@@ -4898,8 +4173,8 @@ gtk_cmctree_node_set_selectable (GtkCMCTree     *ctree,
                               GtkCMCTreeNode *node,
                               gboolean      selectable)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (selectable == GTK_CMCTREE_ROW (node)->row.selectable)
     return;
@@ -4928,7 +4203,7 @@ gboolean
 gtk_cmctree_node_get_selectable (GtkCMCTree     *ctree,
                               GtkCMCTreeNode *node)
 {
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   return GTK_CMCTREE_ROW (node)->row.selectable;
 }
@@ -4938,8 +4213,8 @@ gtk_cmctree_node_get_cell_type (GtkCMCTree     *ctree,
                              GtkCMCTreeNode *node,
                              gint          column)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), -1);
-  g_return_val_if_fail (node != NULL, -1);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), -1);
+  cm_return_val_if_fail (node != NULL, -1);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return -1;
@@ -4953,8 +4228,8 @@ gtk_cmctree_node_get_text (GtkCMCTree      *ctree,
                         gint           column,
                         gchar        **text)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return FALSE;
@@ -4969,25 +4244,22 @@ gtk_cmctree_node_get_text (GtkCMCTree      *ctree,
 }
 
 gboolean
-gtk_cmctree_node_get_pixmap (GtkCMCTree     *ctree,
+gtk_cmctree_node_get_pixbuf (GtkCMCTree     *ctree,
                           GtkCMCTreeNode *node,
                           gint          column,
-                          GdkPixmap   **pixmap,
-                          GdkBitmap   **mask)
+                          GdkPixbuf   **pixbuf)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return FALSE;
 
-  if (GTK_CMCTREE_ROW (node)->row.cell[column].type != GTK_CMCELL_PIXMAP)
+  if (GTK_CMCTREE_ROW (node)->row.cell[column].type != GTK_CMCELL_PIXBUF)
     return FALSE;
 
-  if (pixmap)
-    *pixmap = GTK_CMCELL_PIXMAP (GTK_CMCTREE_ROW (node)->row.cell[column])->pixmap;
-  if (mask)
-    *mask = GTK_CMCELL_PIXMAP (GTK_CMCTREE_ROW (node)->row.cell[column])->mask;
+  if (pixbuf)
+    *pixbuf = GTK_CMCELL_PIXBUF (GTK_CMCTREE_ROW (node)->row.cell[column])->pixbuf;
 
   return TRUE;
 }
@@ -4998,11 +4270,10 @@ gtk_cmctree_node_get_pixtext (GtkCMCTree      *ctree,
                            gint           column,
                            gchar        **text,
                            guint8        *spacing,
-                           GdkPixmap    **pixmap,
-                           GdkBitmap    **mask)
+                           GdkPixbuf    **pixbuf)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
   
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return FALSE;
@@ -5015,11 +4286,9 @@ gtk_cmctree_node_get_pixtext (GtkCMCTree      *ctree,
   if (spacing)
     *spacing = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW 
                                 (node)->row.cell[column])->spacing;
-  if (pixmap)
-    *pixmap = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW 
-                               (node)->row.cell[column])->pixmap;
-  if (mask)
-    *mask = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[column])->mask;
+  if (pixbuf)
+    *pixbuf = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW 
+                               (node)->row.cell[column])->pixbuf;
   
   return TRUE;
 }
@@ -5029,15 +4298,13 @@ gtk_cmctree_get_node_info (GtkCMCTree      *ctree,
                         GtkCMCTreeNode  *node,
                         gchar        **text,
                         guint8        *spacing,
-                        GdkPixmap    **pixmap_closed,
-                        GdkBitmap    **mask_closed,
-                        GdkPixmap    **pixmap_opened,
-                        GdkBitmap    **mask_opened,
+                        GdkPixbuf    **pixbuf_closed,
+                        GdkPixbuf    **pixbuf_opened,
                         gboolean      *is_leaf,
                         gboolean      *expanded)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
-  g_return_val_if_fail (node != NULL, FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (node != NULL, FALSE);
   
   if (text)
     *text = GTK_CMCELL_PIXTEXT 
@@ -5045,14 +4312,10 @@ gtk_cmctree_get_node_info (GtkCMCTree      *ctree,
   if (spacing)
     *spacing = GTK_CMCELL_PIXTEXT 
       (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->spacing;
-  if (pixmap_closed)
-    *pixmap_closed = GTK_CMCTREE_ROW (node)->pixmap_closed;
-  if (mask_closed)
-    *mask_closed = GTK_CMCTREE_ROW (node)->mask_closed;
-  if (pixmap_opened)
-    *pixmap_opened = GTK_CMCTREE_ROW (node)->pixmap_opened;
-  if (mask_opened)
-    *mask_opened = GTK_CMCTREE_ROW (node)->mask_opened;
+  if (pixbuf_closed)
+    *pixbuf_closed = GTK_CMCTREE_ROW (node)->pixbuf_closed;
+  if (pixbuf_opened)
+    *pixbuf_opened = GTK_CMCTREE_ROW (node)->pixbuf_opened;
   if (is_leaf)
     *is_leaf = GTK_CMCTREE_ROW (node)->is_leaf;
   if (expanded)
@@ -5071,8 +4334,8 @@ gtk_cmctree_node_set_cell_style (GtkCMCTree     *ctree,
   GtkRequisition requisition;
   gboolean visible = FALSE;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   clist = GTK_CMCLIST (ctree);
 
@@ -5093,7 +4356,7 @@ gtk_cmctree_node_set_cell_style (GtkCMCTree     *ctree,
 
   if (GTK_CMCTREE_ROW (node)->row.cell[column].style)
     {
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
         gtk_style_detach (GTK_CMCTREE_ROW (node)->row.cell[column].style);
       g_object_unref (GTK_CMCTREE_ROW (node)->row.cell[column].style);
     }
@@ -5104,7 +4367,7 @@ gtk_cmctree_node_set_cell_style (GtkCMCTree     *ctree,
     {
       g_object_ref (GTK_CMCTREE_ROW (node)->row.cell[column].style);
       
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
         GTK_CMCTREE_ROW (node)->row.cell[column].style =
          gtk_style_attach (GTK_CMCTREE_ROW (node)->row.cell[column].style,
                            clist->clist_window);
@@ -5122,8 +4385,8 @@ gtk_cmctree_node_get_cell_style (GtkCMCTree     *ctree,
                               GtkCMCTreeNode *node,
                               gint          column)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (node != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (node != NULL, NULL);
 
   if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
     return NULL;
@@ -5142,8 +4405,8 @@ gtk_cmctree_node_set_row_style (GtkCMCTree     *ctree,
   gint *old_width = NULL;
   gint i;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   clist = GTK_CMCLIST (ctree);
 
@@ -5165,7 +4428,7 @@ gtk_cmctree_node_set_row_style (GtkCMCTree     *ctree,
 
   if (GTK_CMCTREE_ROW (node)->row.style)
     {
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
         gtk_style_detach (GTK_CMCTREE_ROW (node)->row.style);
       g_object_unref (GTK_CMCTREE_ROW (node)->row.style);
     }
@@ -5176,7 +4439,7 @@ gtk_cmctree_node_set_row_style (GtkCMCTree     *ctree,
     {
       g_object_ref (GTK_CMCTREE_ROW (node)->row.style);
       
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
         GTK_CMCTREE_ROW (node)->row.style =
          gtk_style_attach (GTK_CMCTREE_ROW (node)->row.style,
                            clist->clist_window);
@@ -5197,8 +4460,8 @@ GtkStyle *
 gtk_cmctree_node_get_row_style (GtkCMCTree     *ctree,
                              GtkCMCTreeNode *node)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
-  g_return_val_if_fail (node != NULL, NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (node != NULL, NULL);
 
   return GTK_CMCTREE_ROW (node)->row.style;
 }
@@ -5208,14 +4471,14 @@ gtk_cmctree_node_set_foreground (GtkCMCTree       *ctree,
                               GtkCMCTreeNode   *node,
                               const GdkColor *color)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (color)
     {
       GTK_CMCTREE_ROW (node)->row.foreground = *color;
       GTK_CMCTREE_ROW (node)->row.fg_set = TRUE;
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
        gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (ctree)),
                         &GTK_CMCTREE_ROW (node)->row.foreground, TRUE, TRUE);
     }
@@ -5230,14 +4493,14 @@ gtk_cmctree_node_set_background (GtkCMCTree       *ctree,
                               GtkCMCTreeNode   *node,
                               const GdkColor *color)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   if (color)
     {
       GTK_CMCTREE_ROW (node)->row.background = *color;
       GTK_CMCTREE_ROW (node)->row.bg_set = TRUE;
-      if (GTK_WIDGET_REALIZED (ctree))
+      if (gtk_widget_get_realized (GTK_WIDGET(ctree)))
        gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (ctree)),
                         &GTK_CMCTREE_ROW (node)->row.background, TRUE, TRUE);
     }
@@ -5259,13 +4522,13 @@ void
 gtk_cmctree_node_set_row_data_full (GtkCMCTree         *ctree,
                                  GtkCMCTreeNode     *node,
                                  gpointer          data,
-                                 GtkDestroyNotify  destroy)
+                                 GDestroyNotify  destroy)
 {
-  GtkDestroyNotify dnotify;
+  GDestroyNotify dnotify;
   gpointer ddata;
   
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (node != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (node != NULL);
 
   dnotify = GTK_CMCTREE_ROW (node)->row.destroy;
   ddata = GTK_CMCTREE_ROW (node)->row.data;
@@ -5281,7 +4544,7 @@ gpointer
 gtk_cmctree_node_get_row_data (GtkCMCTree     *ctree,
                             GtkCMCTreeNode *node)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL);
 
   return node ? GTK_CMCTREE_ROW (node)->row.data : NULL;
 }
@@ -5296,7 +4559,7 @@ gtk_cmctree_node_moveto (GtkCMCTree     *ctree,
   gint row = -1;
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -5315,8 +4578,8 @@ gtk_cmctree_node_is_visible (GtkCMCTree     *ctree,
 {
   gint row;
   
-  g_return_val_if_fail (ctree != NULL, 0);
-  g_return_val_if_fail (node != NULL, 0);
+  cm_return_val_if_fail (ctree != NULL, 0);
+  cm_return_val_if_fail (node != NULL, 0);
   
   row = g_list_position (GTK_CMCLIST (ctree)->row_list, (GList*) node);
   return gtk_cmclist_row_is_visible (GTK_CMCLIST (ctree), row);
@@ -5333,8 +4596,8 @@ gtk_cmctree_set_indent (GtkCMCTree *ctree,
 {
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (indent >= 0);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (indent >= 0);
 
   if (indent == ctree->tree_indent)
     return;
@@ -5358,8 +4621,8 @@ gtk_cmctree_set_spacing (GtkCMCTree *ctree,
   GtkCMCList *clist;
   gint old_spacing;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-  g_return_if_fail (spacing >= 0);
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (spacing >= 0);
 
   if (spacing == ctree->tree_spacing)
     return;
@@ -5382,7 +4645,7 @@ void
 gtk_cmctree_set_show_stub (GtkCMCTree *ctree, 
                         gboolean  show_stub)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   show_stub = show_stub != FALSE;
 
@@ -5404,59 +4667,6 @@ void
 gtk_cmctree_set_line_style (GtkCMCTree          *ctree, 
                          GtkCMCTreeLineStyle  line_style)
 {
-  GtkCMCList *clist;
-  GtkCMCTreeLineStyle old_style;
-
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
-
-  if (line_style == ctree->line_style)
-    return;
-
-  clist = GTK_CMCLIST (ctree);
-
-  old_style = ctree->line_style;
-  ctree->line_style = line_style;
-
-  if (clist->column[ctree->tree_column].auto_resize &&
-      !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist))
-    {
-      if (old_style == GTK_CMCTREE_LINES_TABBED)
-       gtk_cmclist_set_column_width
-         (clist, ctree->tree_column,
-          clist->column[ctree->tree_column].width - 3);
-      else if (line_style == GTK_CMCTREE_LINES_TABBED)
-       gtk_cmclist_set_column_width
-         (clist, ctree->tree_column,
-          clist->column[ctree->tree_column].width + 3);
-    }
-
-  if (GTK_WIDGET_REALIZED (ctree))
-    {
-      switch (line_style)
-       {
-       case GTK_CMCTREE_LINES_SOLID:
-         if (GTK_WIDGET_REALIZED (ctree))
-           gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID, 
-                                       GDK_CAP_BUTT, GDK_JOIN_MITER);
-         break;
-       case GTK_CMCTREE_LINES_DOTTED:
-         if (GTK_WIDGET_REALIZED (ctree))
-           gdk_gc_set_line_attributes (ctree->lines_gc, 1, 
-                                       GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT, GDK_JOIN_MITER);
-         gdk_gc_set_dashes (ctree->lines_gc, 0, "\1\1", 2);
-         break;
-       case GTK_CMCTREE_LINES_TABBED:
-         if (GTK_WIDGET_REALIZED (ctree))
-           gdk_gc_set_line_attributes (ctree->lines_gc, 1, GDK_LINE_SOLID, 
-                                       GDK_CAP_BUTT, GDK_JOIN_MITER);
-         break;
-       case GTK_CMCTREE_LINES_NONE:
-         break;
-       default:
-         return;
-       }
-      CLIST_REFRESH (ctree);
-    }
 }
 
 void 
@@ -5466,7 +4676,7 @@ gtk_cmctree_set_expander_style (GtkCMCTree              *ctree,
   GtkCMCList *clist;
   GtkCMCTreeExpanderStyle old_style;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   if (expander_style == ctree->expander_style)
     return;
@@ -5489,10 +4699,6 @@ gtk_cmctree_set_expander_style (GtkCMCTree              *ctree,
        case GTK_CMCTREE_EXPANDER_TRIANGLE:
          new_width -= PM_SIZE + 3;
          break;
-       case GTK_CMCTREE_EXPANDER_SQUARE:
-       case GTK_CMCTREE_EXPANDER_CIRCULAR:
-         new_width -= PM_SIZE + 1;
-         break;
        }
 
       switch (expander_style)
@@ -5502,16 +4708,12 @@ gtk_cmctree_set_expander_style (GtkCMCTree              *ctree,
        case GTK_CMCTREE_EXPANDER_TRIANGLE:
          new_width += PM_SIZE + 3;
          break;
-       case GTK_CMCTREE_EXPANDER_SQUARE:
-       case GTK_CMCTREE_EXPANDER_CIRCULAR:
-         new_width += PM_SIZE + 1;
-         break;
        }
 
       gtk_cmclist_set_column_width (clist, ctree->tree_column, new_width);
     }
 
-  if (GTK_WIDGET_DRAWABLE (clist))
+  if (gtk_widget_is_drawable (GTK_WIDGET(clist)))
     CLIST_REFRESH (clist);
 }
 
@@ -5575,7 +4777,7 @@ gtk_cmctree_sort_recursive (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   GtkCMCTreeNode *focus_node = NULL;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -5622,7 +4824,7 @@ gtk_cmctree_sort_node (GtkCMCTree     *ctree,
   GtkCMCList *clist;
   GtkCMCTreeNode *focus_node = NULL;
 
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   clist = GTK_CMCLIST (ctree);
 
@@ -5709,7 +4911,7 @@ resync_selection (GtkCMCList *clist, GdkEvent *event)
   gint row;
   gboolean unselect;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   if (clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
@@ -5821,7 +5023,7 @@ real_undo_selection (GtkCMCList *clist)
   GtkCMCTree *ctree;
   GList *work;
 
-  g_return_if_fail (GTK_IS_CMCTREE (clist));
+  cm_return_if_fail (GTK_IS_CMCTREE (clist));
 
   if (clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
@@ -5842,7 +5044,8 @@ real_undo_selection (GtkCMCList *clist)
     if (GTK_CMCTREE_ROW (work->data)->row.selectable)
       gtk_cmctree_unselect (ctree, GTK_CMCTREE_NODE (work->data));
 
-  if (GTK_WIDGET_HAS_FOCUS (clist) && clist->focus_row != clist->undo_anchor)
+  if (gtk_widget_has_focus (GTK_WIDGET(clist)) &&
+      clist->focus_row != clist->undo_anchor)
     {
       clist->focus_row = clist->undo_anchor;
       gtk_widget_queue_draw (GTK_WIDGET (clist));
@@ -5869,7 +5072,7 @@ void
 gtk_cmctree_set_drag_compare_func (GtkCMCTree                *ctree,
                                 GtkCMCTreeCompareDragFunc  cmp_func)
 {
-  g_return_if_fail (GTK_IS_CMCTREE (ctree));
+  cm_return_if_fail (GTK_IS_CMCTREE (ctree));
 
   ctree->drag_compare = cmp_func;
 }
@@ -5880,7 +5083,7 @@ check_drag (GtkCMCTree        *ctree,
            GtkCMCTreeNode    *drag_target,
            GtkCMCListDragPos  insert_pos)
 {
-  g_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE);
 
   if (drag_source && drag_source != drag_target &&
       (!GTK_CMCTREE_ROW (drag_source)->children ||
@@ -5937,14 +5140,18 @@ drag_dest_cell (GtkCMCList         *clist,
                gint              y,
                GtkCMCListDestInfo *dest_info)
 {
+  GtkStyle *style;
   GtkWidget *widget;
+  guint border_width;
 
   widget = GTK_WIDGET (clist);
+  style = gtk_widget_get_style (widget);
 
   dest_info->insert_pos = GTK_CMCLIST_DRAG_NONE;
 
-  y -= (GTK_CONTAINER (widget)->border_width +
-       widget->style->ythickness + clist->column_title_area.height);
+  border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+  y -= (border_width +
+       style->ythickness + clist->column_title_area.height);
   dest_info->cell.row = ROW_FROM_YPIXEL (clist, y);
 
   if (dest_info->cell.row >= clist->rows)
@@ -5955,7 +5162,7 @@ drag_dest_cell (GtkCMCList         *clist,
   if (dest_info->cell.row < -1)
     dest_info->cell.row = -1;
   
-  x -= GTK_CONTAINER (widget)->border_width + widget->style->xthickness;
+  x -= border_width + style->xthickness;
 
   dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x);
 
@@ -5994,14 +5201,12 @@ gtk_cmctree_drag_begin (GtkWidget            *widget,
                      GdkDragContext *context)
 {
   GtkCMCList *clist;
-  GtkCMCTree *ctree;
   gboolean use_icons;
 
-  g_return_if_fail (GTK_IS_CMCTREE (widget));
-  g_return_if_fail (context != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (widget));
+  cm_return_if_fail (context != NULL);
 
   clist = GTK_CMCLIST (widget);
-  ctree = GTK_CMCTREE (widget);
 
   use_icons = GTK_CMCLIST_USE_DRAG_ICONS (clist);
   GTK_CMCLIST_UNSET_FLAG (clist, CMCLIST_USE_DRAG_ICONS);
@@ -6009,27 +5214,7 @@ gtk_cmctree_drag_begin (GtkWidget             *widget,
 
   if (use_icons)
     {
-      GtkCMCTreeNode *node;
-
       GTK_CMCLIST_SET_FLAG (clist, CMCLIST_USE_DRAG_ICONS);
-      node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list,
-                                        clist->click_cell.row));
-      if (node)
-       {
-         if (GTK_CMCELL_PIXTEXT
-             (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap)
-           {
-             gtk_drag_set_icon_pixmap
-               (context,
-                gtk_widget_get_colormap (widget),
-                GTK_CMCELL_PIXTEXT
-                (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixmap,
-                GTK_CMCELL_PIXTEXT
-                (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->mask,
-                -2, -2);
-             return;
-           }
-       }
       gtk_drag_set_icon_default (context);
     }
 }
@@ -6046,7 +5231,7 @@ gtk_cmctree_drag_motion (GtkWidget      *widget,
   GtkCMCListDestInfo new_info;
   GtkCMCListDestInfo *dest_info;
 
-  g_return_val_if_fail (GTK_IS_CMCTREE (widget), FALSE);
+  cm_return_val_if_fail (GTK_IS_CMCTREE (widget), FALSE);
 
   clist = GTK_CMCLIST (widget);
   ctree = GTK_CMCTREE (widget);
@@ -6069,18 +5254,10 @@ gtk_cmctree_drag_motion (GtkWidget      *widget,
 
   if (GTK_CMCLIST_REORDERABLE (clist))
     {
-      GList *list;
       GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder");
+      GdkAtom found = gtk_drag_dest_find_target(widget, context, NULL);
 
-      list = context->targets;
-      while (list)
-       {
-         if (atom == GDK_POINTER_TO_ATOM (list->data))
-           break;
-         list = list->next;
-       }
-
-      if (list)
+      if (atom == found)
        {
          GtkCMCTreeNode *drag_source;
          GtkCMCTreeNode *drag_target;
@@ -6106,25 +5283,15 @@ gtk_cmctree_drag_motion (GtkWidget      *widget,
              (new_info.cell.row == dest_info->cell.row &&
               dest_info->insert_pos != new_info.insert_pos))
            {
-             if (dest_info->cell.row >= 0)
-               GTK_CMCLIST_GET_CLASS (clist)->draw_drag_highlight
-                 (clist,
-                  g_list_nth (clist->row_list, dest_info->cell.row)->data,
-                  dest_info->cell.row, dest_info->insert_pos);
-
              dest_info->insert_pos  = new_info.insert_pos;
              dest_info->cell.row    = new_info.cell.row;
              dest_info->cell.column = new_info.cell.column;
 
-             GTK_CMCLIST_GET_CLASS (clist)->draw_drag_highlight
-               (clist,
-                g_list_nth (clist->row_list, dest_info->cell.row)->data,
-                dest_info->cell.row, dest_info->insert_pos);
-
              clist->drag_highlight_row = dest_info->cell.row;
              clist->drag_highlight_pos = dest_info->insert_pos;
 
-             gdk_drag_status (context, context->suggested_action, time);
+             gdk_drag_status (context,
+               gdk_drag_context_get_suggested_action(context), time);
            }
          return TRUE;
        }
@@ -6148,23 +5315,23 @@ gtk_cmctree_drag_data_received (GtkWidget        *widget,
   GtkCMCTree *ctree;
   GtkCMCList *clist;
 
-  g_return_if_fail (GTK_IS_CMCTREE (widget));
-  g_return_if_fail (context != NULL);
-  g_return_if_fail (selection_data != NULL);
+  cm_return_if_fail (GTK_IS_CMCTREE (widget));
+  cm_return_if_fail (context != NULL);
+  cm_return_if_fail (selection_data != NULL);
 
   ctree = GTK_CMCTREE (widget);
   clist = GTK_CMCLIST (widget);
 
   if (GTK_CMCLIST_REORDERABLE (clist) &&
       gtk_drag_get_source_widget (context) == widget &&
-      selection_data->target ==
+      gtk_selection_data_get_target (selection_data) ==
       gdk_atom_intern_static_string ("gtk-clist-drag-reorder") &&
-      selection_data->format == 8 &&
-      selection_data->length == sizeof (GtkCMCListCellInfo))
+      gtk_selection_data_get_format (selection_data) == 8 &&
+      gtk_selection_data_get_length (selection_data) == sizeof (GtkCMCListCellInfo))
     {
       GtkCMCListCellInfo *source_info;
 
-      source_info = (GtkCMCListCellInfo *)(selection_data->data);
+      source_info = (GtkCMCListCellInfo *)(gtk_selection_data_get_data (selection_data));
       if (source_info)
        {
          GtkCMCListDestInfo dest_info;