]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkclist.c
Check for lstat.
[~andy/gtk] / gtk / gtkclist.c
index fe7515bffe043cc0ee6f6d32980773c3e09c5e2d..7fb73b7fad7f20cf708bbec5ab3f4823bf5c66bd 100644 (file)
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 #include <stdlib.h>
 #include <string.h>
 #include "config.h"
@@ -159,6 +167,7 @@ enum {
   ARG_SHADOW_TYPE,
   ARG_SELECTION_MODE,
   ARG_ROW_HEIGHT,
+  ARG_TITLES_ACTIVE,
   ARG_REORDERABLE,
   ARG_USE_DRAG_ICONS
 };
@@ -238,7 +247,7 @@ static void gtk_clist_drag_data_received (GtkWidget        *widget,
                                          gint              y,
                                          GtkSelectionData *selection_data,
                                          guint             info,
-                                         guint32           time);
+                                         guint             time);
 
 /* GtkContainer Methods */
 static void gtk_clist_set_focus_child (GtkContainer  *container,
@@ -473,6 +482,7 @@ gtk_clist_class_init (GtkCListClass *klass)
   GtkObjectClass *object_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
+  GtkBindingSet *binding_set;
 
   object_class = (GtkObjectClass *) klass;
   widget_class = (GtkWidgetClass *) klass;
@@ -500,6 +510,10 @@ gtk_clist_class_init (GtkCListClass *klass)
                           GTK_TYPE_BOOL,
                           GTK_ARG_READWRITE,
                           ARG_REORDERABLE);
+  gtk_object_add_arg_type ("GtkCList::titles_active",
+                          GTK_TYPE_BOOL,
+                          GTK_ARG_READWRITE,
+                          ARG_TITLES_ACTIVE);
   gtk_object_add_arg_type ("GtkCList::use_drag_icons",
                           GTK_TYPE_BOOL,
                           GTK_ARG_READWRITE,
@@ -700,203 +714,102 @@ gtk_clist_class_init (GtkCListClass *klass)
   klass->set_cell_contents = set_cell_contents;
   klass->cell_size_request = cell_size_request;
 
-  {
-    GtkBindingSet *binding_set;
-
-    binding_set = gtk_binding_set_by_class (klass);
-    gtk_binding_entry_add_signal (binding_set, GDK_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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
-                                  GTK_TYPE_FLOAT, 0.0);
-    gtk_binding_entry_add_signal (binding_set, GDK_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);
-    gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
-                                 "abort_column_resize", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_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);
-    gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
-                                 "unselect_all", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
-                                 GDK_RELEASE_MASK | GDK_SHIFT_MASK,
-                                 "end_selection", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
-                                 GDK_RELEASE_MASK | GDK_SHIFT_MASK,
-                                 "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);
-    gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
-                                 GDK_RELEASE_MASK | GDK_SHIFT_MASK |
-                                 GDK_CONTROL_MASK,
-                                 "end_selection", 0);
-  }
-
-  /*
-  {
-    GtkBindingSet *binding_set;
-
-    binding_set = gtk_binding_set_by_class (klass);
-    gtk_binding_entry_add_signal (binding_set, GDK_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,
-                                 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,
-                                 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,
-                                 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,
-                                 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,
-                                 GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
-                                  GTK_TYPE_FLOAT, 0);
-
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Up, 0,
-                                 "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_Down, 0,
-                                 "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_Page_Up, 0,
-                                 "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_Down, 0,
-                                 "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_Home, 0,
-                                 "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_End, 0,
-                                 "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,
-                                 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,
-                                 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,
-                                 GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
-                                  GTK_TYPE_FLOAT, 0.0);
-    gtk_binding_entry_add_signal (binding_set, GDK_End, 0,
-                                 "sroll_horizontal", 2,
-                                 GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
-                                  GTK_TYPE_FLOAT, 1.0);
-
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, 0,
-                                 "undo_selection", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
-                                 "abort_column_resize", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_space, 0,
-                                 "toggle_focus_row", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Multiply, 0,
-                                 "toggle_add_mode", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Add, 0,
-                                 "select_all", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Subtract, 0,
-                                 "unselect_all", 0);
-    gtk_binding_entry_add_signal (binding_set, GDK_KP_Enter, 0,
-                                 "end_selection", 0);
-  }
-  */
+  binding_set = gtk_binding_set_by_class (klass);
+  gtk_binding_entry_add_signal (binding_set, GDK_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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               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,
+                               GTK_TYPE_ENUM, GTK_SCROLL_JUMP,
+                               GTK_TYPE_FLOAT, 0.0);
+  gtk_binding_entry_add_signal (binding_set, GDK_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);
+  gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0,
+                               "abort_column_resize", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_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);
+  gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
+                               "unselect_all", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_Shift_L,
+                               GDK_RELEASE_MASK | GDK_SHIFT_MASK,
+                               "end_selection", 0);
+  gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
+                               GDK_RELEASE_MASK | GDK_SHIFT_MASK,
+                               "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);
+  gtk_binding_entry_add_signal (binding_set, GDK_Shift_R,
+                               GDK_RELEASE_MASK | GDK_SHIFT_MASK |
+                               GDK_CONTROL_MASK,
+                               "end_selection", 0);
 }
 
 static void
@@ -925,6 +838,12 @@ gtk_clist_set_arg (GtkObject      *object,
     case ARG_REORDERABLE:
       gtk_clist_set_reorderable (clist, GTK_VALUE_BOOL (*arg));
       break;
+    case ARG_TITLES_ACTIVE:
+      if (GTK_VALUE_BOOL (*arg))
+       gtk_clist_column_titles_active (clist);
+      else
+       gtk_clist_column_titles_passive (clist);
+      break;
     case ARG_USE_DRAG_ICONS:
       gtk_clist_set_use_drag_icons (clist, GTK_VALUE_BOOL (*arg));
       break;
@@ -944,6 +863,8 @@ gtk_clist_get_arg (GtkObject      *object,
 
   switch (arg_id)
     {
+      guint i;
+
     case ARG_N_COLUMNS:
       GTK_VALUE_UINT (*arg) = clist->columns;
       break;
@@ -959,6 +880,16 @@ gtk_clist_get_arg (GtkObject      *object,
     case ARG_REORDERABLE:
       GTK_VALUE_BOOL (*arg) = GTK_CLIST_REORDERABLE (clist);
       break;
+    case ARG_TITLES_ACTIVE:
+      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_VALUE_BOOL (*arg) = FALSE;
+           break;
+         }
+      break;
     case ARG_USE_DRAG_ICONS:
       GTK_VALUE_BOOL (*arg) = GTK_CLIST_USE_DRAG_ICONS (clist);
       break;
@@ -2069,10 +2000,7 @@ list_requisition_width (GtkCList *clist)
   gint width = CELL_SPACING;
   gint i;
 
-  for (i = clist->columns - 1; i >= 0 && !clist->column[i].visible; i--)
-    ;
-
-  for (; i >= 0; i--)
+  for (i = clist->columns - 1; i >= 0; i--)
     {
       if (!clist->column[i].visible)
        continue;
@@ -2098,15 +2026,19 @@ new_column_width (GtkCList *clist,
   gint width;
   gint cx;
   gint dx;
+  gint last_column;
 
   /* first translate the x position from widget->window
    * to clist->clist_window */
   cx = *x - xthickness;
 
+  for (last_column = clist->columns - 1;
+       last_column >= 0 && !clist->column[last_column].visible; last_column--);
+
   /* calculate new column width making sure it doesn't end up
    * less than the minimum width */
   dx = (COLUMN_LEFT_XPIXEL (clist, column) + COLUMN_INSET +
-       (column < clist->columns - 1) * CELL_SPACING);
+       (column < last_column) * CELL_SPACING);
   width = cx - dx;
 
   if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width))
@@ -2782,8 +2714,8 @@ real_insert_row (GtkCList *clist,
                                              clist_row))->next;
       else
        clist->row_list = g_list_insert (clist->row_list, clist_row, row);
+
     }
-  
   clist->rows++;
 
   if (row < ROW_FROM_YPIXEL (clist, 0))
@@ -2792,6 +2724,13 @@ real_insert_row (GtkCList *clist,
   /* syncronize the selection list */
   sync_selection (clist, row, SYNC_INSERT);
 
+  if (clist->rows == 1)
+    {
+      clist->focus_row = 0;
+      if (clist->selection_mode == GTK_SELECTION_BROWSE)
+       gtk_clist_select_row (clist, 0, -1);
+    }
+
   /* redraw the list if it isn't frozen */
   if (CLIST_UNFROZEN (clist))
     {
@@ -2853,8 +2792,8 @@ real_remove_row (GtkCList *clist,
 
   sync_selection (clist, row, SYNC_REMOVE);
 
-  if ((clist->selection_mode == GTK_SELECTION_BROWSE ||
-       clist->selection_mode == GTK_SELECTION_EXTENDED) && !clist->selection)
+  if (clist->selection_mode == GTK_SELECTION_BROWSE && !clist->selection &&
+      clist->focus_row >= 0)
     gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                     clist->focus_row, -1, NULL);
 
@@ -3989,29 +3928,65 @@ resync_selection (GtkCList *clist,
        }
     }    
 
-  for (list = g_list_nth (clist->row_list, i); i <= e; i++, list = list->next)
-    if (GTK_CLIST_ROW (list)->selectable)
-      {
-       if (g_list_find (clist->selection, GINT_TO_POINTER(i)))
+  if (clist->anchor < clist->drag_pos)
+    {
+      for (list = g_list_nth (clist->row_list, i); i <= e;
+          i++, list = list->next)
+       if (GTK_CLIST_ROW (list)->selectable)
          {
-           if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+           if (g_list_find (clist->selection, GINT_TO_POINTER(i)))
              {
-               GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
-               gtk_signal_emit (GTK_OBJECT (clist),
-                                clist_signals[UNSELECT_ROW], i, -1, event);
-               clist->undo_selection = g_list_prepend (clist->undo_selection,
-                                                       GINT_TO_POINTER (i));
+               if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+                 {
+                   GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
+                   gtk_signal_emit (GTK_OBJECT (clist),
+                                    clist_signals[UNSELECT_ROW],
+                                    i, -1, event);
+                   clist->undo_selection =
+                     g_list_prepend (clist->undo_selection,
+                                     GINT_TO_POINTER (i));
+                 }
+             }
+           else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+             {
+               GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
+               clist->undo_unselection =
+                 g_list_prepend (clist->undo_unselection,
+                                 GINT_TO_POINTER (i));
              }
          }
-       else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+    }
+  else
+    {
+      for (list = g_list_nth (clist->row_list, e); i <= e;
+          e--, list = list->prev)
+       if (GTK_CLIST_ROW (list)->selectable)
          {
-           GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
-           clist->undo_unselection = g_list_prepend (clist->undo_unselection,
-                                                     GINT_TO_POINTER (i));
+           if (g_list_find (clist->selection, GINT_TO_POINTER(e)))
+             {
+               if (GTK_CLIST_ROW (list)->state == GTK_STATE_NORMAL)
+                 {
+                   GTK_CLIST_ROW (list)->state = GTK_STATE_SELECTED;
+                   gtk_signal_emit (GTK_OBJECT (clist),
+                                    clist_signals[UNSELECT_ROW],
+                                    e, -1, event);
+                   clist->undo_selection =
+                     g_list_prepend (clist->undo_selection,
+                                     GINT_TO_POINTER (e));
+                 }
+             }
+           else if (GTK_CLIST_ROW (list)->state == GTK_STATE_SELECTED)
+             {
+               GTK_CLIST_ROW (list)->state = GTK_STATE_NORMAL;
+               clist->undo_unselection =
+                 g_list_prepend (clist->undo_unselection,
+                                 GINT_TO_POINTER (e));
+             }
          }
-      }
+    }
 
-  for (list = clist->undo_unselection; list; list = list->next)
+  for (list = g_list_reverse (clist->undo_unselection); list;
+       list = list->next)
     gtk_signal_emit (GTK_OBJECT (clist), clist_signals[SELECT_ROW],
                     GPOINTER_TO_INT (list->data), -1, event);
 
@@ -5349,11 +5324,13 @@ gtk_clist_size_request (GtkWidget      *widget,
     for (i = 0; i < clist->columns; i++)
       if (clist->column[i].button)
        {
+         GtkRequisition child_requisition;
+         
          gtk_widget_size_request (clist->column[i].button,
-                                  &clist->column[i].button->requisition);
+                                  &child_requisition);
          clist->column_title_area.height =
            MAX (clist->column_title_area.height,
-                clist->column[i].button->requisition.height);
+                child_requisition.height);
        }
 
   requisition->width += (widget->style->klass->xthickness +
@@ -5589,6 +5566,8 @@ draw_cell_pixmap (GdkWindow    *window,
 
   gdk_draw_pixmap (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);
 
   return x + MAX (width, 0);
 }
@@ -5605,6 +5584,7 @@ draw_row (GtkCList     *clist,
   GdkRectangle cell_rectangle;
   GdkRectangle clip_rectangle;
   GdkRectangle intersect_rectangle;
+  gint last_column;
   gint state;
   gint i;
 
@@ -5710,6 +5690,10 @@ draw_row (GtkCList     *clist,
        }         
     }
   
+  for (last_column = clist->columns - 1;
+       last_column >= 0 && !clist->column[last_column].visible; last_column--)
+    ;
+
   /* iterate and draw all the columns (row cells) and draw their contents */
   for (i = 0; i < clist->columns; i++)
     {
@@ -5734,7 +5718,7 @@ draw_row (GtkCList     *clist,
       /* calculate clipping region clipping region */
       clip_rectangle.x -= COLUMN_INSET + CELL_SPACING;
       clip_rectangle.width += (2 * COLUMN_INSET + CELL_SPACING +
-                              (i + 1 == clist->columns) * CELL_SPACING);
+                              (i == last_column) * CELL_SPACING);
       
       if (area && !gdk_rectangle_intersect (area, &clip_rectangle,
                                            &intersect_rectangle))
@@ -5745,7 +5729,7 @@ draw_row (GtkCList     *clist,
 
       clip_rectangle.x += COLUMN_INSET + CELL_SPACING;
       clip_rectangle.width -= (2 * COLUMN_INSET + CELL_SPACING +
-                              (i + 1 == clist->columns) * CELL_SPACING);
+                              (i == last_column) * CELL_SPACING);
 
       /* calculate real width for column justification */
       pixmap_width = 0;
@@ -5837,7 +5821,8 @@ draw_row (GtkCList     *clist,
     }
 
   /* draw focus rectangle */
-  if (clist->focus_row == row && GTK_WIDGET_HAS_FOCUS(widget))
+  if (clist->focus_row == row &&
+      GTK_WIDGET_CAN_FOCUS (widget) && GTK_WIDGET_HAS_FOCUS(widget))
     {
       if (!area)
        gdk_draw_rectangle (clist->clist_window, clist->xor_gc, FALSE,
@@ -6038,14 +6023,15 @@ adjust_adjustments (GtkCList *clist,
   if (!block_resize && (!clist->vadjustment || !clist->hadjustment))
     {
       GtkWidget *widget;
+      GtkRequisition requisition;
 
       widget = GTK_WIDGET (clist);
-      gtk_widget_size_request (widget, &widget->requisition);
+      gtk_widget_size_request (widget, &requisition);
 
       if ((!clist->hadjustment &&
-          widget->requisition.width != widget->allocation.width) ||
+          requisition.width != widget->allocation.width) ||
          (!clist->vadjustment &&
-          widget->requisition.height != widget->allocation.height))
+          requisition.height != widget->allocation.height))
        gtk_widget_queue_resize (widget);
     }
 }
@@ -6207,8 +6193,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
          return;
        }
 
-      if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist) &&
-         GTK_CLIST_ADD_MODE(clist))
+      if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+         !GTK_CLIST_CHILD_HAS_FOCUS(clist) && GTK_CLIST_ADD_MODE(clist))
        {
          y = ROW_TOP_YPIXEL (clist, clist->focus_row);
              
@@ -6242,8 +6228,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
          return;
        }
       
-      if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist) &&
-         GTK_CLIST_ADD_MODE(clist))
+      if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+         !GTK_CLIST_CHILD_HAS_FOCUS(clist) && GTK_CLIST_ADD_MODE(clist))
        {
          y = ROW_TOP_YPIXEL (clist, clist->focus_row);
          
@@ -6270,7 +6256,8 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
 
   check_exposures (clist);
 
-  if (GTK_WIDGET_HAS_FOCUS(clist) && !GTK_CLIST_CHILD_HAS_FOCUS(clist))
+  if (GTK_WIDGET_CAN_FOCUS(clist) && GTK_WIDGET_HAS_FOCUS(clist) &&
+      !GTK_CLIST_CHILD_HAS_FOCUS(clist))
     {
       if (GTK_CLIST_ADD_MODE(clist))
        {
@@ -6569,7 +6556,7 @@ gtk_clist_draw_focus (GtkWidget *widget)
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_CLIST (widget));
 
-  if (!GTK_WIDGET_DRAWABLE (widget))
+  if (!GTK_WIDGET_DRAWABLE (widget) || !GTK_WIDGET_CAN_FOCUS (widget))
     return;
 
   clist = GTK_CLIST (widget);
@@ -6658,6 +6645,7 @@ title_focus (GtkCList *clist,
 {
   GtkWidget *focus_child;
   gboolean return_val = FALSE;
+  gint last_column;
   gint d = 1;
   gint i = 0;
   gint j;
@@ -6666,6 +6654,10 @@ title_focus (GtkCList *clist,
     return FALSE;
 
   focus_child = GTK_CONTAINER (clist)->focus_child;
+
+  for (last_column = clist->columns - 1;
+       last_column >= 0 && !clist->column[last_column].visible; last_column--)
+    ;
   
   switch (dir)
     {
@@ -6676,7 +6668,7 @@ title_focus (GtkCList *clist,
          if (dir == GTK_DIR_UP)
            i = COLUMN_FROM_XPIXEL (clist, 0);
          else
-           i = clist->columns - 1;
+           i = last_column;
          focus_child = clist->column[i].button;
          dir = GTK_DIR_TAB_FORWARD;
        }
@@ -6687,7 +6679,7 @@ title_focus (GtkCList *clist,
       d = -1;
       if (!focus_child)
        {
-         i = clist->columns - 1;
+         i = last_column;
          focus_child = clist->column[i].button;
        }
       break;
@@ -6755,7 +6747,7 @@ title_focus (GtkCList *clist,
       else if (COLUMN_LEFT_XPIXEL(clist, j) + clist->column[j].area.width >
               clist->clist_window_width)
        {
-         if (j == clist->columns-1)
+         if (j == last_column)
            gtk_clist_moveto (clist, -1, j, 0, 0);
          else
            gtk_clist_moveto (clist, -1, j, 0, 1);
@@ -6841,6 +6833,7 @@ scroll_horizontal (GtkCList      *clist,
                   gfloat         position)
 {
   gint column = 0;
+  gint last_column;
 
   g_return_if_fail (clist != 0);
   g_return_if_fail (GTK_IS_CLIST (clist));
@@ -6848,6 +6841,10 @@ scroll_horizontal (GtkCList      *clist,
   if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (clist))
     return;
 
+  for (last_column = clist->columns - 1;
+       last_column >= 0 && !clist->column[last_column].visible; last_column--)
+    ;
+
   switch (scroll_type)
     {
     case GTK_SCROLL_STEP_BACKWARD:
@@ -6857,13 +6854,13 @@ scroll_horizontal (GtkCList      *clist,
        column--;
       break;
     case GTK_SCROLL_STEP_FORWARD:
-      column =  COLUMN_FROM_XPIXEL (clist, clist->clist_window_width);
+      column = COLUMN_FROM_XPIXEL (clist, clist->clist_window_width);
       if (column < 0)
        return;
       if (COLUMN_LEFT_XPIXEL (clist, column) +
          clist->column[column].area.width +
          CELL_SPACING + COLUMN_INSET - 1 <= clist->clist_window_width &&
-         column < clist->columns - 1)
+         column < last_column)
        column++;
       break;
     case GTK_SCROLL_PAGE_BACKWARD:
@@ -6871,7 +6868,22 @@ scroll_horizontal (GtkCList      *clist,
       return;
     case GTK_SCROLL_JUMP:
       if (position >= 0 && position <= 1)
-       column = position * (clist->columns - 1);
+       {
+         gint vis_columns = 0;
+         gint i;
+
+         for (i = 0; i <= last_column; i++)
+           if (clist->column[i].visible)
+             vis_columns++;
+
+         column = position * vis_columns;
+
+         for (i = 0; i <= last_column && column > 0; i++)
+           if (clist->column[i].visible)
+             column--;
+
+         column = i;
+       }
       else
        return;
       break;
@@ -6884,7 +6896,7 @@ scroll_horizontal (GtkCList      *clist,
   else if (COLUMN_LEFT_XPIXEL (clist, column) + CELL_SPACING + COLUMN_INSET - 1
           + clist->column[column].area.width > clist->clist_window_width)
     {
-      if (column == clist->columns - 1)
+      if (column == last_column)
        gtk_clist_moveto (clist, -1, column, 0, 0);
       else
        gtk_clist_moveto (clist, -1, column, 0, 1);
@@ -7635,7 +7647,7 @@ gtk_clist_drag_data_received (GtkWidget        *widget,
                              gint              y,
                              GtkSelectionData *selection_data,
                              guint             info,
-                             guint32           time)
+                             guint             time)
 {
   GtkCList *clist;