]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkclist.c
Deprecate widget flag: GTK_WIDGET_MAPPED
[~andy/gtk] / gtk / gtkclist.c
index a3e5e8bfdd6524c888c5fbb76f33c4bbb23785f8..83a1fa0c5c3139cab74d37d55e893c4c6dd6d66b 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#include "config.h"
+
 #include <stdlib.h>
 #include <string.h>
-#include "config.h"
+
+#undef GTK_DISABLE_DEPRECATED
+#define __GTK_CLIST_C__
+
+#include <gdk/gdkkeysyms.h>
+
 #include "gtkmain.h"
+#include "gtkobject.h"
+#include "gtkctree.h"
 #include "gtkclist.h"
 #include "gtkbindings.h"
 #include "gtkdnd.h"
-#include <gdk/gdkkeysyms.h>
+#include "gtkmarshalers.h"
+#include "gtkintl.h"
+
+#include "gtkalias.h"
 
 /* length of button_actions array */
 #define MAX_BUTTON 5
 
-/* the number rows memchunk expands at a time */
-#define CLIST_OPTIMUM_SIZE 64
-
 /* the width of the column resize windows */
 #define DRAG_WIDTH  6
 
@@ -216,7 +225,7 @@ static gint gtk_clist_focus_in        (GtkWidget        *widget,
                                       GdkEventFocus    *event);
 static gint gtk_clist_focus_out       (GtkWidget        *widget,
                                       GdkEventFocus    *event);
-static gint gtk_clist_focus           (GtkContainer     *container,
+static gint gtk_clist_focus           (GtkWidget        *widget,
                                       GtkDirectionType  direction);
 static void gtk_clist_set_focus_child (GtkContainer     *container,
                                       GtkWidget        *child);
@@ -358,7 +367,6 @@ static void column_button_clicked     (GtkWidget      *widget,
 /* Adjustments */
 static void adjust_adjustments        (GtkCList       *clist,
                                       gboolean        block_resize);
-static void check_exposures           (GtkCList       *clist);
 static void vadjustment_changed       (GtkAdjustment  *adjustment,
                                       gpointer        data);
 static void vadjustment_value_changed (GtkAdjustment  *adjustment,
@@ -460,7 +468,7 @@ static void drag_dest_cell            (GtkCList         *clist,
 static GtkContainerClass *parent_class = NULL;
 static guint clist_signals[LAST_SIGNAL] = {0};
 
-static GtkTargetEntry clist_target_table = { "gtk-clist-drag-reorder", 0, 0};
+static const GtkTargetEntry clist_target_table = { "gtk-clist-drag-reorder", 0, 0};
 
 GtkType
 gtk_clist_get_type (void)
@@ -481,6 +489,7 @@ gtk_clist_get_type (void)
        (GtkClassInitFunc) NULL,
       };
 
+      I_("GtkCList");
       clist_type = gtk_type_unique (GTK_TYPE_CONTAINER, &clist_info);
     }
 
@@ -531,12 +540,12 @@ gtk_clist_class_init (GtkCListClass *klass)
   widget_class->drag_drop = gtk_clist_drag_drop;
   widget_class->drag_data_get = gtk_clist_drag_data_get;
   widget_class->drag_data_received = gtk_clist_drag_data_received;
-
+  widget_class->focus = gtk_clist_focus;
+  
   /* container_class->add = NULL; use the default GtkContainerClass warning */
   /* container_class->remove=NULL; use the default GtkContainerClass warning */
 
   container_class->forall = gtk_clist_forall;
-  container_class->focus = gtk_clist_focus;
   container_class->set_focus_child = gtk_clist_set_focus_child;
 
   klass->set_scroll_adjustments = gtk_clist_set_scroll_adjustments;
@@ -569,262 +578,339 @@ gtk_clist_class_init (GtkCListClass *klass)
   klass->set_cell_contents = set_cell_contents;
   klass->cell_size_request = cell_size_request;
 
-  gtk_object_add_arg_type ("GtkCList::n_columns",
+  gtk_object_add_arg_type ("GtkCList::n-columns",
                           GTK_TYPE_UINT,
-                          GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY,
+                          GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME,
                           ARG_N_COLUMNS);
-  gtk_object_add_arg_type ("GtkCList::shadow_type",
+  gtk_object_add_arg_type ("GtkCList::shadow-type",
                           GTK_TYPE_SHADOW_TYPE,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_SHADOW_TYPE);
-  gtk_object_add_arg_type ("GtkCList::selection_mode",
+  gtk_object_add_arg_type ("GtkCList::selection-mode",
                           GTK_TYPE_SELECTION_MODE,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_SELECTION_MODE);
-  gtk_object_add_arg_type ("GtkCList::row_height",
+  gtk_object_add_arg_type ("GtkCList::row-height",
                           GTK_TYPE_UINT,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_ROW_HEIGHT);
   gtk_object_add_arg_type ("GtkCList::reorderable",
                           GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_REORDERABLE);
-  gtk_object_add_arg_type ("GtkCList::titles_active",
+  gtk_object_add_arg_type ("GtkCList::titles-active",
                           GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_TITLES_ACTIVE);
-  gtk_object_add_arg_type ("GtkCList::use_drag_icons",
+  gtk_object_add_arg_type ("GtkCList::use-drag-icons",
                           GTK_TYPE_BOOL,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_USE_DRAG_ICONS);
-  gtk_object_add_arg_type ("GtkCList::sort_type",
+  gtk_object_add_arg_type ("GtkCList::sort-type",
                           GTK_TYPE_SORT_TYPE,
-                          GTK_ARG_READWRITE,
+                          GTK_ARG_READWRITE | G_PARAM_STATIC_NAME,
                           ARG_SORT_TYPE);  
 
   widget_class->set_scroll_adjustments_signal =
-    gtk_signal_new ("set_scroll_adjustments",
+    gtk_signal_new (I_("set-scroll-adjustments"),
                    GTK_RUN_LAST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, set_scroll_adjustments),
-                   gtk_marshal_VOID__OBJECT_OBJECT,
+                   _gtk_marshal_VOID__OBJECT_OBJECT,
                    GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
 
   clist_signals[SELECT_ROW] =
-    gtk_signal_new ("select_row",
+    gtk_signal_new (I_("select-row"),
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, select_row),
-                   gtk_marshal_VOID__INT_INT_BOXED,
+                   _gtk_marshal_VOID__INT_INT_BOXED,
                    GTK_TYPE_NONE, 3,
                    GTK_TYPE_INT,
                    GTK_TYPE_INT,
-                   GTK_TYPE_GDK_EVENT);
+                   GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE);
   clist_signals[UNSELECT_ROW] =
-    gtk_signal_new ("unselect_row",
+    gtk_signal_new (I_("unselect-row"),
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, unselect_row),
-                   gtk_marshal_VOID__INT_INT_BOXED,
+                   _gtk_marshal_VOID__INT_INT_BOXED,
                    GTK_TYPE_NONE, 3, GTK_TYPE_INT,
-                   GTK_TYPE_INT, GTK_TYPE_GDK_EVENT);
+                   GTK_TYPE_INT, GDK_TYPE_EVENT);
   clist_signals[ROW_MOVE] =
-    gtk_signal_new ("row_move",
+    gtk_signal_new (I_("row-move"),
                    GTK_RUN_LAST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, row_move),
-                   gtk_marshal_VOID__INT_INT,
+                   _gtk_marshal_VOID__INT_INT,
                    GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
   clist_signals[CLICK_COLUMN] =
-    gtk_signal_new ("click_column",
+    gtk_signal_new (I_("click-column"),
                    GTK_RUN_FIRST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, click_column),
-                   gtk_marshal_VOID__INT,
+                   _gtk_marshal_VOID__INT,
                    GTK_TYPE_NONE, 1, GTK_TYPE_INT);
   clist_signals[RESIZE_COLUMN] =
-    gtk_signal_new ("resize_column",
+    gtk_signal_new (I_("resize-column"),
                    GTK_RUN_LAST,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, resize_column),
-                   gtk_marshal_VOID__INT_INT,
+                   _gtk_marshal_VOID__INT_INT,
                    GTK_TYPE_NONE, 2, GTK_TYPE_INT, GTK_TYPE_INT);
 
   clist_signals[TOGGLE_FOCUS_ROW] =
-    gtk_signal_new ("toggle_focus_row",
+    gtk_signal_new (I_("toggle-focus-row"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, toggle_focus_row),
-                    gtk_marshal_VOID__VOID,
+                    _gtk_marshal_VOID__VOID,
                     GTK_TYPE_NONE, 0);
   clist_signals[SELECT_ALL] =
-    gtk_signal_new ("select_all",
+    gtk_signal_new (I_("select-all"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, select_all),
-                    gtk_marshal_VOID__VOID,
+                    _gtk_marshal_VOID__VOID,
                     GTK_TYPE_NONE, 0);
   clist_signals[UNSELECT_ALL] =
-    gtk_signal_new ("unselect_all",
+    gtk_signal_new (I_("unselect-all"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, unselect_all),
-                    gtk_marshal_VOID__VOID,
+                    _gtk_marshal_VOID__VOID,
                     GTK_TYPE_NONE, 0);
   clist_signals[UNDO_SELECTION] =
-    gtk_signal_new ("undo_selection",
+    gtk_signal_new (I_("undo-selection"),
                    GTK_RUN_LAST | GTK_RUN_ACTION,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, undo_selection),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
   clist_signals[START_SELECTION] =
-    gtk_signal_new ("start_selection",
+    gtk_signal_new (I_("start-selection"),
                    GTK_RUN_LAST | GTK_RUN_ACTION,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, start_selection),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
   clist_signals[END_SELECTION] =
-    gtk_signal_new ("end_selection",
+    gtk_signal_new (I_("end-selection"),
                    GTK_RUN_LAST | GTK_RUN_ACTION,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, end_selection),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
   clist_signals[TOGGLE_ADD_MODE] =
-    gtk_signal_new ("toggle_add_mode",
+    gtk_signal_new (I_("toggle-add-mode"),
                    GTK_RUN_LAST | GTK_RUN_ACTION,
                    GTK_CLASS_TYPE (object_class),
                    GTK_SIGNAL_OFFSET (GtkCListClass, toggle_add_mode),
-                   gtk_marshal_VOID__VOID,
+                   _gtk_marshal_VOID__VOID,
                    GTK_TYPE_NONE, 0);
   clist_signals[EXTEND_SELECTION] =
-    gtk_signal_new ("extend_selection",
+    gtk_signal_new (I_("extend-selection"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, extend_selection),
-                    gtk_marshal_VOID__ENUM_FLOAT_BOOL,
+                    _gtk_marshal_VOID__ENUM_FLOAT_BOOLEAN,
                     GTK_TYPE_NONE, 3,
                    GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT, GTK_TYPE_BOOL);
   clist_signals[SCROLL_VERTICAL] =
-    gtk_signal_new ("scroll_vertical",
+    gtk_signal_new (I_("scroll-vertical"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, scroll_vertical),
-                    gtk_marshal_VOID__ENUM_FLOAT,
+                    _gtk_marshal_VOID__ENUM_FLOAT,
                     GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT);
   clist_signals[SCROLL_HORIZONTAL] =
-    gtk_signal_new ("scroll_horizontal",
+    gtk_signal_new (I_("scroll-horizontal"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, scroll_horizontal),
-                    gtk_marshal_VOID__ENUM_FLOAT,
+                    _gtk_marshal_VOID__ENUM_FLOAT,
                     GTK_TYPE_NONE, 2, GTK_TYPE_SCROLL_TYPE, GTK_TYPE_FLOAT);
   clist_signals[ABORT_COLUMN_RESIZE] =
-    gtk_signal_new ("abort_column_resize",
+    gtk_signal_new (I_("abort-column-resize"),
                     GTK_RUN_LAST | GTK_RUN_ACTION,
                     GTK_CLASS_TYPE (object_class),
                     GTK_SIGNAL_OFFSET (GtkCListClass, abort_column_resize),
-                    gtk_marshal_VOID__VOID,
+                    _gtk_marshal_VOID__VOID,
                     GTK_TYPE_NONE, 0);
 
   binding_set = gtk_binding_set_by_class (klass);
   gtk_binding_entry_add_signal (binding_set, GDK_Up, 0,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, 0,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
                                GTK_TYPE_FLOAT, 0.0);
   gtk_binding_entry_add_signal (binding_set, GDK_Down, 0,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, 0,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
                                GTK_TYPE_FLOAT, 0.0);
   gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, 0,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, 0,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
                                GTK_TYPE_FLOAT, 0.0);
   gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, 0,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, 0,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
                                GTK_TYPE_FLOAT, 0.0);
   gtk_binding_entry_add_signal (binding_set, GDK_Home, GDK_CONTROL_MASK,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, GDK_CONTROL_MASK,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 0.0);
   gtk_binding_entry_add_signal (binding_set, GDK_End, GDK_CONTROL_MASK,
-                               "scroll_vertical", 2,
+                               "scroll-vertical", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 1.0);
-
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_End, GDK_CONTROL_MASK,
+                               "scroll-vertical", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 1.0);
+  
   gtk_binding_entry_add_signal (binding_set, GDK_Up, GDK_SHIFT_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+                               GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, GDK_SHIFT_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
                                GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Down, GDK_SHIFT_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+                               GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Down, GDK_SHIFT_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
                                GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Page_Up, GDK_SHIFT_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
+                               GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Up, GDK_SHIFT_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_PAGE_BACKWARD,
                                GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Page_Down, GDK_SHIFT_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
+                               GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Page_Down, GDK_SHIFT_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_PAGE_FORWARD,
                                GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_Home,
                                GDK_SHIFT_MASK | GDK_CONTROL_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Home,
+                                GDK_SHIFT_MASK | GDK_CONTROL_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 0.0, GTK_TYPE_BOOL, TRUE);
   gtk_binding_entry_add_signal (binding_set, GDK_End,
                                GDK_SHIFT_MASK | GDK_CONTROL_MASK,
-                               "extend_selection", 3,
+                               "extend-selection", 3,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_End,
+                               GDK_SHIFT_MASK | GDK_CONTROL_MASK,
+                               "extend-selection", 3,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 1.0, GTK_TYPE_BOOL, TRUE);
 
+  
   gtk_binding_entry_add_signal (binding_set, GDK_Left, 0,
-                               "scroll_horizontal", 2,
+                               "scroll-horizontal", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Left, 0,
+                               "scroll-horizontal", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD,
                                GTK_TYPE_FLOAT, 0.0);
+  
   gtk_binding_entry_add_signal (binding_set, GDK_Right, 0,
-                               "scroll_horizontal", 2,
+                               "scroll-horizontal", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Right, 0,
+                               "scroll-horizontal", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD,
                                GTK_TYPE_FLOAT, 0.0);
+
   gtk_binding_entry_add_signal (binding_set, GDK_Home, 0,
-                               "scroll_horizontal", 2,
+                               "scroll-horizontal", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Home, 0,
+                               "scroll-horizontal", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 0.0);
+  
   gtk_binding_entry_add_signal (binding_set, GDK_End, 0,
-                               "scroll_horizontal", 2,
+                               "scroll-horizontal", 2,
                                GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
                                GTK_TYPE_FLOAT, 1.0);
 
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_End, 0,
+                               "scroll-horizontal", 2,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 1.0);
+  
   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
-                               "undo_selection", 0);
+                               "undo-selection", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
-                               "abort_column_resize", 0);
+                               "abort-column-resize", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
-                               "toggle_focus_row", 0);
+                               "toggle-focus-row", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, 0,
+                               "toggle-focus-row", 0);  
   gtk_binding_entry_add_signal (binding_set, GDK_space, GDK_CONTROL_MASK,
-                               "toggle_add_mode", 0);
-  gtk_binding_entry_add_signal (binding_set, '/', GDK_CONTROL_MASK,
-                               "select_all", 0);
+                               "toggle-add-mode", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Space, GDK_CONTROL_MASK,
+                               "toggle-add-mode", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK,
+                               "select-all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, GDK_CONTROL_MASK,
+                               "select-all", 0);
   gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
-                               "unselect_all", 0);
+                               "unselect-all", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
                                GDK_RELEASE_MASK | GDK_SHIFT_MASK,
-                               "end_selection", 0);
+                               "end-selection", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
                                GDK_RELEASE_MASK | GDK_SHIFT_MASK,
-                               "end_selection", 0);
+                               "end-selection", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
                                GDK_RELEASE_MASK | GDK_SHIFT_MASK |
                                GDK_CONTROL_MASK,
-                               "end_selection", 0);
+                               "end-selection", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
                                GDK_RELEASE_MASK | GDK_SHIFT_MASK |
                                GDK_CONTROL_MASK,
-                               "end_selection", 0);
+                               "end-selection", 0);
 }
 
 static void
@@ -900,7 +986,7 @@ gtk_clist_get_arg (GtkObject      *object,
       GTK_VALUE_BOOL (*arg) = TRUE;
       for (i = 0; i < clist->columns; i++)
        if (clist->column[i].button &&
-           !GTK_WIDGET_SENSITIVE (clist->column[i].button))
+           !gtk_widget_get_sensitive (clist->column[i].button))
          {
            GTK_VALUE_BOOL (*arg) = FALSE;
            break;
@@ -924,13 +1010,10 @@ gtk_clist_init (GtkCList *clist)
   clist->flags = 0;
 
   GTK_WIDGET_UNSET_FLAGS (clist, GTK_NO_WINDOW);
-  GTK_WIDGET_SET_FLAGS (clist, GTK_CAN_FOCUS);
+  gtk_widget_set_can_focus (GTK_WIDGET (clist), TRUE);
   GTK_CLIST_SET_FLAG (clist, CLIST_DRAW_DRAG_LINE);
   GTK_CLIST_SET_FLAG (clist, CLIST_USE_DRAG_ICONS);
 
-  clist->row_mem_chunk = NULL;
-  clist->cell_mem_chunk = NULL;
-
   clist->freeze_count = 0;
 
   clist->rows = 0;
@@ -991,6 +1074,8 @@ gtk_clist_init (GtkCList *clist)
   clist->compare = default_compare;
   clist->sort_type = GTK_SORT_ASCENDING;
   clist->sort_column = 0;
+
+  clist->drag_highlight_row = -1;
 }
 
 /* Constructor */
@@ -1004,23 +1089,6 @@ gtk_clist_constructor (GType                  type,
                                                                construct_properties);
   GtkCList *clist = GTK_CLIST (object);
   
-  /* initalize memory chunks, if this has not been done by any
-   * possibly derived widget
-   */
-  if (!clist->row_mem_chunk)
-    clist->row_mem_chunk = g_mem_chunk_new ("clist row mem chunk",
-                                           sizeof (GtkCListRow),
-                                           sizeof (GtkCListRow) *
-                                           CLIST_OPTIMUM_SIZE, 
-                                           G_ALLOC_AND_FREE);
-  
-  if (!clist->cell_mem_chunk)
-    clist->cell_mem_chunk = g_mem_chunk_new ("clist cell mem chunk",
-                                            sizeof (GtkCell) * clist->columns,
-                                            sizeof (GtkCell) * clist->columns *
-                                            CLIST_OPTIMUM_SIZE, 
-                                            G_ALLOC_AND_FREE);
-  
   /* allocate memory for columns */
   clist->column = columns_new (clist);
   
@@ -1080,7 +1148,6 @@ gtk_clist_set_hadjustment (GtkCList      *clist,
 {
   GtkAdjustment *old_adjustment;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   if (adjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
@@ -1093,21 +1160,20 @@ gtk_clist_set_hadjustment (GtkCList      *clist,
   if (clist->hadjustment)
     {
       gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist);
-      gtk_object_unref (GTK_OBJECT (clist->hadjustment));
+      g_object_unref (clist->hadjustment);
     }
 
   clist->hadjustment = adjustment;
 
   if (clist->hadjustment)
     {
-      gtk_object_ref (GTK_OBJECT (clist->hadjustment));
-      gtk_object_sink (GTK_OBJECT (clist->hadjustment));
+      g_object_ref_sink (clist->hadjustment);
 
       gtk_signal_connect (GTK_OBJECT (clist->hadjustment), "changed",
-                         (GtkSignalFunc) hadjustment_changed,
+                         G_CALLBACK (hadjustment_changed),
                          (gpointer) clist);
-      gtk_signal_connect (GTK_OBJECT (clist->hadjustment), "value_changed",
-                         (GtkSignalFunc) hadjustment_value_changed,
+      gtk_signal_connect (GTK_OBJECT (clist->hadjustment), "value-changed",
+                         G_CALLBACK (hadjustment_value_changed),
                          (gpointer) clist);
     }
 
@@ -1118,7 +1184,6 @@ gtk_clist_set_hadjustment (GtkCList      *clist,
 GtkAdjustment *
 gtk_clist_get_hadjustment (GtkCList *clist)
 {
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   return clist->hadjustment;
@@ -1130,7 +1195,6 @@ gtk_clist_set_vadjustment (GtkCList      *clist,
 {
   GtkAdjustment *old_adjustment;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   if (adjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
@@ -1143,21 +1207,20 @@ gtk_clist_set_vadjustment (GtkCList      *clist,
   if (clist->vadjustment)
     {
       gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist);
-      gtk_object_unref (GTK_OBJECT (clist->vadjustment));
+      g_object_unref (clist->vadjustment);
     }
 
   clist->vadjustment = adjustment;
 
   if (clist->vadjustment)
     {
-      gtk_object_ref (GTK_OBJECT (clist->vadjustment));
-      gtk_object_sink (GTK_OBJECT (clist->vadjustment));
+      g_object_ref_sink (clist->vadjustment);
 
       gtk_signal_connect (GTK_OBJECT (clist->vadjustment), "changed",
-                         (GtkSignalFunc) vadjustment_changed,
+                         G_CALLBACK (vadjustment_changed),
                          (gpointer) clist);
-      gtk_signal_connect (GTK_OBJECT (clist->vadjustment), "value_changed",
-                         (GtkSignalFunc) vadjustment_value_changed,
+      gtk_signal_connect (GTK_OBJECT (clist->vadjustment), "value-changed",
+                         G_CALLBACK (vadjustment_value_changed),
                          (gpointer) clist);
     }
 
@@ -1168,7 +1231,6 @@ gtk_clist_set_vadjustment (GtkCList      *clist,
 GtkAdjustment *
 gtk_clist_get_vadjustment (GtkCList *clist)
 {
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   return clist->vadjustment;
@@ -1189,12 +1251,11 @@ void
 gtk_clist_set_shadow_type (GtkCList      *clist,
                           GtkShadowType  type)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   clist->shadow_type = type;
 
-  if (GTK_WIDGET_VISIBLE (clist))
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)))
     gtk_widget_queue_resize (GTK_WIDGET (clist));
 }
 
@@ -1202,8 +1263,8 @@ void
 gtk_clist_set_selection_mode (GtkCList         *clist,
                              GtkSelectionMode  mode)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
+  g_return_if_fail (mode != GTK_SELECTION_NONE);
 
   if (mode == clist->selection_mode)
     return;
@@ -1222,19 +1283,20 @@ gtk_clist_set_selection_mode (GtkCList         *clist,
   switch (mode)
     {
     case GTK_SELECTION_MULTIPLE:
-    case GTK_SELECTION_EXTENDED:
       return;
     case GTK_SELECTION_BROWSE:
     case GTK_SELECTION_SINGLE:
       gtk_clist_unselect_all (clist);
       break;
+    default:
+      /* Someone set it by hand */
+      g_assert_not_reached ();
     }
 }
 
 void
 gtk_clist_freeze (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   clist->freeze_count++;
@@ -1243,7 +1305,6 @@ gtk_clist_freeze (GtkCList *clist)
 void
 gtk_clist_thaw (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (clist->freeze_count)
@@ -1275,7 +1336,6 @@ gtk_clist_thaw (GtkCList *clist)
 void
 gtk_clist_column_titles_show (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (!GTK_CLIST_SHOW_TITLES(clist))
@@ -1290,7 +1350,6 @@ gtk_clist_column_titles_show (GtkCList *clist)
 void 
 gtk_clist_column_titles_hide (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (GTK_CLIST_SHOW_TITLES(clist))
@@ -1306,7 +1365,6 @@ void
 gtk_clist_column_title_active (GtkCList *clist,
                               gint      column)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1317,11 +1375,11 @@ gtk_clist_column_title_active (GtkCList *clist,
   clist->column[column].button_passive = FALSE;
 
   gtk_signal_disconnect_by_func (GTK_OBJECT (clist->column[column].button),
-                                (GtkSignalFunc) column_title_passive_func,
+                                G_CALLBACK (column_title_passive_func),
                                 NULL);
 
-  GTK_WIDGET_SET_FLAGS (clist->column[column].button, GTK_CAN_FOCUS);
-  if (GTK_WIDGET_VISIBLE (clist))
+  gtk_widget_set_can_focus (clist->column[column].button, TRUE);
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)))
     gtk_widget_queue_draw (clist->column[column].button);
 }
 
@@ -1331,7 +1389,6 @@ gtk_clist_column_title_passive (GtkCList *clist,
 {
   GtkButton *button;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1344,15 +1401,16 @@ gtk_clist_column_title_passive (GtkCList *clist,
   clist->column[column].button_passive = TRUE;
 
   if (button->button_down)
-    gtk_button_released (button);
+    g_signal_emit_by_name (button, "released");
   if (button->in_button)
-    gtk_button_leave (button);
+    g_signal_emit_by_name (button, "leave");
 
   gtk_signal_connect (GTK_OBJECT (clist->column[column].button), "event",
-                     (GtkSignalFunc) column_title_passive_func, NULL);
+                     G_CALLBACK (column_title_passive_func),
+                      NULL);
 
-  GTK_WIDGET_UNSET_FLAGS (clist->column[column].button, GTK_CAN_FOCUS);
-  if (GTK_WIDGET_VISIBLE (clist))
+  gtk_widget_set_can_focus (clist->column[column].button, FALSE);
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)))
     gtk_widget_queue_draw (clist->column[column].button);
 }
 
@@ -1361,7 +1419,6 @@ gtk_clist_column_titles_active (GtkCList *clist)
 {
   gint i;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   for (i = 0; i < clist->columns; i++)
@@ -1373,7 +1430,6 @@ gtk_clist_column_titles_passive (GtkCList *clist)
 {
   gint i;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   for (i = 0; i < clist->columns; i++)
@@ -1390,7 +1446,6 @@ gtk_clist_set_column_title (GtkCList    *clist,
   GtkWidget *alignment = NULL;
   GtkWidget *label;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1441,7 +1496,7 @@ gtk_clist_set_column_title (GtkCList    *clist,
 
   /* if this button didn't previously exist, then the
    * column button positions have to be re-computed */
-  if (GTK_WIDGET_VISIBLE (clist) && new_button)
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)) && new_button)
     size_allocate_title_buttons (clist);
 }
 
@@ -1449,7 +1504,6 @@ gchar *
 gtk_clist_get_column_title (GtkCList *clist,
                            gint      column)
 {
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   if (column < 0 || column >= clist->columns)
@@ -1466,7 +1520,6 @@ gtk_clist_set_column_widget (GtkCList  *clist,
   gint new_button = 0;
   GtkWidget *old_widget;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1497,7 +1550,7 @@ gtk_clist_set_column_widget (GtkCList  *clist,
 
   /* if this button didn't previously exist, then the
    * column button positions have to be re-computed */
-  if (GTK_WIDGET_VISIBLE (clist) && new_button)
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)) && new_button)
     size_allocate_title_buttons (clist);
 }
 
@@ -1505,14 +1558,13 @@ GtkWidget *
 gtk_clist_get_column_widget (GtkCList *clist,
                             gint      column)
 {
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   if (column < 0 || column >= clist->columns)
     return NULL;
 
   if (clist->column[column].button)
-    return GTK_BUTTON (clist->column[column].button)->child;
+    return GTK_BIN (clist->column[column].button)->child;
 
   return NULL;
 }
@@ -1524,7 +1576,6 @@ gtk_clist_set_column_justification (GtkCList         *clist,
 {
   GtkWidget *alignment;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1570,7 +1621,6 @@ gtk_clist_set_column_visibility (GtkCList *clist,
                                 gint      column,
                                 gboolean  visible)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1610,7 +1660,6 @@ gtk_clist_set_column_resizeable (GtkCList *clist,
                                 gint      column,
                                 gboolean  resizeable)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1622,7 +1671,7 @@ gtk_clist_set_column_resizeable (GtkCList *clist,
   if (resizeable)
     clist->column[column].auto_resize = FALSE;
 
-  if (GTK_WIDGET_VISIBLE (clist))
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)))
     size_allocate_title_buttons (clist);
 }
 
@@ -1631,7 +1680,6 @@ gtk_clist_set_column_auto_resize (GtkCList *clist,
                                  gint      column,
                                  gboolean  auto_resize)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1643,7 +1691,7 @@ gtk_clist_set_column_auto_resize (GtkCList *clist,
   if (auto_resize)
     {
       clist->column[column].resizeable = FALSE;
-      if (!GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
        {
          gint width;
 
@@ -1652,7 +1700,7 @@ gtk_clist_set_column_auto_resize (GtkCList *clist,
        }
     }
 
-  if (GTK_WIDGET_VISIBLE (clist))
+  if (gtk_widget_get_visible (GTK_WIDGET (clist)))
     size_allocate_title_buttons (clist);
 }
 
@@ -1662,7 +1710,6 @@ gtk_clist_columns_autosize (GtkCList *clist)
   gint i;
   gint width;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   gtk_clist_freeze (clist);
@@ -1687,7 +1734,6 @@ gtk_clist_optimal_column_width (GtkCList *clist,
   GList *list;
   gint width;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_CLIST (clist), 0);
 
   if (column < 0 || column >= clist->columns)
@@ -1717,7 +1763,6 @@ gtk_clist_set_column_width (GtkCList *clist,
                            gint      column,
                            gint      width)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1732,7 +1777,6 @@ gtk_clist_set_column_min_width (GtkCList *clist,
                                gint      column,
                                gint      min_width)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1755,7 +1799,6 @@ gtk_clist_set_column_max_width (GtkCList *clist,
                                gint      column,
                                gint      max_width)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1795,7 +1838,7 @@ column_auto_resize (GtkCList    *clist,
   GtkRequisition requisition;
 
   if (!clist->column[column].auto_resize ||
-      GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     return;
 
   if (clist_row)
@@ -1839,7 +1882,6 @@ real_resize_column (GtkCList *clist,
                    gint      column,
                    gint      width)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -1867,7 +1909,6 @@ real_resize_column (GtkCList *clist,
 static void
 abort_column_resize (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (!GTK_CLIST_IN_DRAG(clist))
@@ -1875,7 +1916,8 @@ abort_column_resize (GtkCList *clist)
 
   GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG);
   gtk_grab_remove (GTK_WIDGET (clist));
-  gdk_pointer_ungrab (GDK_CURRENT_TIME);
+  gdk_display_pointer_ungrab (gtk_widget_get_display (GTK_WIDGET (clist)),
+                             GDK_CURRENT_TIME);
   clist->drag_pos = -1;
 
   if (clist->x_drag >= 0 && clist->x_drag <= clist->clist_window_width - 1)
@@ -1883,8 +1925,10 @@ abort_column_resize (GtkCList *clist)
 
   if (GTK_CLIST_ADD_MODE(clist))
     {
+      gint8 dashes[] = { 4, 4 };
+
       gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_ON_OFF_DASH, 0,0);
-      gdk_gc_set_dashes (clist->xor_gc, 0, "\4\4", 2);
+      gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes));
     }
 }
 
@@ -2097,7 +2141,7 @@ column_button_create (GtkCList *clist,
   gtk_widget_set_parent (button, GTK_WIDGET (clist));
 
   gtk_signal_connect (GTK_OBJECT (button), "clicked",
-                     (GtkSignalFunc) column_button_clicked,
+                     G_CALLBACK (column_button_clicked),
                      (gpointer) clist);
   gtk_widget_show (button);
 }
@@ -2163,7 +2207,6 @@ gtk_clist_get_cell_type (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
 
   if (row < 0 || row >= clist->rows)
@@ -2184,7 +2227,6 @@ gtk_clist_set_text (GtkCList    *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -2214,7 +2256,6 @@ gtk_clist_get_text (GtkCList  *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   if (row < 0 || row >= clist->rows)
@@ -2233,6 +2274,10 @@ gtk_clist_get_text (GtkCList  *clist,
   return 1;
 }
 
+/**
+ * gtk_clist_set_pixmap:
+ * @mask: (allow-none):
+ */
 void
 gtk_clist_set_pixmap (GtkCList  *clist,
                      gint       row,
@@ -2242,7 +2287,6 @@ gtk_clist_set_pixmap (GtkCList  *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -2252,9 +2296,9 @@ gtk_clist_set_pixmap (GtkCList  *clist,
 
   clist_row = ROW_ELEMENT (clist, row)->data;
   
-  gdk_pixmap_ref (pixmap);
+  g_object_ref (pixmap);
   
-  if (mask) gdk_pixmap_ref (mask);
+  if (mask) g_object_ref (mask);
   
   GTK_CLIST_GET_CLASS (clist)->set_cell_contents
     (clist, clist_row, column, GTK_CELL_PIXMAP, NULL, 0, pixmap, mask);
@@ -2276,7 +2320,6 @@ gtk_clist_get_pixmap (GtkCList   *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   if (row < 0 || row >= clist->rows)
@@ -2310,7 +2353,6 @@ gtk_clist_set_pixtext (GtkCList    *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -2320,8 +2362,8 @@ gtk_clist_set_pixtext (GtkCList    *clist,
 
   clist_row = ROW_ELEMENT (clist, row)->data;
   
-  gdk_pixmap_ref (pixmap);
-  if (mask) gdk_pixmap_ref (mask);
+  g_object_ref (pixmap);
+  if (mask) g_object_ref (mask);
   GTK_CLIST_GET_CLASS (clist)->set_cell_contents
     (clist, clist_row, column, GTK_CELL_PIXTEXT, text, spacing, pixmap, mask);
 
@@ -2344,7 +2386,6 @@ gtk_clist_get_pixtext (GtkCList   *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   if (row < 0 || row >= clist->rows)
@@ -2381,7 +2422,6 @@ gtk_clist_set_shift (GtkCList *clist,
   GtkRequisition requisition = { 0 };
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -2392,7 +2432,7 @@ gtk_clist_set_shift (GtkCList *clist,
   clist_row = ROW_ELEMENT (clist, row)->data;
 
   if (clist->column[column].auto_resize &&
-      !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row,
                                                   column, &requisition);
 
@@ -2424,12 +2464,11 @@ set_cell_contents (GtkCList    *clist,
   GdkPixmap *old_pixmap = NULL;
   GdkBitmap *old_mask = NULL;
   
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   g_return_if_fail (clist_row != NULL);
 
   if (clist->column[column].auto_resize &&
-      !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row,
                                                   column, &requisition);
 
@@ -2450,7 +2489,7 @@ set_cell_contents (GtkCList    *clist,
       old_mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask;
       break;
     case GTK_CELL_WIDGET:
-      /* unimplimented */
+      /* unimplemented */
       break;
     default:
       break;
@@ -2493,15 +2532,14 @@ set_cell_contents (GtkCList    *clist,
     }
 
   if (clist->column[column].auto_resize &&
-      !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     column_auto_resize (clist, clist_row, column, requisition.width);
 
-  if (old_text)
-    g_free (old_text);
+  g_free (old_text);
   if (old_pixmap)
-    gdk_pixmap_unref (old_pixmap);
+    g_object_unref (old_pixmap);
   if (old_mask)
-    gdk_pixmap_unref (old_mask);
+    g_object_unref (old_mask);
 }
 
 PangoLayout *
@@ -2554,7 +2592,6 @@ cell_size_request (GtkCList       *clist,
   PangoLayout *layout;
   PangoRectangle logical_rect;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   g_return_if_fail (requisition != NULL);
 
@@ -2566,7 +2603,7 @@ cell_size_request (GtkCList       *clist,
       requisition->width = logical_rect.width;
       requisition->height = logical_rect.height;
       
-      g_object_unref (G_OBJECT (layout));
+      g_object_unref (layout);
     }
   else
     {
@@ -2580,9 +2617,14 @@ cell_size_request (GtkCList       *clist,
   switch (clist_row->cell[column].type)
     {
     case GTK_CELL_PIXTEXT:
+      gdk_drawable_get_size (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap,
+                             &width, &height);
+      requisition->width += width;
+      requisition->height = MAX (requisition->height, height);      
+      break;
     case GTK_CELL_PIXMAP:
-      gdk_window_get_size (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap,
-                          &width, &height);
+      gdk_drawable_get_size (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap,
+                             &width, &height);
       requisition->width += width;
       requisition->height = MAX (requisition->height, height);
       break;
@@ -2606,7 +2648,6 @@ gint
 gtk_clist_prepend (GtkCList    *clist,
                   gchar       *text[])
 {
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
   g_return_val_if_fail (text != NULL, -1);
 
@@ -2617,7 +2658,6 @@ gint
 gtk_clist_append (GtkCList    *clist,
                  gchar       *text[])
 {
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
   g_return_val_if_fail (text != NULL, -1);
 
@@ -2629,7 +2669,6 @@ gtk_clist_insert (GtkCList    *clist,
                  gint         row,
                  gchar       *text[])
 {
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
   g_return_val_if_fail (text != NULL, -1);
 
@@ -2649,7 +2688,6 @@ gtk_clist_remove (GtkCList *clist,
 void
 gtk_clist_clear (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
   GTK_CLIST_GET_CLASS (clist)->clear (clist);
@@ -2669,7 +2707,6 @@ real_insert_row (GtkCList *clist,
   gint i;
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
   g_return_val_if_fail (text != NULL, -1);
 
@@ -2761,11 +2798,10 @@ static void
 real_remove_row (GtkCList *clist,
                 gint      row)
 {
-  gint was_visible, was_selected;
+  gint was_visible;
   GList *list;
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   /* return if out of bounds */
@@ -2773,7 +2809,6 @@ real_remove_row (GtkCList *clist,
     return;
 
   was_visible = (gtk_clist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE);
-  was_selected = 0;
 
   /* get the row we're going to delete */
   list = ROW_ELEMENT (clist, row);
@@ -2796,11 +2831,7 @@ real_remove_row (GtkCList *clist,
     clist->row_list = g_list_next (list);
   if (clist->row_list_end == list)
     clist->row_list_end = g_list_previous (list);
-  g_list_remove (list, clist_row);
-
-  /*if (clist->focus_row >=0 &&
-      (row <= clist->focus_row || clist->focus_row >= clist->rows))
-      clist->focus_row--;*/
+  list = g_list_remove (list, clist_row);
 
   if (row < ROW_FROM_YPIXEL (clist, 0))
     clist->voffset += clist->row_height + CELL_SPACING;
@@ -2830,7 +2861,6 @@ real_clear (GtkCList *clist)
   GList *free_list;
   gint i;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   /* free up the selection list */
@@ -2889,7 +2919,6 @@ real_row_move (GtkCList *clist,
   gint first, last;
   gint d;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (GTK_CLIST_AUTO_SORT(clist))
@@ -2966,7 +2995,6 @@ gtk_clist_moveto (GtkCList *clist,
                  gfloat    row_align,
                  gfloat    col_align)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < -1 || row >= clist->rows)
@@ -3005,7 +3033,6 @@ gtk_clist_set_row_height (GtkCList *clist,
 {
   GtkWidget *widget;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   widget = GTK_WIDGET (clist);
@@ -3024,17 +3051,20 @@ gtk_clist_set_row_height (GtkCList *clist,
   if (widget->style->font_desc)
     {
       PangoContext *context = gtk_widget_get_pango_context (widget);
-      PangoFontMetrics metrics;
-      PangoFont *font = pango_context_load_font (context, widget->style->font_desc);
-      gchar *lang = pango_context_get_lang (context);
+      PangoFontMetrics *metrics;
 
-      pango_font_get_metrics (font, lang, &metrics);
-      
-      g_free (lang);
-      g_object_unref (G_OBJECT (font));
+      metrics = pango_context_get_metrics (context,
+                                          widget->style->font_desc,
+                                          pango_context_get_language (context));
       
       if (!GTK_CLIST_ROW_HEIGHT_SET(clist))
-       clist->row_height = PANGO_PIXELS (metrics.ascent + metrics.descent);
+       {
+         clist->row_height = (pango_font_metrics_get_ascent (metrics) +
+                              pango_font_metrics_get_descent (metrics));
+         clist->row_height = PANGO_PIXELS (clist->row_height);
+       }
+
+      pango_font_metrics_unref (metrics);
     }
       
   CLIST_REFRESH (clist);
@@ -3049,14 +3079,13 @@ gtk_clist_set_row_data (GtkCList *clist,
 }
 
 void
-gtk_clist_set_row_data_full (GtkCList         *clist,
-                            gint              row,
-                            gpointer          data,
-                            GtkDestroyNotify  destroy)
+gtk_clist_set_row_data_full (GtkCList       *clist,
+                            gint            row,
+                            gpointer        data,
+                            GDestroyNotify  destroy)
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row > (clist->rows - 1))
@@ -3077,7 +3106,6 @@ gtk_clist_get_row_data (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   if (row < 0 || row > (clist->rows - 1))
@@ -3094,7 +3122,6 @@ gtk_clist_find_row_from_data (GtkCList *clist,
   GList *list;
   gint n;
 
-  g_return_val_if_fail (clist != NULL, -1);
   g_return_val_if_fail (GTK_IS_CLIST (clist), -1);
 
   for (n = 0, list = clist->row_list; list; n++, list = list->next)
@@ -3111,7 +3138,6 @@ gtk_clist_swap_rows (GtkCList *clist,
 {
   gint first, last;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   g_return_if_fail (row1 != row2);
 
@@ -3134,7 +3160,6 @@ gtk_clist_row_move (GtkCList *clist,
                    gint      source_row,
                    gint      dest_row)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (GTK_CLIST_AUTO_SORT(clist))
@@ -3155,7 +3180,6 @@ gtk_clist_row_is_visible (GtkCList *clist,
 {
   gint top;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   if (row < 0 || row >= clist->rows)
@@ -3180,13 +3204,12 @@ gtk_clist_row_is_visible (GtkCList *clist,
 }
 
 void
-gtk_clist_set_foreground (GtkCList *clist,
-                         gint      row,
-                         GdkColor *color)
+gtk_clist_set_foreground (GtkCList       *clist,
+                         gint            row,
+                         const GdkColor *color)
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3199,8 +3222,8 @@ gtk_clist_set_foreground (GtkCList *clist,
       clist_row->foreground = *color;
       clist_row->fg_set = TRUE;
       if (GTK_WIDGET_REALIZED (clist))
-       gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (clist)),
-                        &clist_row->foreground);
+       gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (clist)),
+                                  &clist_row->foreground, FALSE, TRUE);
     }
   else
     clist_row->fg_set = FALSE;
@@ -3210,13 +3233,12 @@ gtk_clist_set_foreground (GtkCList *clist,
 }
 
 void
-gtk_clist_set_background (GtkCList *clist,
-                         gint      row,
-                         GdkColor *color)
+gtk_clist_set_background (GtkCList       *clist,
+                         gint            row,
+                         const GdkColor *color)
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3229,8 +3251,8 @@ gtk_clist_set_background (GtkCList *clist,
       clist_row->background = *color;
       clist_row->bg_set = TRUE;
       if (GTK_WIDGET_REALIZED (clist))
-       gdk_color_alloc (gtk_widget_get_colormap (GTK_WIDGET (clist)),
-                        &clist_row->background);
+       gdk_colormap_alloc_color (gtk_widget_get_colormap (GTK_WIDGET (clist)),
+                                  &clist_row->background, FALSE, TRUE);
     }
   else
     clist_row->bg_set = FALSE;
@@ -3255,7 +3277,6 @@ gtk_clist_set_cell_style (GtkCList *clist,
   GtkRequisition requisition = { 0 };
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3269,7 +3290,7 @@ gtk_clist_set_cell_style (GtkCList *clist,
     return;
 
   if (clist->column[column].auto_resize &&
-      !GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+      !GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     GTK_CLIST_GET_CLASS (clist)->cell_size_request (clist, clist_row,
                                                   column, &requisition);
 
@@ -3277,14 +3298,14 @@ gtk_clist_set_cell_style (GtkCList *clist,
     {
       if (GTK_WIDGET_REALIZED (clist))
         gtk_style_detach (clist_row->cell[column].style);
-      gtk_style_unref (clist_row->cell[column].style);
+      g_object_unref (clist_row->cell[column].style);
     }
 
   clist_row->cell[column].style = style;
 
   if (clist_row->cell[column].style)
     {
-      gtk_style_ref (clist_row->cell[column].style);
+      g_object_ref (clist_row->cell[column].style);
       
       if (GTK_WIDGET_REALIZED (clist))
         clist_row->cell[column].style =
@@ -3309,7 +3330,6 @@ gtk_clist_get_cell_style (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   if (row < 0 || row >= clist->rows || column < 0 || column >= clist->columns)
@@ -3330,7 +3350,6 @@ gtk_clist_set_row_style (GtkCList *clist,
   gint *old_width;
   gint i;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3343,7 +3362,7 @@ gtk_clist_set_row_style (GtkCList *clist,
 
   old_width = g_new (gint, clist->columns);
 
-  if (!GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+  if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     {
       for (i = 0; i < clist->columns; i++)
        if (clist->column[i].auto_resize)
@@ -3358,21 +3377,21 @@ gtk_clist_set_row_style (GtkCList *clist,
     {
       if (GTK_WIDGET_REALIZED (clist))
         gtk_style_detach (clist_row->style);
-      gtk_style_unref (clist_row->style);
+      g_object_unref (clist_row->style);
     }
 
   clist_row->style = style;
 
   if (clist_row->style)
     {
-      gtk_style_ref (clist_row->style);
+      g_object_ref (clist_row->style);
       
       if (GTK_WIDGET_REALIZED (clist))
         clist_row->style = gtk_style_attach (clist_row->style,
                                             clist->clist_window);
     }
 
-  if (GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+  if (GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     for (i = 0; i < clist->columns; i++)
       column_auto_resize (clist, clist_row, i, old_width[i]);
 
@@ -3392,7 +3411,6 @@ gtk_clist_get_row_style (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_val_if_fail (clist != NULL, NULL);
   g_return_val_if_fail (GTK_IS_CLIST (clist), NULL);
 
   if (row < 0 || row >= clist->rows)
@@ -3419,7 +3437,6 @@ gtk_clist_set_selectable (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3435,7 +3452,7 @@ gtk_clist_set_selectable (GtkCList *clist,
   if (!selectable && clist_row->state == GTK_STATE_SELECTED)
     {
       if (clist->anchor >= 0 &&
-         clist->selection_mode == GTK_SELECTION_EXTENDED)
+         clist->selection_mode == GTK_SELECTION_MULTIPLE)
        {
          clist->drag_button = 0;
          remove_grab (clist);
@@ -3450,7 +3467,6 @@ gboolean
 gtk_clist_get_selectable (GtkCList *clist,
                          gint      row)
 {
-  g_return_val_if_fail (clist != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (clist), FALSE);
 
   if (row < 0 || row >= clist->rows)
@@ -3464,7 +3480,6 @@ gtk_clist_select_row (GtkCList *clist,
                      gint      row,
                      gint      column)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3481,7 +3496,6 @@ gtk_clist_unselect_row (GtkCList *clist,
                        gint      row,
                        gint      column)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row >= clist->rows)
@@ -3496,7 +3510,6 @@ gtk_clist_unselect_row (GtkCList *clist,
 void
 gtk_clist_select_all (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   GTK_CLIST_GET_CLASS (clist)->select_all (clist);
@@ -3505,7 +3518,6 @@ gtk_clist_select_all (GtkCList *clist)
 void
 gtk_clist_unselect_all (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   GTK_CLIST_GET_CLASS (clist)->unselect_all (clist);
@@ -3514,10 +3526,9 @@ gtk_clist_unselect_all (GtkCList *clist)
 void
 gtk_clist_undo_selection (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (clist->selection_mode == GTK_SELECTION_EXTENDED &&
+  if (clist->selection_mode == GTK_SELECTION_MULTIPLE &&
       (clist->undo_selection || clist->undo_unselection))
     gtk_signal_emit (GTK_OBJECT (clist), clist_signals[UNDO_SELECTION]);
 }
@@ -3560,7 +3571,6 @@ toggle_row (GtkCList *clist,
 
   switch (clist->selection_mode)
     {
-    case GTK_SELECTION_EXTENDED:
     case GTK_SELECTION_MULTIPLE:
     case GTK_SELECTION_SINGLE:
       clist_row = ROW_ELEMENT (clist, row)->data;
@@ -3578,6 +3588,8 @@ toggle_row (GtkCList *clist,
       gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                       row, column, event);
       break;
+    default:
+      g_assert_not_reached ();
     }
 }
 
@@ -3603,23 +3615,29 @@ fake_toggle_row (GtkCList *clist,
                                          GTK_CLIST_ROW (work));
 }
 
+static gboolean
+clist_has_grab (GtkCList *clist)
+{
+  return (GTK_WIDGET_HAS_GRAB (clist) &&
+         gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))));
+}
+
 static void
 toggle_focus_row (GtkCList *clist)
 {
   g_return_if_fail (clist != 0);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist)) ||
+  if (clist_has_grab (clist) ||
       clist->focus_row < 0 || clist->focus_row >= clist->rows)
     return;
 
   switch (clist->selection_mode)
     {
     case  GTK_SELECTION_SINGLE:
-    case  GTK_SELECTION_MULTIPLE:
       toggle_row (clist, clist->focus_row, 0, NULL);
       break;
-    case GTK_SELECTION_EXTENDED:
+    case GTK_SELECTION_MULTIPLE:
       g_list_free (clist->undo_selection);
       g_list_free (clist->undo_unselection);
       clist->undo_selection = NULL;
@@ -3647,17 +3665,19 @@ toggle_add_mode (GtkCList *clist)
   g_return_if_fail (clist != 0);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
-  if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist)) ||
-      clist->selection_mode != GTK_SELECTION_EXTENDED)
+  if (clist_has_grab (clist) ||
+      clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
 
   gtk_clist_draw_focus (GTK_WIDGET (clist));
   if (!GTK_CLIST_ADD_MODE(clist))
     {
+      gint8 dashes[] = { 4, 4 };
+
       GTK_CLIST_SET_FLAG (clist, CLIST_ADD_MODE);
       gdk_gc_set_line_attributes (clist->xor_gc, 1,
                                  GDK_LINE_ON_OFF_DASH, 0, 0);
-      gdk_gc_set_dashes (clist->xor_gc, 0, "\4\4", 2);
+      gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes));
     }
   else
     {
@@ -3679,7 +3699,6 @@ real_select_row (GtkCList *clist,
   gint sel_row;
   gboolean row_selected;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row > (clist->rows - 1))
@@ -3741,7 +3760,6 @@ real_unselect_row (GtkCList *clist,
 {
   GtkCListRow *clist_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (row < 0 || row > (clist->rows - 1))
@@ -3769,13 +3787,9 @@ real_unselect_row (GtkCList *clist,
 static void
 real_select_all (GtkCList *clist)
 {
-  GList *list;
-  gint i;
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   switch (clist->selection_mode)
@@ -3784,7 +3798,7 @@ real_select_all (GtkCList *clist)
     case GTK_SELECTION_BROWSE:
       return;
 
-    case GTK_SELECTION_EXTENDED:
+    case GTK_SELECTION_MULTIPLE:
       g_list_free (clist->undo_selection);
       g_list_free (clist->undo_unselection);
       clist->undo_selection = NULL;
@@ -3802,15 +3816,8 @@ real_select_all (GtkCList *clist)
       update_extended_selection (clist, clist->rows);
       GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
       return;
-
-    case GTK_SELECTION_MULTIPLE:
-      for (i = 0, list = clist->row_list; list; i++, list = list->next)
-       {
-         if (((GtkCListRow *)(list->data))->state == GTK_STATE_NORMAL)
-           gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
-                            i, -1, NULL);
-       }
-      return;
+    default:
+      g_assert_not_reached ();
     }
 }
 
@@ -3820,10 +3827,9 @@ real_unselect_all (GtkCList *clist)
   GList *list;
   gint i;
  
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   switch (clist->selection_mode)
@@ -3837,7 +3843,7 @@ real_unselect_all (GtkCList *clist)
          return;
        }
       break;
-    case GTK_SELECTION_EXTENDED:
+    case GTK_SELECTION_MULTIPLE:
       g_list_free (clist->undo_selection);
       g_list_free (clist->undo_unselection);
       clist->undo_selection = NULL;
@@ -3906,11 +3912,10 @@ real_undo_selection (GtkCList *clist)
 {
   GList *work;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist)) ||
-      clist->selection_mode != GTK_SELECTION_EXTENDED)
+  if (clist_has_grab (clist) ||
+      clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
 
   GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
@@ -3932,7 +3937,7 @@ real_undo_selection (GtkCList *clist)
                       GPOINTER_TO_INT (work->data), -1, NULL);
     }
 
-  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)
     {
       gtk_clist_draw_focus (GTK_WIDGET (clist));
       clist->focus_row = clist->undo_anchor;
@@ -3961,10 +3966,9 @@ set_anchor (GtkCList *clist,
            gint      anchor,
            gint      undo_anchor)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
-  if (clist->selection_mode != GTK_SELECTION_EXTENDED || clist->anchor >= 0)
+  if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor >= 0)
     return;
 
   g_list_free (clist->undo_selection);
@@ -3995,7 +3999,7 @@ resync_selection (GtkCList *clist,
   GList *list;
   GtkCListRow *clist_row;
 
-  if (clist->selection_mode != GTK_SELECTION_EXTENDED)
+  if (clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
 
   if (clist->anchor < 0 || clist->drag_pos < 0)
@@ -4118,7 +4122,7 @@ update_extended_selection (GtkCList *clist,
   gint h2 = 0;
   gint top;
 
-  if (clist->selection_mode != GTK_SELECTION_EXTENDED || clist->anchor == -1)
+  if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor == -1)
     return;
 
   if (row < 0)
@@ -4260,10 +4264,9 @@ update_extended_selection (GtkCList *clist,
 static void
 start_selection (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   set_anchor (clist, GTK_CLIST_ADD_MODE(clist), clist->focus_row,
@@ -4273,10 +4276,10 @@ start_selection (GtkCList *clist)
 static void
 end_selection (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_FOCUS(clist))
+  if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) &&
+      gtk_widget_has_focus (GTK_WIDGET (clist)))
     return;
 
   GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
@@ -4288,11 +4291,10 @@ extend_selection (GtkCList      *clist,
                  gfloat         position,
                  gboolean       auto_start_selection)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if ((gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist)) ||
-      clist->selection_mode != GTK_SELECTION_EXTENDED)
+  if (clist_has_grab (clist) ||
+      clist->selection_mode != GTK_SELECTION_MULTIPLE)
     return;
 
   if (auto_start_selection)
@@ -4331,7 +4333,9 @@ sync_selection (GtkCList *clist,
        clist->focus_row += d;
       if (clist->focus_row == -1 && clist->rows >= 1)
        clist->focus_row = 0;
-      else if (clist->focus_row >= clist->rows)
+      else if (d < 0 && clist->focus_row >= clist->rows - 1)
+       clist->focus_row = clist->rows - 2;
+      else if (clist->focus_row >= clist->rows)        /* Paranoia */
        clist->focus_row = clist->rows - 1;
     }
 
@@ -4366,7 +4370,6 @@ gtk_clist_destroy (GtkObject *object)
   gint i;
   GtkCList *clist;
 
-  g_return_if_fail (object != NULL);
   g_return_if_fail (GTK_IS_CLIST (object));
 
   clist = GTK_CLIST (object);
@@ -4388,13 +4391,13 @@ gtk_clist_destroy (GtkObject *object)
   if (clist->hadjustment)
     {
       gtk_signal_disconnect_by_data (GTK_OBJECT (clist->hadjustment), clist);
-      gtk_object_unref (GTK_OBJECT (clist->hadjustment));
+      g_object_unref (clist->hadjustment);
       clist->hadjustment = NULL;
     }
   if (clist->vadjustment)
     {
       gtk_signal_disconnect_by_data (GTK_OBJECT (clist->vadjustment), clist);
-      gtk_object_unref (GTK_OBJECT (clist->vadjustment));
+      g_object_unref (clist->vadjustment);
       clist->vadjustment = NULL;
     }
 
@@ -4408,8 +4411,7 @@ gtk_clist_destroy (GtkObject *object)
        clist->column[i].button = NULL;
       }
 
-  if (GTK_OBJECT_CLASS (parent_class)->destroy)
-    (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+  GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
 static void
@@ -4423,9 +4425,6 @@ gtk_clist_finalize (GObject *object)
 
   columns_delete (clist);
 
-  g_mem_chunk_destroy (clist->cell_mem_chunk);
-  g_mem_chunk_destroy (clist->row_mem_chunk);
-
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -4455,7 +4454,6 @@ gtk_clist_realize (GtkWidget *widget)
   gint i;
   gint j;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
   clist = GTK_CLIST (widget);
@@ -4525,8 +4523,8 @@ gtk_clist_realize (GtkWidget *widget)
   gdk_window_set_background (clist->clist_window,
                             &widget->style->base[GTK_STATE_NORMAL]);
   gdk_window_show (clist->clist_window);
-  gdk_window_get_size (clist->clist_window, &clist->clist_window_width,
-                      &clist->clist_window_height);
+  gdk_drawable_get_size (clist->clist_window, &clist->clist_window_width,
+                         &clist->clist_window_height);
 
   /* create resize windows */
   attributes.wclass = GDK_INPUT_ONLY;
@@ -4535,7 +4533,8 @@ gtk_clist_realize (GtkWidget *widget)
                           GDK_POINTER_MOTION_MASK |
                           GDK_POINTER_MOTION_HINT_MASK);
   attributes_mask = GDK_WA_CURSOR;
-  attributes.cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW);
+  attributes.cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
+                                                 GDK_SB_H_DOUBLE_ARROW);
   clist->cursor_drag = attributes.cursor;
 
   attributes.x =  LIST_WIDTH (clist) + 1;
@@ -4589,9 +4588,11 @@ gtk_clist_realize (GtkWidget *widget)
 
          colormap = gtk_widget_get_colormap (widget);
          if (clist_row->fg_set)
-           gdk_color_alloc (colormap, &clist_row->foreground);
+           gdk_colormap_alloc_color (colormap, &clist_row->foreground,
+                                      FALSE, TRUE);
          if (clist_row->bg_set)
-           gdk_color_alloc (colormap, &clist_row->background);
+           gdk_colormap_alloc_color (colormap, &clist_row->background,
+                                      FALSE, TRUE);
        }
       
       for (j = 0; j < clist->columns; j++)
@@ -4607,7 +4608,6 @@ gtk_clist_unrealize (GtkWidget *widget)
   gint i;
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
   clist = GTK_CLIST (widget);
@@ -4615,7 +4615,7 @@ gtk_clist_unrealize (GtkWidget *widget)
   /* freeze the list */
   clist->freeze_count++;
 
-  if (GTK_WIDGET_MAPPED (widget))
+  if (gtk_widget_get_mapped (widget))
     gtk_clist_unmap (widget);
 
   GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
@@ -4641,10 +4641,10 @@ gtk_clist_unrealize (GtkWidget *widget)
        }
     }
 
-  gdk_cursor_destroy (clist->cursor_drag);
-  gdk_gc_destroy (clist->xor_gc);
-  gdk_gc_destroy (clist->fg_gc);
-  gdk_gc_destroy (clist->bg_gc);
+  gdk_cursor_unref (clist->cursor_drag);
+  g_object_unref (clist->xor_gc);
+  g_object_unref (clist->fg_gc);
+  g_object_unref (clist->bg_gc);
 
   for (i = 0; i < clist->columns; i++)
     {
@@ -4671,8 +4671,7 @@ gtk_clist_unrealize (GtkWidget *widget)
   clist->fg_gc = NULL;
   clist->bg_gc = NULL;
 
-  if (GTK_WIDGET_CLASS (parent_class)->unrealize)
-    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+  GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
 }
 
 static void
@@ -4681,12 +4680,11 @@ gtk_clist_map (GtkWidget *widget)
   gint i;
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
   clist = GTK_CLIST (widget);
 
-  if (!GTK_WIDGET_MAPPED (widget))
+  if (!gtk_widget_get_mapped (widget))
     {
       GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
 
@@ -4694,8 +4692,8 @@ gtk_clist_map (GtkWidget *widget)
       for (i = 0; i < clist->columns; i++)
        {
          if (clist->column[i].button &&
-             GTK_WIDGET_VISIBLE (clist->column[i].button) &&
-             !GTK_WIDGET_MAPPED (clist->column[i].button))
+             gtk_widget_get_visible (clist->column[i].button) &&
+             !gtk_widget_get_mapped (clist->column[i].button))
            gtk_widget_map (clist->column[i].button);
        }
       
@@ -4721,16 +4719,15 @@ gtk_clist_unmap (GtkWidget *widget)
   gint i;
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
   clist = GTK_CLIST (widget);
 
-  if (GTK_WIDGET_MAPPED (widget))
+  if (gtk_widget_get_mapped (widget))
     {
       GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
 
-      if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+      if (clist_has_grab (clist))
        {
          remove_grab (clist);
 
@@ -4764,7 +4761,7 @@ gtk_clist_unmap (GtkWidget *widget)
       /* unmap column buttons */
       for (i = 0; i < clist->columns; i++)
        if (clist->column[i].button &&
-           GTK_WIDGET_MAPPED (clist->column[i].button))
+           gtk_widget_get_mapped (clist->column[i].button))
          gtk_widget_unmap (clist->column[i].button);
 
       /* freeze the list */
@@ -4778,7 +4775,6 @@ gtk_clist_expose (GtkWidget      *widget,
 {
   GtkCList *clist;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
@@ -4800,6 +4796,26 @@ gtk_clist_expose (GtkWidget      *widget,
       /* exposure events on the list */
       if (event->window == clist->clist_window)
        draw_rows (clist, &event->area);
+
+      if (event->window == clist->clist_window &&
+         clist->drag_highlight_row >= 0)
+       GTK_CLIST_GET_CLASS (clist)->draw_drag_highlight
+         (clist, g_list_nth (clist->row_list,
+                             clist->drag_highlight_row)->data,
+          clist->drag_highlight_row, clist->drag_highlight_pos);
+
+      if (event->window == clist->title_window)
+       {
+         gint i;
+         
+         for (i = 0; i < clist->columns; i++)
+           {
+             if (clist->column[i].button)
+               gtk_container_propagate_expose (GTK_CONTAINER (clist),
+                                               clist->column[i].button,
+                                               event);
+           }
+       }
     }
 
   return FALSE;
@@ -4809,15 +4825,9 @@ static void
 gtk_clist_style_set (GtkWidget *widget,
                     GtkStyle  *previous_style)
 {
-  GtkCList *clist;
+  GtkCList *clist = GTK_CLIST (widget);
 
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_CLIST (widget));
-
-  if (GTK_WIDGET_CLASS (parent_class)->style_set)
-    (*GTK_WIDGET_CLASS (parent_class)->style_set) (widget, previous_style);
-
-  clist = GTK_CLIST (widget);
+  GTK_WIDGET_CLASS (parent_class)->style_set (widget, previous_style);
 
   if (GTK_WIDGET_REALIZED (widget))
     {
@@ -4834,7 +4844,7 @@ gtk_clist_style_set (GtkWidget *widget,
     gtk_clist_set_row_height (clist, 0);
 
   /* Column widths */
-  if (!GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
+  if (!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
     {
       gint width;
       gint i;
@@ -4861,7 +4871,6 @@ gtk_clist_button_press (GtkWidget      *widget,
   gint column;
   gint button_actions;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
@@ -4914,7 +4923,7 @@ gtk_clist_button_press (GtkWidget      *widget,
              if (GTK_CLIST_ADD_MODE(clist))
                {
                  GTK_CLIST_UNSET_FLAG (clist, CLIST_ADD_MODE);
-                 if (GTK_WIDGET_HAS_FOCUS(widget))
+                 if (gtk_widget_has_focus (widget))
                    {
                      gtk_clist_draw_focus (widget);
                      gdk_gc_set_line_attributes (clist->xor_gc, 1,
@@ -4931,7 +4940,7 @@ gtk_clist_button_press (GtkWidget      *widget,
                }
              else if (row != clist->focus_row)
                {
-                 if (GTK_WIDGET_HAS_FOCUS(widget))
+                 if (gtk_widget_has_focus (widget))
                    {
                      gtk_clist_draw_focus (widget);
                      clist->focus_row = row;
@@ -4942,7 +4951,7 @@ gtk_clist_button_press (GtkWidget      *widget,
                }
            }
 
-         if (!GTK_WIDGET_HAS_FOCUS(widget))
+         if (!gtk_widget_has_focus (widget))
            gtk_widget_grab_focus (widget);
 
          if (button_actions & GTK_BUTTON_SELECTS)
@@ -4950,7 +4959,6 @@ gtk_clist_button_press (GtkWidget      *widget,
              switch (clist->selection_mode)
                {
                case GTK_SELECTION_SINGLE:
-               case GTK_SELECTION_MULTIPLE:
                  if (event->type != GDK_BUTTON_PRESS)
                    {
                      gtk_signal_emit (GTK_OBJECT (clist),
@@ -4966,7 +4974,7 @@ gtk_clist_button_press (GtkWidget      *widget,
                                   clist_signals[SELECT_ROW],
                                   row, column, event);
                  break;
-               case GTK_SELECTION_EXTENDED:
+               case GTK_SELECTION_MULTIPLE:
                  if (event->type != GDK_BUTTON_PRESS)
                    {
                      if (clist->anchor != -1)
@@ -5025,7 +5033,7 @@ gtk_clist_button_press (GtkWidget      *widget,
                }
            }
        }
-      return FALSE;
+      return TRUE;
     }
 
   /* press on resize windows */
@@ -5050,7 +5058,7 @@ gtk_clist_button_press (GtkWidget      *widget,
        if (drag_data)
          gtk_signal_handler_block_by_data (GTK_OBJECT (clist), drag_data);
 
-       if (!GTK_WIDGET_HAS_FOCUS(widget))
+       if (!gtk_widget_has_focus (widget))
          gtk_widget_grab_focus (widget);
 
        clist->drag_pos = i;
@@ -5060,7 +5068,10 @@ gtk_clist_button_press (GtkWidget      *widget,
        if (GTK_CLIST_ADD_MODE(clist))
          gdk_gc_set_line_attributes (clist->xor_gc, 1, GDK_LINE_SOLID, 0, 0);
        draw_xor_line (clist);
+
+        return TRUE;
       }
+
   return FALSE;
 }
 
@@ -5071,7 +5082,6 @@ gtk_clist_button_release (GtkWidget      *widget,
   GtkCList *clist;
   gint button_actions;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
@@ -5100,21 +5110,24 @@ gtk_clist_button_release (GtkWidget      *widget,
       GTK_CLIST_UNSET_FLAG (clist, CLIST_IN_DRAG);
       gtk_widget_get_pointer (widget, &x, NULL);
       gtk_grab_remove (widget);
-      gdk_pointer_ungrab (event->time);
+      gdk_display_pointer_ungrab (gtk_widget_get_display (widget), event->time);
 
       if (clist->x_drag >= 0)
        draw_xor_line (clist);
 
       if (GTK_CLIST_ADD_MODE(clist))
        {
+         gint8 dashes[] = { 4, 4 };
+
          gdk_gc_set_line_attributes (clist->xor_gc, 1,
                                      GDK_LINE_ON_OFF_DASH, 0, 0);
-         gdk_gc_set_dashes (clist->xor_gc, 0, "\4\4", 2);
+         gdk_gc_set_dashes (clist->xor_gc, 0, dashes, G_N_ELEMENTS (dashes));
        }
 
       width = new_column_width (clist, i, &x);
       gtk_clist_set_column_width (clist, i, width);
-      return FALSE;
+
+      return TRUE;
     }
 
   if (clist->drag_button == event->button)
@@ -5132,7 +5145,7 @@ gtk_clist_button_release (GtkWidget      *widget,
        {
          switch (clist->selection_mode)
            {
-           case GTK_SELECTION_EXTENDED:
+           case GTK_SELECTION_MULTIPLE:
              if (!(event->state & GDK_SHIFT_MASK) ||
                  !GTK_WIDGET_CAN_FOCUS (widget) ||
                  event->x < 0 || event->x >= clist->clist_window_width ||
@@ -5141,7 +5154,6 @@ gtk_clist_button_release (GtkWidget      *widget,
                  (clist, (GdkEvent *) event);
              break;
            case GTK_SELECTION_SINGLE:
-           case GTK_SELECTION_MULTIPLE:
              if (get_selection_info (clist, event->x, event->y,
                                      &row, &column))
                {
@@ -5154,7 +5166,10 @@ gtk_clist_button_release (GtkWidget      *widget,
              break;
            }
        }
+
+      return TRUE;
     }
+  
   return FALSE;
 }
 
@@ -5169,11 +5184,10 @@ gtk_clist_motion (GtkWidget      *widget,
   gint new_width;
   gint button_actions = 0;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
 
   clist = GTK_CLIST (widget);
-  if (!(gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist)))
+  if (!clist_has_grab (clist))
     return FALSE;
 
   if (clist->drag_button > 0)
@@ -5258,8 +5272,8 @@ gtk_clist_motion (GtkWidget      *widget,
       if (clist->htimer)
        return FALSE;
 
-      clist->htimer = gtk_timeout_add
-       (SCROLL_TIME, (GtkFunction) horizontal_timeout, clist);
+      clist->htimer = gdk_threads_add_timeout
+       (SCROLL_TIME, (GSourceFunc) horizontal_timeout, clist);
 
       if (!((x < 0 && clist->hadjustment->value == 0) ||
            (x >= clist->clist_window_width &&
@@ -5290,8 +5304,8 @@ gtk_clist_motion (GtkWidget      *widget,
       if (clist->vtimer)
        return FALSE;
 
-      clist->vtimer = gtk_timeout_add (SCROLL_TIME,
-                                      (GtkFunction) vertical_timeout, clist);
+      clist->vtimer = gdk_threads_add_timeout (SCROLL_TIME,
+                                    (GSourceFunc) vertical_timeout, clist);
 
       if (clist->drag_button &&
          ((y < 0 && clist->focus_row == 0) ||
@@ -5318,7 +5332,7 @@ gtk_clist_motion (GtkWidget      *widget,
          gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                           clist->focus_row, -1, event);
          break;
-       case GTK_SELECTION_EXTENDED:
+       case GTK_SELECTION_MULTIPLE:
          update_extended_selection (clist, clist->focus_row);
          break;
        default:
@@ -5342,7 +5356,6 @@ gtk_clist_size_request (GtkWidget      *widget,
   GtkCList *clist;
   gint i;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (requisition != NULL);
 
@@ -5386,7 +5399,6 @@ gtk_clist_size_allocate (GtkWidget     *widget,
   GtkAllocation clist_allocation;
   gint border_width;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (allocation != NULL);
 
@@ -5470,7 +5482,6 @@ gtk_clist_forall (GtkContainer *container,
   GtkCList *clist;
   guint i;
 
-  g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_CLIST (container));
   g_return_if_fail (callback != NULL);
 
@@ -5597,7 +5608,7 @@ draw_cell_pixmap (GdkWindow    *window,
   if (y + height > clip_rectangle->y + clip_rectangle->height)
     height = clip_rectangle->y + clip_rectangle->height - y;
 
-  gdk_draw_pixmap (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height);
+  gdk_draw_drawable (window, fg_gc, pixmap, xsrc, ysrc, x, y, width, height);
   gdk_gc_set_clip_origin (fg_gc, 0, 0);
   if (mask)
     gdk_gc_set_clip_mask (fg_gc, NULL);
@@ -5670,7 +5681,7 @@ draw_row (GtkCList     *clist,
       if (gdk_rectangle_intersect (area, &cell_rectangle,
                                   &intersect_rectangle))
        gdk_draw_rectangle (clist->clist_window,
-                           widget->style->base_gc[GTK_STATE_ACTIVE],
+                           widget->style->base_gc[GTK_STATE_NORMAL],
                            TRUE,
                            intersect_rectangle.x,
                            intersect_rectangle.y,
@@ -5685,7 +5696,7 @@ draw_row (GtkCList     *clist,
          if (gdk_rectangle_intersect (area, &cell_rectangle,
                                       &intersect_rectangle))
            gdk_draw_rectangle (clist->clist_window,
-                               widget->style->base_gc[GTK_STATE_ACTIVE],
+                               widget->style->base_gc[GTK_STATE_NORMAL],
                                TRUE,
                                intersect_rectangle.x,
                                intersect_rectangle.y,
@@ -5701,7 +5712,7 @@ draw_row (GtkCList     *clist,
     {
       rect = &clip_rectangle;
       gdk_draw_rectangle (clist->clist_window,
-                         widget->style->base_gc[GTK_STATE_ACTIVE],
+                         widget->style->base_gc[GTK_STATE_NORMAL],
                          TRUE,
                          cell_rectangle.x,
                          cell_rectangle.y,
@@ -5714,7 +5725,7 @@ draw_row (GtkCList     *clist,
          cell_rectangle.y += clist->row_height + CELL_SPACING;
 
          gdk_draw_rectangle (clist->clist_window,
-                             widget->style->base_gc[GTK_STATE_ACTIVE],
+                             widget->style->base_gc[GTK_STATE_NORMAL],
                              TRUE,
                              cell_rectangle.x,
                              cell_rectangle.y,
@@ -5782,13 +5793,13 @@ draw_row (GtkCList     *clist,
       switch (clist_row->cell[i].type)
        {
        case GTK_CELL_PIXMAP:
-         gdk_window_get_size (GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap,
-                              &pixmap_width, &height);
+         gdk_drawable_get_size (GTK_CELL_PIXMAP (clist_row->cell[i])->pixmap,
+                                 &pixmap_width, &height);
          width += pixmap_width;
          break;
        case GTK_CELL_PIXTEXT:
-         gdk_window_get_size (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap,
-                              &pixmap_width, &height);
+         gdk_drawable_get_size (GTK_CELL_PIXTEXT (clist_row->cell[i])->pixmap,
+                                 &pixmap_width, &height);
          width += pixmap_width + GTK_CELL_PIXTEXT (clist_row->cell[i])->spacing;
          break;
        default:
@@ -5838,14 +5849,14 @@ draw_row (GtkCList     *clist,
        case GTK_CELL_TEXT:
          if (layout)
            {
-             gint row_center_offset = 1.5 + (clist->row_height - logical_rect.height - 1) / 2;
+             gint row_center_offset = (clist->row_height - logical_rect.height - 1) / 2;
 
              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);
-              g_object_unref (G_OBJECT (layout));
+              g_object_unref (layout);
              gdk_gc_set_clip_rectangle (fg_gc, NULL);
            }
          break;
@@ -5856,7 +5867,7 @@ draw_row (GtkCList     *clist,
 
   /* draw focus rectangle */
   if (clist->focus_row == row &&
-      GTK_WIDGET_CAN_FOCUS (widget) && GTK_WIDGET_HAS_FOCUS(widget))
+      GTK_WIDGET_CAN_FOCUS (widget) && gtk_widget_has_focus (widget))
     {
       if (!area)
        gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
@@ -5885,7 +5896,6 @@ draw_rows (GtkCList     *clist,
   gint first_row;
   gint last_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (clist->row_height == 0 ||
@@ -5925,8 +5935,14 @@ draw_rows (GtkCList     *clist,
     }
 
   if (!area)
-    gdk_window_clear_area (clist->clist_window, 0,
-                          ROW_TOP_YPIXEL (clist, i), 0, 0);
+    {
+      int w, h, y;
+      gdk_drawable_get_size (GDK_DRAWABLE (clist->clist_window), &w, &h);
+      y = ROW_TOP_YPIXEL (clist, i);
+      gdk_window_clear_area (clist->clist_window,
+                            0, y,
+                            w, h - y);
+    }
 }
 
 static void                          
@@ -5949,7 +5965,6 @@ draw_xor_line (GtkCList *clist)
 static void
 clist_refresh (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
   if (CLIST_UNFROZEN (clist))
@@ -5972,7 +5987,6 @@ get_selection_info (GtkCList *clist,
 {
   gint trow, tcol;
 
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
 
   /* bounds checking, return false if the user clicked 
@@ -6001,7 +6015,6 @@ gtk_clist_get_selection_info (GtkCList *clist,
                              gint     *row, 
                              gint     *column)
 {
-  g_return_val_if_fail (clist != NULL, 0);
   g_return_val_if_fail (GTK_IS_CLIST (clist), 0);
   return get_selection_info (clist, x, y, row, column);
 }
@@ -6021,8 +6034,10 @@ adjust_adjustments (GtkCList *clist,
   if (clist->vadjustment)
     {
       clist->vadjustment->page_size = clist->clist_window_height;
-      clist->vadjustment->page_increment = clist->clist_window_height / 2;
       clist->vadjustment->step_increment = clist->row_height;
+      clist->vadjustment->page_increment =
+       MAX (clist->vadjustment->page_size - clist->vadjustment->step_increment,
+            clist->vadjustment->page_size / 2);
       clist->vadjustment->lower = 0;
       clist->vadjustment->upper = LIST_HEIGHT (clist);
 
@@ -6032,7 +6047,7 @@ adjust_adjustments (GtkCList *clist,
          clist->vadjustment->value = MAX (0, (LIST_HEIGHT (clist) -
                                               clist->clist_window_height));
          gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment),
-                                  "value_changed");
+                                  "value-changed");
        }
       gtk_signal_emit_by_name (GTK_OBJECT (clist->vadjustment), "changed");
     }
@@ -6040,8 +6055,10 @@ adjust_adjustments (GtkCList *clist,
   if (clist->hadjustment)
     {
       clist->hadjustment->page_size = clist->clist_window_width;
-      clist->hadjustment->page_increment = clist->clist_window_width / 2;
       clist->hadjustment->step_increment = 10;
+      clist->hadjustment->page_increment =
+       MAX (clist->hadjustment->page_size - clist->hadjustment->step_increment,
+            clist->hadjustment->page_size / 2);
       clist->hadjustment->lower = 0;
       clist->hadjustment->upper = LIST_WIDTH (clist);
 
@@ -6051,7 +6068,7 @@ adjust_adjustments (GtkCList *clist,
          clist->hadjustment->value = MAX (0, (LIST_WIDTH (clist) -
                                               clist->clist_window_width));
          gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment),
-                                  "value_changed");
+                                  "value-changed");
        }
       gtk_signal_emit_by_name (GTK_OBJECT (clist->hadjustment), "changed");
     }
@@ -6101,74 +6118,85 @@ vadjustment_value_changed (GtkAdjustment *adjustment,
                           gpointer       data)
 {
   GtkCList *clist;
-  GdkRectangle area;
-  gint diff, value;
+  gint dy, value;
 
   g_return_if_fail (adjustment != NULL);
-  g_return_if_fail (data != NULL);
   g_return_if_fail (GTK_IS_CLIST (data));
 
   clist = GTK_CLIST (data);
 
-  if (!GTK_WIDGET_DRAWABLE (clist) || adjustment != clist->vadjustment)
+  if (adjustment != clist->vadjustment)
     return;
 
-  value = adjustment->value;
+  value = -adjustment->value;
+  dy = value - clist->voffset;
+  clist->voffset = value;
 
-  if (value > -clist->voffset)
+  if (GTK_WIDGET_DRAWABLE (clist))
     {
-      /* scroll down */
-      diff = value + clist->voffset;
+      gdk_window_scroll (clist->clist_window, 0, dy);
+      gdk_window_process_updates (clist->clist_window, FALSE);
+    }
+  
+  return;
+}
 
-      /* we have to re-draw the whole screen here... */
-      if (diff >= clist->clist_window_height)
-       {
-         clist->voffset = -value;
-         draw_rows (clist, NULL);
-         return;
-       }
+typedef struct
+{
+  GdkWindow *window;
+  gint dx;
+} ScrollData;
 
-      if ((diff != 0) && (diff != clist->clist_window_height))
-       gdk_window_copy_area (clist->clist_window, clist->fg_gc,
-                             0, 0, clist->clist_window, 0, diff,
-                             clist->clist_window_width,
-                             clist->clist_window_height - diff);
+/* The window to which widget->window is relative */
+#define ALLOCATION_WINDOW(widget)              \
+   (!gtk_widget_get_has_window (widget) ?              \
+    (widget)->window :                          \
+     gdk_window_get_parent ((widget)->window))
 
-      area.x = 0;
-      area.y = clist->clist_window_height - diff;
-      area.width = clist->clist_window_width;
-      area.height = diff;
+static void
+adjust_allocation_recurse (GtkWidget *widget,
+                          gpointer   data)
+{
+  ScrollData *scroll_data = data;
+  
+  if (!GTK_WIDGET_REALIZED (widget))
+    {
+      if (gtk_widget_get_visible (widget))
+       {
+         GdkRectangle tmp_rectangle = widget->allocation;
+         tmp_rectangle.x += scroll_data->dx;
+      
+         gtk_widget_size_allocate (widget, &tmp_rectangle);
+       }
     }
   else
     {
-      /* scroll up */
-      diff = -clist->voffset - value;
-
-      /* we have to re-draw the whole screen here... */
-      if (diff >= clist->clist_window_height)
+      if (ALLOCATION_WINDOW (widget) == scroll_data->window)
        {
-         clist->voffset = -value;
-         draw_rows (clist, NULL);
-         return;
-       }
+         widget->allocation.x += scroll_data->dx;
 
-      if ((diff != 0) && (diff != clist->clist_window_height))
-       gdk_window_copy_area (clist->clist_window, clist->fg_gc,
-                             0, diff, clist->clist_window, 0, 0,
-                             clist->clist_window_width,
-                             clist->clist_window_height - diff);
-
-      area.x = 0;
-      area.y = 0;
-      area.width = clist->clist_window_width;
-      area.height = diff;
+         if (GTK_IS_CONTAINER (widget))
+           gtk_container_forall (GTK_CONTAINER (widget),
+                                 adjust_allocation_recurse,
+                                 data);
+       }
     }
+}
 
-  clist->voffset = -value;
-  if ((diff != 0) && (diff != clist->clist_window_height))
-    check_exposures (clist);
+static void
+adjust_allocation (GtkWidget *widget,
+                  gint       dx)
+{
+  ScrollData scroll_data;
 
-  draw_rows (clist, &area);
+  if (GTK_WIDGET_REALIZED (widget))
+    scroll_data.window = ALLOCATION_WINDOW (widget);
+  else
+    scroll_data.window = NULL;
+    
+  scroll_data.dx = dx;
+  
+  adjust_allocation_recurse (widget, &scroll_data);
 }
 
 static void
@@ -6180,183 +6208,87 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
   GdkRectangle area;
   gint i;
   gint y = 0;
-  gint diff = 0;
   gint value;
+  gint dx;
 
   g_return_if_fail (adjustment != NULL);
-  g_return_if_fail (data != NULL);
   g_return_if_fail (GTK_IS_CLIST (data));
 
   clist = GTK_CLIST (data);
   container = GTK_CONTAINER (data);
 
-  if (!GTK_WIDGET_DRAWABLE (clist) || adjustment != clist->hadjustment)
+  if (adjustment != clist->hadjustment)
     return;
 
   value = adjustment->value;
 
-  /* move the column buttons and resize windows */
-  for (i = 0; i < clist->columns; i++)
-    {
-      if (clist->column[i].button)
-       {
-         clist->column[i].button->allocation.x -= value + clist->hoffset;
-         
-         if (clist->column[i].button->window)
-           {
-             gdk_window_move (clist->column[i].button->window,
-                              clist->column[i].button->allocation.x,
-                              clist->column[i].button->allocation.y);
-             
-             if (clist->column[i].window)
-               gdk_window_move (clist->column[i].window,
-                                clist->column[i].button->allocation.x +
-                                clist->column[i].button->allocation.width - 
-                                (DRAG_WIDTH / 2), 0); 
-           }
-       }
-    }
-
-  if (value > -clist->hoffset)
-    {
-      /* scroll right */
-      diff = value + clist->hoffset;
-      
-      clist->hoffset = -value;
-      
-      /* we have to re-draw the whole screen here... */
-      if (diff >= clist->clist_window_width)
-       {
-         draw_rows (clist, NULL);
-         return;
-       }
+  dx = -value - clist->hoffset;
 
-      if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
-         !container->focus_child && GTK_CLIST_ADD_MODE(clist))
-       {
-         y = ROW_TOP_YPIXEL (clist, clist->focus_row);
-             
-         gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, 0, y,
-                             clist->clist_window_width - 1,
-                             clist->row_height - 1);
-       }
-      gdk_window_copy_area (clist->clist_window,
-                           clist->fg_gc,
-                           0, 0,
-                           clist->clist_window,
-                           diff,
-                           0,
-                           clist->clist_window_width - diff,
-                           clist->clist_window_height);
+  if (GTK_WIDGET_REALIZED (clist))
+    gdk_window_scroll (clist->title_window, dx, 0);
 
-      area.x = clist->clist_window_width - diff;
-    }
-  else
-    {
-      /* scroll left */
-      if (!(diff = -clist->hoffset - value))
-       return;
-
-      clist->hoffset = -value;
-      
-      /* we have to re-draw the whole screen here... */
-      if (diff >= clist->clist_window_width)
-       {
-         draw_rows (clist, NULL);
-         return;
-       }
-      
-      if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
-         !container->focus_child && GTK_CLIST_ADD_MODE(clist))
-       {
-         y = ROW_TOP_YPIXEL (clist, clist->focus_row);
-         
-         gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, 0, y,
-                             clist->clist_window_width - 1,
-                             clist->row_height - 1);
-       }
-
-      gdk_window_copy_area (clist->clist_window,
-                           clist->fg_gc,
-                           diff, 0,
-                           clist->clist_window,
-                           0,
-                           0,
-                           clist->clist_window_width - diff,
-                           clist->clist_window_height);
-         
-      area.x = 0;
-    }
-
-  area.y = 0;
-  area.width = diff;
-  area.height = clist->clist_window_height;
+  /* adjust the column button's allocations */
+  for (i = 0; i < clist->columns; i++)
+    if (clist->column[i].button)
+      adjust_allocation (clist->column[i].button, dx);
 
-  check_exposures (clist);
+  clist->hoffset = -value;
 
-  if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
-      !container->focus_child)
+  if (GTK_WIDGET_DRAWABLE (clist))
     {
-      if (GTK_CLIST_ADD_MODE(clist))
-       {
-         gint focus_row;
-         
-         focus_row = clist->focus_row;
-         clist->focus_row = -1;
-         draw_rows (clist, &area);
-         clist->focus_row = focus_row;
-         
-         gdk_draw_rectangle (clist->clist_window, clist->xor_gc,
-                             FALSE, 0, y, clist->clist_window_width - 1,
-                             clist->row_height - 1);
-         return;
-       }
-      else
-       {
-         gint x0;
-         gint x1;
+      if (GTK_WIDGET_CAN_FOCUS(clist) && gtk_widget_has_focus (GTK_WIDGET (clist)) &&
+          !container->focus_child && GTK_CLIST_ADD_MODE(clist))
+        {
+          y = ROW_TOP_YPIXEL (clist, clist->focus_row);
+      
+          gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE, 0, y,
+                              clist->clist_window_width - 1,
+                              clist->row_height - 1);
+        }
+      gdk_window_scroll (clist->clist_window, dx, 0);
+      gdk_window_process_updates (clist->clist_window, FALSE);
+
+      if (GTK_WIDGET_CAN_FOCUS(clist) && gtk_widget_has_focus (GTK_WIDGET (clist)) &&
+          !container->focus_child)
+        {
+          if (GTK_CLIST_ADD_MODE(clist))
+            {
+              gint focus_row;
          
-         if (area.x == 0)
-           {
-             x0 = clist->clist_window_width - 1;
-             x1 = diff;
-           }
-         else
-           {
-             x0 = 0;
-             x1 = area.x - 1;
-           }
+              focus_row = clist->focus_row;
+              clist->focus_row = -1;
+              draw_rows (clist, &area);
+              clist->focus_row = focus_row;
          
-         y = ROW_TOP_YPIXEL (clist, clist->focus_row);
-         gdk_draw_line (clist->clist_window, clist->xor_gc,
-                        x0, y + 1, x0, y + clist->row_height - 2);
-         gdk_draw_line (clist->clist_window, clist->xor_gc,
-                        x1, y + 1, x1, y + clist->row_height - 2);
+              gdk_draw_rectangle (clist->clist_window, clist->xor_gc,
+                                  FALSE, 0, y, clist->clist_window_width - 1,
+                                  clist->row_height - 1);
+              return;
+            }
+          else if (ABS(dx) < clist->clist_window_width - 1)
+            {
+              gint x0;
+              gint x1;
          
-       }
-    }
-  draw_rows (clist, &area);
-}
-
-static void
-check_exposures (GtkCList *clist)
-{
-  GdkEvent *event;
-
-  if (!GTK_WIDGET_REALIZED (clist))
-    return;
-
-  /* Make sure graphics expose events are processed before scrolling
-   * again */
-  while ((event = gdk_event_get_graphics_expose (clist->clist_window)) != NULL)
-    {
-      gtk_widget_send_expose (GTK_WIDGET (clist), event);
-      if (event->expose.count == 0)
-       {
-         gdk_event_free (event);
-         break;
-       }
-      gdk_event_free (event);
+              if (dx > 0)
+                {
+                  x0 = clist->clist_window_width - 1;
+                  x1 = dx;
+                }
+              else
+                {
+                  x0 = 0;
+                  x1 = clist->clist_window_width - 1 + dx;
+                }
+
+              y = ROW_TOP_YPIXEL (clist, clist->focus_row);
+              gdk_draw_line (clist->clist_window, clist->xor_gc,
+                             x0, y + 1, x0, y + clist->row_height - 2);
+              gdk_draw_line (clist->clist_window, clist->xor_gc,
+                             x1, y + 1, x1, y + clist->row_height - 2);
+            }
+        }
     }
 }
 
@@ -6406,8 +6338,7 @@ column_title_new (GtkCList    *clist,
                  gint         column,
                  const gchar *title)
 {
-  if (clist->column[column].title)
-    g_free (clist->column[column].title);
+  g_free (clist->column[column].title);
 
   clist->column[column].title = g_strdup (title);
 }
@@ -6418,8 +6349,7 @@ columns_delete (GtkCList *clist)
   gint i;
 
   for (i = 0; i < clist->columns; i++)
-    if (clist->column[i].title)
-      g_free (clist->column[i].title);
+    g_free (clist->column[i].title);
       
   g_free (clist->column);
 }
@@ -6430,8 +6360,8 @@ row_new (GtkCList *clist)
   int i;
   GtkCListRow *clist_row;
 
-  clist_row = g_chunk_new (GtkCListRow, clist->row_mem_chunk);
-  clist_row->cell = g_chunk_new (GtkCell, clist->cell_mem_chunk);
+  clist_row = g_slice_new (GtkCListRow);
+  clist_row->cell = g_slice_alloc (sizeof (GtkCell) * clist->columns);
 
   for (i = 0; i < clist->columns; i++)
     {
@@ -6466,7 +6396,7 @@ row_delete (GtkCList    *clist,
        {
          if (GTK_WIDGET_REALIZED (clist))
            gtk_style_detach (clist_row->cell[i].style);
-         gtk_style_unref (clist_row->cell[i].style);
+         g_object_unref (clist_row->cell[i].style);
        }
     }
 
@@ -6474,14 +6404,14 @@ row_delete (GtkCList    *clist,
     {
       if (GTK_WIDGET_REALIZED (clist))
         gtk_style_detach (clist_row->style);
-      gtk_style_unref (clist_row->style);
+      g_object_unref (clist_row->style);
     }
 
   if (clist_row->destroy)
     clist_row->destroy (clist_row->data);
 
-  g_mem_chunk_free (clist->cell_mem_chunk, clist_row->cell);
-  g_mem_chunk_free (clist->row_mem_chunk, clist_row);
+  g_slice_free1 (sizeof (GtkCell) * clist->columns, clist_row->cell);
+  g_slice_free (GtkCListRow, clist_row);
 }
 
 /* FOCUS FUNCTIONS
@@ -6500,7 +6430,7 @@ gtk_clist_focus_content_area (GtkCList *clist)
       clist->focus_row = 0;
       
       if ((clist->selection_mode == GTK_SELECTION_BROWSE ||
-          clist->selection_mode == GTK_SELECTION_EXTENDED) &&
+          clist->selection_mode == GTK_SELECTION_MULTIPLE) &&
          !clist->selection)
        gtk_signal_emit (GTK_OBJECT (clist),
                         clist_signals[SELECT_ROW],
@@ -6510,23 +6440,22 @@ gtk_clist_focus_content_area (GtkCList *clist)
 }
 
 static gboolean
-gtk_clist_focus (GtkContainer     *container,
+gtk_clist_focus (GtkWidget        *widget,
                 GtkDirectionType  direction)
 {
-  GtkCList *clist = GTK_CLIST (container);
-  GtkWidget *focus_child = container->focus_child;
+  GtkCList *clist = GTK_CLIST (widget);
+  GtkWidget *focus_child;
   gboolean is_current_focus;
 
-  if (!GTK_WIDGET_IS_SENSITIVE (container))
+  if (!gtk_widget_is_sensitive (widget))
     return FALSE;
 
+  focus_child = GTK_CONTAINER (widget)->focus_child;
+  
   is_current_focus = gtk_widget_is_focus (GTK_WIDGET (clist));
                          
   if (focus_child &&
-      GTK_IS_CONTAINER (focus_child) &&
-      GTK_WIDGET_DRAWABLE (focus_child) &&
-      GTK_WIDGET_IS_SENSITIVE (focus_child) &&
-      gtk_container_focus (GTK_CONTAINER (focus_child), direction))
+      gtk_widget_child_focus (focus_child, direction))
     return TRUE;
       
   switch (direction)
@@ -6598,7 +6527,6 @@ gtk_clist_draw_focus (GtkWidget *widget)
 {
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
   if (!GTK_WIDGET_DRAWABLE (widget) || !GTK_WIDGET_CAN_FOCUS (widget))
@@ -6616,15 +6544,7 @@ static gint
 gtk_clist_focus_in (GtkWidget     *widget,
                    GdkEventFocus *event)
 {
-  GtkCList *clist;
-
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
-  GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
-  clist = GTK_CLIST (widget);
+  GtkCList *clist = GTK_CLIST (widget);
 
   if (clist->selection_mode == GTK_SELECTION_BROWSE &&
       clist->selection == NULL && clist->focus_row > -1)
@@ -6648,18 +6568,10 @@ static gint
 gtk_clist_focus_out (GtkWidget     *widget,
                     GdkEventFocus *event)
 {
-  GtkCList *clist;
-
-  g_return_val_if_fail (widget != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
-  g_return_val_if_fail (event != NULL, FALSE);
-
-  GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
+  GtkCList *clist = GTK_CLIST (widget);
 
   gtk_clist_draw_focus (widget);
   
-  clist = GTK_CLIST (widget);
-
   GTK_CLIST_GET_CLASS (widget)->resync_selection (clist, (GdkEvent *) event);
 
   return FALSE;
@@ -6670,8 +6582,7 @@ focus_column (GtkCList *clist, gint column, gint dir)
 {
   GtkWidget *child = clist->column[column].button;
   
-  if (GTK_IS_CONTAINER (child) &&
-      gtk_container_focus (GTK_CONTAINER (child), dir))
+  if (gtk_widget_child_focus (child, dir))
     {
       return TRUE;
     }
@@ -6693,6 +6604,9 @@ title_focus_in (GtkCList *clist, gint dir)
   gint i;
   gint left, right;
 
+  if (!GTK_CLIST_SHOW_TITLES (clist))
+    return FALSE;
+
   /* Check last focused column */
   if (clist->focus_header_column != -1)
     {
@@ -6779,7 +6693,7 @@ title_focus_move (GtkCList *clist,
   while (!return_val && j >= 0 && j < clist->columns)
     {
       if (clist->column[j].button &&
-         GTK_WIDGET_VISIBLE (clist->column[j].button))
+         gtk_widget_get_visible (clist->column[j].button))
        {
          if (focus_column (clist, j, dir))
            {
@@ -6799,7 +6713,7 @@ title_focus_move (GtkCList *clist,
       while (!return_val && j != i)
        {
          if (clist->column[j].button &&
-             GTK_WIDGET_VISIBLE (clist->column[j].button))
+             gtk_widget_get_visible (clist->column[j].button))
            {
              if (focus_column (clist, j, dir))
                {
@@ -6923,7 +6837,7 @@ scroll_horizontal (GtkCList      *clist,
   g_return_if_fail (clist != 0);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   for (last_column = clist->columns - 1;
@@ -6995,15 +6909,14 @@ scroll_vertical (GtkCList      *clist,
 {
   gint old_focus_row;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   switch (clist->selection_mode)
     {
-    case GTK_SELECTION_EXTENDED:
+    case GTK_SELECTION_MULTIPLE:
       if (clist->anchor >= 0)
        return;
     case GTK_SELECTION_BROWSE:
@@ -7027,7 +6940,7 @@ scroll_vertical (GtkCList      *clist,
        {
        case GTK_VISIBILITY_NONE:
          if (old_focus_row != clist->focus_row &&
-             !(clist->selection_mode == GTK_SELECTION_EXTENDED &&
+             !(clist->selection_mode == GTK_SELECTION_MULTIPLE &&
                GTK_CLIST_ADD_MODE(clist)))
            gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                             clist->focus_row, -1, NULL);
@@ -7071,7 +6984,7 @@ scroll_vertical (GtkCList      *clist,
            }
        default:
          if (old_focus_row != clist->focus_row &&
-             !(clist->selection_mode == GTK_SELECTION_EXTENDED &&
+             !(clist->selection_mode == GTK_SELECTION_MULTIPLE &&
                GTK_CLIST_ADD_MODE(clist)))
            gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                             clist->focus_row, -1, NULL);
@@ -7094,14 +7007,14 @@ static void
 move_horizontal (GtkCList *clist,
                 gint      diff)
 {
-  gfloat value;
+  gdouble value;
 
   if (!clist->hadjustment)
     return;
 
   value = CLAMP (clist->hadjustment->value + diff, 0.0,
                 clist->hadjustment->upper - clist->hadjustment->page_size);
-  gtk_adjustment_set_value(clist->hadjustment, value);
+  gtk_adjustment_set_value (clist->hadjustment, value);
 }
 
 static void
@@ -7109,7 +7022,7 @@ move_vertical (GtkCList *clist,
               gint      row,
               gfloat    align)
 {
-  gfloat value;
+  gdouble value;
 
   if (!clist->vadjustment)
     return;
@@ -7121,47 +7034,34 @@ move_vertical (GtkCList *clist,
   if (value + clist->vadjustment->page_size > clist->vadjustment->upper)
     value = clist->vadjustment->upper - clist->vadjustment->page_size;
 
-  gtk_adjustment_set_value(clist->vadjustment, value);
+  gtk_adjustment_set_value (clist->vadjustment, value);
 }
 
-static gint
-horizontal_timeout (GtkCList *clist)
+static void
+do_fake_motion (GtkWidget *widget)
 {
-  GdkEventMotion event;
+  GdkEvent *event = gdk_event_new (GDK_MOTION_NOTIFY);
 
-  memset (&event, 0, sizeof (event));
+  event->motion.send_event = TRUE;
 
-  GDK_THREADS_ENTER ();
+  gtk_clist_motion (widget, (GdkEventMotion *)event);
+  gdk_event_free (event);
+}
 
+static gint
+horizontal_timeout (GtkCList *clist)
+{
   clist->htimer = 0;
+  do_fake_motion (GTK_WIDGET (clist));
 
-  event.type = GDK_MOTION_NOTIFY;
-  event.send_event = TRUE;
-
-  gtk_clist_motion (GTK_WIDGET (clist), &event);
-
-  GDK_THREADS_LEAVE ();
-  
   return FALSE;
 }
 
 static gint
 vertical_timeout (GtkCList *clist)
 {
-  GdkEventMotion event;
-
-  memset (&event, 0, sizeof (event));
-
-  GDK_THREADS_ENTER ();
-
   clist->vtimer = 0;
-
-  event.type = GDK_MOTION_NOTIFY;
-  event.send_event = TRUE;
-
-  gtk_clist_motion (GTK_WIDGET (clist), &event);
-
-  GDK_THREADS_LEAVE ();
+  do_fake_motion (GTK_WIDGET (clist));
 
   return FALSE;
 }
@@ -7169,22 +7069,26 @@ vertical_timeout (GtkCList *clist)
 static void
 remove_grab (GtkCList *clist)
 {
+  GtkWidget *widget = GTK_WIDGET (clist);
+  
   if (GTK_WIDGET_HAS_GRAB (clist))
     {
-      gtk_grab_remove (GTK_WIDGET (clist));
-      if (gdk_pointer_is_grabbed ())
-       gdk_pointer_ungrab (GDK_CURRENT_TIME);
+      GdkDisplay *display = gtk_widget_get_display (widget);
+      
+      gtk_grab_remove (widget);
+      if (gdk_display_pointer_is_grabbed (display))
+       gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
     }
 
   if (clist->htimer)
     {
-      gtk_timeout_remove (clist->htimer);
+      g_source_remove (clist->htimer);
       clist->htimer = 0;
     }
 
   if (clist->vtimer)
     {
-      gtk_timeout_remove (clist->vtimer);
+      g_source_remove (clist->vtimer);
       clist->vtimer = 0;
     }
 }
@@ -7199,7 +7103,6 @@ remove_grab (GtkCList *clist)
 void
 gtk_clist_sort (GtkCList *clist)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   GTK_CLIST_GET_CLASS (clist)->sort_list (clist);
@@ -7209,7 +7112,6 @@ void
 gtk_clist_set_compare_func (GtkCList            *clist,
                            GtkCListCompareFunc  cmp_func)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   clist->compare = (cmp_func) ? cmp_func : default_compare;
@@ -7219,7 +7121,6 @@ void
 gtk_clist_set_auto_sort (GtkCList *clist,
                         gboolean  auto_sort)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
   if (GTK_CLIST_AUTO_SORT(clist) && !auto_sort)
@@ -7235,7 +7136,6 @@ void
 gtk_clist_set_sort_type (GtkCList    *clist,
                         GtkSortType  sort_type)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
   clist->sort_type = sort_type;
@@ -7245,7 +7145,6 @@ void
 gtk_clist_set_sort_column (GtkCList *clist,
                           gint      column)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (column < 0 || column >= clist->columns)
@@ -7311,18 +7210,17 @@ real_sort_list (GtkCList *clist)
   GList *work;
   gint i;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (clist->rows <= 1)
     return;
 
-  if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
+  if (clist_has_grab (clist))
     return;
 
   gtk_clist_freeze (clist);
 
-  if (clist->anchor != -1 && clist->selection_mode == GTK_SELECTION_EXTENDED)
+  if (clist->anchor != -1 && clist->selection_mode == GTK_SELECTION_MULTIPLE)
     {
       GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
       g_list_free (clist->undo_selection);
@@ -7517,7 +7415,6 @@ gtk_clist_drag_begin (GtkWidget        *widget,
   GtkCList *clist;
   GtkCListCellInfo *info;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (context != NULL);
 
@@ -7528,15 +7425,16 @@ gtk_clist_drag_begin (GtkWidget      *widget,
 
   switch (clist->selection_mode)
     {
-    case GTK_SELECTION_EXTENDED:
+    case GTK_SELECTION_MULTIPLE:
       update_extended_selection (clist, clist->focus_row);
       GTK_CLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
       break;
     case GTK_SELECTION_SINGLE:
-    case GTK_SELECTION_MULTIPLE:
       clist->anchor = -1;
     case GTK_SELECTION_BROWSE:
       break;
+    default:
+      g_assert_not_reached ();
     }
 
   info = g_dataset_get_data (context, "gtk-clist-drag-source");
@@ -7566,7 +7464,6 @@ gtk_clist_drag_end (GtkWidget        *widget,
 {
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (context != NULL);
 
@@ -7584,7 +7481,6 @@ gtk_clist_drag_leave (GtkWidget      *widget,
   GtkCList *clist;
   GtkCListDestInfo *dest_info;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (context != NULL);
 
@@ -7599,17 +7495,18 @@ gtk_clist_drag_leave (GtkWidget      *widget,
          gtk_drag_get_source_widget (context) == widget)
        {
          GList *list;
-         GdkAtom atom = gdk_atom_intern ("gtk-clist-drag-reorder", FALSE);
+         GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder");
 
          list = context->targets;
          while (list)
            {
-             if (atom == GPOINTER_TO_INT (list->data))
+             if (atom == GDK_POINTER_TO_ATOM (list->data))
                {
                  GTK_CLIST_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 = -1;
                  break;
                }
              list = list->next;
@@ -7630,7 +7527,6 @@ gtk_clist_drag_motion (GtkWidget      *widget,
   GtkCListDestInfo new_info;
   GtkCListDestInfo *dest_info;
 
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
 
   clist = GTK_CLIST (widget);
@@ -7654,12 +7550,12 @@ gtk_clist_drag_motion (GtkWidget      *widget,
   if (GTK_CLIST_REORDERABLE (clist))
     {
       GList *list;
-      GdkAtom atom = gdk_atom_intern ("gtk-clist-drag-reorder", FALSE);
+      GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder");
 
       list = context->targets;
       while (list)
        {
-         if (atom == GPOINTER_TO_INT (list->data))
+         if (atom == GDK_POINTER_TO_ATOM (list->data))
            break;
          list = list->next;
        }
@@ -7700,6 +7596,9 @@ gtk_clist_drag_motion (GtkWidget      *widget,
                (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);
            }
@@ -7720,7 +7619,6 @@ gtk_clist_drag_drop (GtkWidget      *widget,
                     gint            y,
                     guint           time)
 {
-  g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_CLIST (widget), FALSE);
   g_return_val_if_fail (context != NULL, FALSE);
 
@@ -7728,12 +7626,12 @@ gtk_clist_drag_drop (GtkWidget      *widget,
       gtk_drag_get_source_widget (context) == widget)
     {
       GList *list;
-      GdkAtom atom = gdk_atom_intern ("gtk-clist-drag-reorder", FALSE);
+      GdkAtom atom = gdk_atom_intern_static_string ("gtk-clist-drag-reorder");
 
       list = context->targets;
       while (list)
        {
-         if (atom == GPOINTER_TO_INT (list->data))
+         if (atom == GDK_POINTER_TO_ATOM (list->data))
            return TRUE;
          list = list->next;
        }
@@ -7752,7 +7650,6 @@ gtk_clist_drag_data_received (GtkWidget        *widget,
 {
   GtkCList *clist;
 
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (context != NULL);
   g_return_if_fail (selection_data != NULL);
@@ -7762,8 +7659,8 @@ gtk_clist_drag_data_received (GtkWidget        *widget,
   if (GTK_CLIST_REORDERABLE (clist) &&
       gtk_drag_get_source_widget (context) == widget &&
       selection_data->target ==
-      gdk_atom_intern ("gtk-clist-drag-reorder", FALSE) &&
-      selection_data->format == GTK_TYPE_POINTER &&
+      gdk_atom_intern_static_string ("gtk-clist-drag-reorder") &&
+      selection_data->format == 8 &&
       selection_data->length == sizeof (GtkCListCellInfo))
     {
       GtkCListCellInfo *source_info;
@@ -7794,13 +7691,11 @@ gtk_clist_drag_data_get (GtkWidget        *widget,
                         guint             info,
                         guint             time)
 {
-  g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
   g_return_if_fail (context != NULL);
   g_return_if_fail (selection_data != NULL);
 
-  if (selection_data->target ==
-      gdk_atom_intern ("gtk-clist-drag-reorder", FALSE))
+  if (selection_data->target == gdk_atom_intern_static_string ("gtk-clist-drag-reorder"))
     {
       GtkCListCellInfo *info;
 
@@ -7814,12 +7709,9 @@ gtk_clist_drag_data_get (GtkWidget        *widget,
          ret_info.column = info->column;
 
          gtk_selection_data_set (selection_data, selection_data->target,
-                                 GTK_TYPE_POINTER, (guchar *) &ret_info,
+                                 8, (guchar *) &ret_info,
                                  sizeof (GtkCListCellInfo));
        }
-      else
-       gtk_selection_data_set (selection_data, selection_data->target,
-                               GTK_TYPE_POINTER, NULL, 0);
     }
 }
 
@@ -7856,7 +7748,6 @@ gtk_clist_set_reorderable (GtkCList *clist,
 {
   GtkWidget *widget;
 
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if ((GTK_CLIST_REORDERABLE(clist) != 0) == reorderable)
@@ -7882,7 +7773,6 @@ void
 gtk_clist_set_use_drag_icons (GtkCList *clist,
                              gboolean  use_icons)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
 
   if (use_icons != 0)
@@ -7896,12 +7786,12 @@ gtk_clist_set_button_actions (GtkCList *clist,
                              guint     button,
                              guint8    button_actions)
 {
-  g_return_if_fail (clist != NULL);
   g_return_if_fail (GTK_IS_CLIST (clist));
   
   if (button < MAX_BUTTON)
     {
-      if (gdk_pointer_is_grabbed () || GTK_WIDGET_HAS_GRAB (clist))
+      if (gdk_display_pointer_is_grabbed (gtk_widget_get_display (GTK_WIDGET (clist))) || 
+         GTK_WIDGET_HAS_GRAB (clist))
        {
          remove_grab (clist);
          clist->drag_button = 0;
@@ -7912,3 +7802,5 @@ gtk_clist_set_button_actions (GtkCList *clist,
       clist->button_actions[button] = button_actions;
     }
 }
+
+#include "gtkaliasdef.c"