remove all gtk3 conditionals
[claws.git] / src / gtk / gtkcmclist.c
index 69df1dcc8435888423f555a959486f416881d94c..d3bb3366bcd8416e548dd8e5ed5b34fa9ae86039 100644 (file)
@@ -205,7 +205,7 @@ static void gtk_cmclist_unrealize       (GtkWidget        *widget);
 static void gtk_cmclist_map             (GtkWidget        *widget);
 static void gtk_cmclist_unmap           (GtkWidget        *widget);
 static gint gtk_cmclist_expose          (GtkWidget        *widget,
-                                      GdkEventExpose   *event);
+                                         GdkEventExpose   *event);
 static gint gtk_cmclist_button_press    (GtkWidget        *widget,
                                       GdkEventButton   *event);
 static gint gtk_cmclist_button_release  (GtkWidget        *widget,
@@ -364,12 +364,8 @@ static void column_button_clicked     (GtkWidget      *widget,
 /* Adjustments */
 static void adjust_adjustments        (GtkCMCList       *clist,
                                       gboolean        block_resize);
-static void vadjustment_changed       (GtkAdjustment  *adjustment,
-                                      gpointer        data);
 static void vadjustment_value_changed (GtkAdjustment  *adjustment,
                                       gpointer        data);
-static void hadjustment_changed       (GtkAdjustment  *adjustment,
-                                      gpointer        data);
 static void hadjustment_value_changed (GtkAdjustment  *adjustment,
                                       gpointer        data);
 
@@ -454,11 +450,12 @@ static void drag_dest_cell            (GtkCMCList         *clist,
 
 
 
-static GtkContainerClass *parent_class = NULL;
 static guint clist_signals[LAST_SIGNAL] = {0};
 
 static const GtkTargetEntry clist_target_table = { "gtk-clist-drag-reorder", 0, 0};
 
+static gpointer gtk_cmclist_parent_class = NULL;
+
 GType
 gtk_cmclist_get_type (void)
 {
@@ -480,6 +477,8 @@ gtk_cmclist_get_type (void)
                        sizeof (GtkCMCList),
                        0,      /* n_preallocs */
                        (GInstanceInitFunc) gtk_cmclist_init,
+
+                       (const GTypeValueTable *) NULL  /* value table */
        };
        clist_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkCMCList", &clist_info, (GTypeFlags)0);
     }
@@ -502,7 +501,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass)
   widget_class = (GtkWidgetClass *) klass;
   container_class = (GtkContainerClass *) klass;
 
-  parent_class = g_type_class_peek (GTK_TYPE_CONTAINER);
+  gtk_cmclist_parent_class = g_type_class_peek (GTK_TYPE_CONTAINER);
 
   object_class->finalize = gtk_cmclist_finalize;
   gtk_object_class->destroy = gtk_cmclist_destroy;
@@ -926,9 +925,9 @@ gtk_cmclist_class_init (GtkCMCListClass *klass)
                                "toggle_add_mode", 0);
   gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
                                "toggle_add_mode", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_slash, GDK_CONTROL_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
                                "select_all", 0);
-  gtk_binding_entry_add_signal (binding_set, GDK_KP_Divide, GDK_CONTROL_MASK,
+  gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Divide, GDK_CONTROL_MASK,
                                "select_all", 0);
   gtk_binding_entry_add_signal (binding_set, '\\', GDK_CONTROL_MASK,
                                "unselect_all", 0);
@@ -1046,17 +1045,11 @@ gtk_cmclist_init (GtkCMCList *clist)
 {
   clist->flags = 0;
 
-  gtkut_widget_set_has_window (GTK_WIDGET(clist), TRUE);
-  gtkut_widget_set_can_focus (GTK_WIDGET(clist), TRUE);
+  gtk_widget_set_has_window (GTK_WIDGET(clist), TRUE);
+  gtk_widget_set_can_focus (GTK_WIDGET(clist), TRUE);
   GTK_CMCLIST_SET_FLAG (clist, CMCLIST_DRAW_DRAG_LINE);
   GTK_CMCLIST_SET_FLAG (clist, CMCLIST_USE_DRAG_ICONS);
 
-
-#if !GLIB_CHECK_VERSION(2,10,0)
-  clist->row_mem_chunk = NULL;
-  clist->cell_mem_chunk = NULL;
-#endif
-
   clist->freeze_count = 0;
 
   clist->rows = 0;
@@ -1124,27 +1117,11 @@ gtk_cmclist_constructor (GType                  type,
                       guint                  n_construct_properties,
                       GObjectConstructParam *construct_properties)
 {
-  GObject *object = G_OBJECT_CLASS (parent_class)->constructor (type,
+  GObject *object = G_OBJECT_CLASS (gtk_cmclist_parent_class)->constructor (type,
                                                                n_construct_properties,
                                                                construct_properties);
   GtkCMCList *clist = GTK_CMCLIST (object);
   
-#if !GLIB_CHECK_VERSION(2,10,0)
-  if (!clist->row_mem_chunk)
-    clist->row_mem_chunk = g_mem_chunk_new ("clist row mem chunk",
-                                           sizeof (GtkCMCListRow),
-                                           sizeof (GtkCMCListRow) *
-                                           CMCLIST_OPTIMUM_SIZE, 
-                                           G_ALLOC_AND_FREE);
-  
-  if (!clist->cell_mem_chunk)
-    clist->cell_mem_chunk = g_mem_chunk_new ("clist cell mem chunk",
-                                            sizeof (GtkCMCell) * clist->columns,
-                                            sizeof (GtkCMCell) * clist->columns *
-                                            CMCLIST_OPTIMUM_SIZE, 
-                                            G_ALLOC_AND_FREE);
-#endif
-
   /* allocate memory for columns */
   clist->column = columns_new (clist);
   
@@ -1225,15 +1202,7 @@ gtk_cmclist_set_hadjustment (GtkCMCList      *clist,
 
   if (clist->hadjustment)
     {
-#if GLIB_CHECK_VERSION(2,10,0)
       g_object_ref_sink (clist->hadjustment);
-#else
-      gtk_object_ref (G_OBJECT (clist->hadjustment));
-      gtk_object_sink (G_OBJECT (clist->hadjustment));
-#endif
-      g_signal_connect (G_OBJECT (clist->hadjustment), "changed",
-                         G_CALLBACK( hadjustment_changed),
-                         (gpointer) clist);
       g_signal_connect (G_OBJECT (clist->hadjustment), "value_changed",
                          G_CALLBACK( hadjustment_value_changed),
                          (gpointer) clist);
@@ -1277,16 +1246,8 @@ gtk_cmclist_set_vadjustment (GtkCMCList      *clist,
 
   if (clist->vadjustment)
     {
-#if GLIB_CHECK_VERSION(2,10,0)
       g_object_ref_sink (clist->vadjustment);
-#else
-      gtk_object_ref (G_OBJECT (clist->vadjustment));
-      gtk_object_sink (G_OBJECT (clist->vadjustment));
-#endif
 
-      g_signal_connect (G_OBJECT (clist->vadjustment), "changed",
-                         G_CALLBACK(vadjustment_changed),
-                         (gpointer) clist);
       g_signal_connect (G_OBJECT (clist->vadjustment), "value_changed",
                          G_CALLBACK(vadjustment_value_changed),
                          (gpointer) clist);
@@ -1445,7 +1406,7 @@ gtk_cmclist_column_title_active (GtkCMCList *clist,
   g_signal_handlers_disconnect_matched(G_OBJECT (clist->column[column].button), G_SIGNAL_MATCH_FUNC,
                    0, 0, 0, column_title_passive_func, 0);
 
-  gtkut_widget_set_can_focus (clist->column[column].button, TRUE);
+  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);
 }
@@ -1481,7 +1442,7 @@ gtk_cmclist_column_title_passive (GtkCMCList *clist,
   g_signal_connect (G_OBJECT (clist->column[column].button), "event",
                      G_CALLBACK(column_title_passive_func), NULL);
 
-  gtkut_widget_set_can_focus (clist->column[column].button, FALSE);
+  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);
 }
@@ -3265,6 +3226,42 @@ gtk_cmclist_row_is_visible (GtkCMCList *clist,
   return GTK_VISIBILITY_FULL;
 }
 
+gboolean
+gtk_cmclist_row_is_above_viewport (GtkCMCList *clist,
+                               gint row)
+{
+       cm_return_val_if_fail(GTK_IS_CMCLIST (clist), 0);
+
+       if (row < 0 || row >= clist->rows)
+               return FALSE;
+
+       if (clist->row_height == 0)
+               return FALSE;
+
+       if (row < ROW_FROM_YPIXEL (clist, 0))
+               return TRUE;
+
+       return FALSE;
+}
+
+gboolean
+gtk_cmclist_row_is_below_viewport (GtkCMCList *clist,
+                               gint row)
+{
+       cm_return_val_if_fail(GTK_IS_CMCLIST (clist), 0);
+
+       if (row < 0 || row >= clist->rows)
+               return FALSE;
+
+       if (clist->row_height == 0)
+               return FALSE;
+
+       if (row > ROW_FROM_YPIXEL (clist, clist->clist_window_height))
+               return TRUE;
+
+       return FALSE;
+}
+
 void
 gtk_cmclist_set_foreground (GtkCMCList       *clist,
                          gint            row,
@@ -3646,6 +3643,7 @@ toggle_row (GtkCMCList *clist,
                           row, column, event);
          return;
        }
+      break;
     case GTK_SELECTION_BROWSE:
       g_signal_emit (G_OBJECT (clist), clist_signals[SELECT_ROW], 0,
                       row, column, event);
@@ -4469,8 +4467,8 @@ gtk_cmclist_destroy (GtkObject *object)
        clist->column[i].button = NULL;
       }
 
-  if (GTK_OBJECT_CLASS (parent_class)->destroy)
-    (*GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+  if (GTK_OBJECT_CLASS (gtk_cmclist_parent_class)->destroy)
+    (*GTK_OBJECT_CLASS (gtk_cmclist_parent_class)->destroy) (object);
 }
 
 static void
@@ -4484,11 +4482,7 @@ gtk_cmclist_finalize (GObject *object)
 
   columns_delete (clist);
 
-#if !GLIB_CHECK_VERSION(2,10,0)
-  g_mem_chunk_destroy (clist->cell_mem_chunk);
-  g_mem_chunk_destroy (clist->row_mem_chunk);
-#endif
-  G_OBJECT_CLASS (parent_class)->finalize (object);
+  G_OBJECT_CLASS (gtk_cmclist_parent_class)->finalize (object);
 }
 
 /* GTKWIDGET
@@ -4509,10 +4503,9 @@ gtk_cmclist_realize (GtkWidget *widget)
 {
   GtkAllocation allocation;
   GtkCMCList *clist;
-  GtkStyle *style;
+  GtkStyle *style, *attached_style;
   GdkWindow *window;
   GdkWindowAttr attributes;
-  GdkGCValues values;
   GtkCMCListRow *clist_row;
   GList *list;
   gint attributes_mask;
@@ -4524,7 +4517,7 @@ gtk_cmclist_realize (GtkWidget *widget)
 
   clist = GTK_CMCLIST (widget);
 
-  gtkut_widget_set_realized (widget, TRUE);
+  gtk_widget_set_realized (widget, TRUE);
 
   border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
 
@@ -4546,15 +4539,17 @@ gtk_cmclist_realize (GtkWidget *widget)
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 
   /* main window */
-  window = gtk_widget_get_window (widget);
   window = gdk_window_new (gtk_widget_get_parent_window (widget),
                                   &attributes, attributes_mask);
   gdk_window_set_user_data (window, clist);
   gtk_widget_set_window (widget, window);
 
   style = gtk_widget_get_style (widget);
-  style = gtk_style_attach (style, window);
-  gtk_widget_set_style (widget, style);
+  attached_style = gtk_style_attach (style, window);
+  if (attached_style != style) {
+       gtk_widget_set_style(widget, attached_style);
+       style = attached_style;
+  }
 
   gtk_style_set_background (style, window, GTK_STATE_NORMAL);
 
@@ -4595,8 +4590,8 @@ gtk_cmclist_realize (GtkWidget *widget)
   gdk_window_set_background (clist->clist_window,
                             &style->base[GTK_STATE_NORMAL]);
   gdk_window_show (clist->clist_window);
-  gdk_drawable_get_size (clist->clist_window, &clist->clist_window_width,
-                      &clist->clist_window_height);
+  clist->clist_window_width = gdk_window_get_width(clist->clist_window);
+  clist->clist_window_height = gdk_window_get_height(clist->clist_window);
 
   /* create resize windows */
   attributes.wclass = GDK_INPUT_ONLY;
@@ -4647,7 +4642,7 @@ gtk_cmclist_realize (GtkWidget *widget)
          if (clist_row->bg_set)
            gdk_colormap_alloc_color (colormap, &clist_row->background, TRUE, TRUE);
        }
-      
+
       for (j = 0; j < clist->columns; j++)
        if  (clist_row->cell[j].style)
          clist_row->cell[j].style =
@@ -4671,7 +4666,7 @@ gtk_cmclist_unrealize (GtkWidget *widget)
   if (gtk_widget_get_mapped (widget))
     gtk_cmclist_unmap (widget);
 
-  gtkut_widget_set_mapped (widget, FALSE);
+  gtk_widget_set_mapped (widget, FALSE);
 
   /* detach optional row/cell styles */
   if (gtk_widget_get_realized (widget))
@@ -4718,8 +4713,8 @@ gtk_cmclist_unrealize (GtkWidget *widget)
 
   clist->cursor_drag = NULL;
 
-  if (GTK_WIDGET_CLASS (parent_class)->unrealize)
-    (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+  if (GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->unrealize)
+    (* GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->unrealize) (widget);
 }
 
 static void
@@ -4734,7 +4729,7 @@ gtk_cmclist_map (GtkWidget *widget)
 
   if (!gtk_widget_get_mapped (widget))
     {
-      gtkut_widget_set_mapped (widget, TRUE);
+      gtk_widget_set_mapped (widget, TRUE);
 
       /* map column buttons */
       for (i = 0; i < clist->columns; i++)
@@ -4773,7 +4768,7 @@ gtk_cmclist_unmap (GtkWidget *widget)
 
   if (gtk_widget_get_mapped (widget))
     {
-      gtkut_widget_set_mapped (widget, FALSE);
+      gtk_widget_set_mapped (widget, FALSE);
 
       if (clist_has_grab (clist))
        {
@@ -4821,32 +4816,15 @@ static gint
 gtk_cmclist_expose (GtkWidget      *widget,
                  GdkEventExpose *event)
 {
-  GdkWindow *window;
   GtkCMCList *clist;
-  GtkStyle *style;
 
   cm_return_val_if_fail (GTK_IS_CMCLIST (widget), FALSE);
   cm_return_val_if_fail (event != NULL, FALSE);
 
-  window = gtk_widget_get_window (widget);
-  style = gtk_widget_get_style (widget);
-
   if (gtk_widget_is_drawable (widget))
     {
       clist = GTK_CMCLIST (widget);
 
-      /* draw border */
-      if (event->window == window)
-       gtk_paint_shadow (style, window,
-                        GTK_STATE_NORMAL, clist->shadow_type,
-                        NULL, NULL, NULL,
-                        0, 0,
-                        clist->clist_window_width +
-                        (2 * style->xthickness),
-                        clist->clist_window_height +
-                        (2 * style->ythickness) +
-                        clist->column_title_area.height);
-
       /* exposure events on the list */
       if (event->window == clist->clist_window)
        draw_rows (clist, &event->area);
@@ -4878,8 +4856,8 @@ gtk_cmclist_style_set (GtkWidget *widget,
 
   cm_return_if_fail (GTK_IS_CMCLIST (widget));
 
-  if (GTK_WIDGET_CLASS (parent_class)->style_set)
-    (*GTK_WIDGET_CLASS (parent_class)->style_set) (widget, previous_style);
+  if (GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->style_set)
+    (*GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->style_set) (widget, previous_style);
 
   clist = GTK_CMCLIST (widget);
 
@@ -5356,7 +5334,7 @@ gtk_cmclist_motion (GtkWidget      *widget,
 
   row = CLAMP (row, 0, clist->rows - 1);
 
-  if (button_actions & GTK_CMBUTTON_SELECTS &
+  if (button_actions & GTK_CMBUTTON_SELECTS &&
       !g_object_get_data (G_OBJECT (widget), "gtk-site-data"))
     {
       if (row == clist->focus_row)
@@ -5396,7 +5374,6 @@ gtk_cmclist_size_request (GtkWidget      *widget,
   GtkCMCList *clist;
   GtkStyle *style;
   gint i;
-  gint font_height = 0;
   guint border_width;
   cm_return_if_fail (GTK_IS_CMCLIST (widget));
   cm_return_if_fail (requisition != NULL);
@@ -5410,7 +5387,6 @@ gtk_cmclist_size_request (GtkWidget      *widget,
   /* compute the size of the column title (title) area */
   clist->column_title_area.height = 0;
   if (GTK_CMCLIST_SHOW_TITLES(clist)) {
-    font_height = (pango_font_description_get_size(style->font_desc)/PANGO_SCALE)*2+4;
     for (i = 0; i < clist->columns; i++)
       if (clist->column[i].button)
        {
@@ -5646,7 +5622,6 @@ draw_row (GtkCMCList     *clist,
   gint state;
   gint i;
   cairo_t *cr;
-  const double dashes[] = {4.0, 4.0};
   cm_return_if_fail (clist != NULL);
 
   /* bail now if we arn't drawable yet */
@@ -5654,13 +5629,14 @@ draw_row (GtkCMCList     *clist,
     return;
 
   widget = GTK_WIDGET (clist);
-  style = gtk_widget_get_style (widget);
 
   /* if the function is passed the pointer to the row instead of null,
    * it avoids this expensive lookup */
   if (!clist_row)
     clist_row = ROW_ELEMENT (clist, row)->data;
 
+  style = clist_row->style ? clist_row->style : gtk_widget_get_style (widget);
+
   /* rectangle of the entire row */
   row_rectangle.x = 0;
   row_rectangle.y = ROW_TOP_YPIXEL (clist, row);
@@ -5842,7 +5818,7 @@ draw_row (GtkCMCList     *clist,
          if (layout)
            {
              gint row_center_offset = (clist->row_height - logical_rect.height - 1) / 2;
-             gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(clist))->fg[state]);
+             gdk_cairo_set_source_color(cr, clist_row->fg_set ? &clist_row->foreground : &style->text[state]);
              cairo_move_to(cr, offset, row_rectangle.y + row_center_offset + clist_row->cell[i].vertical);
              pango_cairo_show_layout(cr, layout);
               g_object_unref (G_OBJECT (layout));
@@ -5863,7 +5839,7 @@ draw_row (GtkCMCList     *clist,
       if (!area) {
        cairo_rectangle(cr, row_rectangle.x, row_rectangle.y,
                            row_rectangle.width + 1, row_rectangle.height);
-       gdk_cairo_set_source_color(cr, &style->fg[GTK_STATE_NORMAL]);
+       gdk_cairo_set_source_color(cr, &style->text[GTK_STATE_NORMAL]);
        cairo_stroke(cr);
       }
       else if (gdk_rectangle_intersect (area, &row_rectangle,
@@ -5871,7 +5847,7 @@ draw_row (GtkCMCList     *clist,
        {
          cairo_rectangle(cr, row_rectangle.x, row_rectangle.y,
                            row_rectangle.width + 1, row_rectangle.height);
-         gdk_cairo_set_source_color(cr, &style->fg[GTK_STATE_NORMAL]);
+         gdk_cairo_set_source_color(cr, &style->text[GTK_STATE_NORMAL]);
          cairo_stroke(cr);
        }
     }
@@ -5930,12 +5906,8 @@ draw_rows (GtkCMCList     *clist,
   if (!area) {
     int w, h, y;
     cairo_t *cr;
-#if GTK_CHECK_VERSION(2,24,0)
     w = gdk_window_get_width(clist->clist_window);
     h = gdk_window_get_height(clist->clist_window);
-#else
-    gdk_drawable_get_size(clist->clist_window, &w, &h);
-#endif
     cr = gdk_cairo_create(clist->clist_window);
     y = ROW_TOP_YPIXEL (clist, i);
     gdk_cairo_set_source_color(cr, &gtk_widget_get_style(GTK_WIDGET(clist))->base[GTK_STATE_NORMAL]);
@@ -6090,30 +6062,6 @@ adjust_adjustments (GtkCMCList *clist,
     }
 }
 
-static void
-vadjustment_changed (GtkAdjustment *adjustment,
-                    gpointer       data)
-{
-  GtkCMCList *clist;
-
-  cm_return_if_fail (adjustment != NULL);
-  cm_return_if_fail (data != NULL);
-
-  clist = GTK_CMCLIST (data);
-}
-
-static void
-hadjustment_changed (GtkAdjustment *adjustment,
-                    gpointer       data)
-{
-  GtkCMCList *clist;
-
-  cm_return_if_fail (adjustment != NULL);
-  cm_return_if_fail (data != NULL);
-
-  clist = GTK_CMCLIST (data);
-}
-
 static void
 vadjustment_value_changed (GtkAdjustment *adjustment,
                           gpointer       data)
@@ -6210,7 +6158,6 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
 {
   GtkCMCList *clist;
   GtkContainer *container;
-  GdkRectangle area;
   gint i;
   gint y = 0;
   gint value;
@@ -6271,7 +6218,7 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
          
               focus_row = clist->focus_row;
               clist->focus_row = -1;
-              draw_rows (clist, &area);
+              draw_rows (clist, NULL);
               clist->focus_row = focus_row;
          
              cairo_rectangle(cr, 0, y, clist->clist_window_width + 1,
@@ -6352,13 +6299,8 @@ row_new (GtkCMCList *clist)
   int i;
   GtkCMCListRow *clist_row;
 
-#if GLIB_CHECK_VERSION(2,10,0)
   clist_row = g_slice_new (GtkCMCListRow);
   clist_row->cell = g_slice_alloc (sizeof (GtkCMCell) * clist->columns);
-#else
-  clist_row = g_chunk_new (GtkCMCListRow, (GMemChunk *)clist->row_mem_chunk);
-  clist_row->cell = g_chunk_new (GtkCMCell, (GMemChunk *)clist->cell_mem_chunk);
-#endif
 
   for (i = 0; i < clist->columns; i++)
     {
@@ -6407,13 +6349,8 @@ row_delete (GtkCMCList    *clist,
   if (clist_row->destroy)
     clist_row->destroy (clist_row->data);
 
-#if GLIB_CHECK_VERSION(2,10,0)  
   g_slice_free1 (sizeof (GtkCMCell) * clist->columns, clist_row->cell);
   g_slice_free (GtkCMCListRow, clist_row);
-#else
-  g_mem_chunk_free ((GMemChunk *)clist->cell_mem_chunk, clist_row->cell);
-  g_mem_chunk_free ((GMemChunk *)clist->row_mem_chunk, clist_row);
-#endif
 }
 
 /* FOCUS FUNCTIONS
@@ -6521,7 +6458,8 @@ gtk_cmclist_set_focus_child (GtkContainer *container,
     if (clist->column[i].button == child)
       clist->focus_header_column = i;
   
-  parent_class->set_focus_child (container, child);
+  if (GTK_CONTAINER_CLASS (gtk_cmclist_parent_class)->set_focus_child)
+    (*GTK_CONTAINER_CLASS (gtk_cmclist_parent_class)->set_focus_child) (container, child);
 }
 
 static void
@@ -6541,9 +6479,9 @@ gtk_cmclist_draw_focus (GtkWidget *widget)
     cairo_dash_from_add_mode(clist, cr);
     cairo_set_line_width(cr, 1.0);
     cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
-    cairo_rectangle(cr, 0, ROW_TOP_YPIXEL(clist, clist->focus_row),
+    cairo_rectangle(cr, 0, ROW_TOP_YPIXEL(clist, clist->focus_row) + 0.5,
                        clist->clist_window_width + 1,
-                       clist->row_height);
+                       clist->row_height - 0.5);
     cairo_stroke(cr);
     cairo_destroy(cr);
   }
@@ -6570,9 +6508,9 @@ gtk_cmclist_undraw_focus (GtkWidget *widget)
     cairo_set_line_width(cr, 1.0);
     gdk_cairo_set_source_color(cr, &gtk_widget_get_style(widget)->base[GTK_STATE_NORMAL]);
     cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
-    cairo_rectangle(cr, 0, ROW_TOP_YPIXEL(clist, clist->focus_row),
+    cairo_rectangle(cr, 0, ROW_TOP_YPIXEL(clist, clist->focus_row) + 0.5,
                        clist->clist_window_width + 1,
-                       clist->row_height);
+                       clist->row_height - 0.5);
     cairo_stroke(cr);
     cairo_destroy(cr);
   }
@@ -6857,8 +6795,13 @@ move_focus_row (GtkCMCList      *clist,
     case GTK_SCROLL_JUMP:
       if (position >= 0 && position <= 1)
        {
+         gint row = position * (clist->rows - 1);
+
+         if (row == clist->focus_row)
+           return;
+
          gtk_cmclist_undraw_focus (widget);
-         clist->focus_row = position * (clist->rows - 1);
+         clist->focus_row = row;
          gtk_cmclist_draw_focus (widget);
        }
       break;
@@ -7023,6 +6966,7 @@ scroll_vertical (GtkCMCList      *clist,
            default:
              break;
            }
+         /* fallback is intentional */ 
        default:
          if (old_focus_row != clist->focus_row &&
              !(clist->selection_mode == GTK_SELECTION_MULTIPLE &&
@@ -7305,6 +7249,9 @@ gtk_cmclist_merge (GtkCMCList *clist,
 
   c = &z;
 
+  if (!a && !b)
+       return NULL;
+
   while (a || b)
     {
       if (a && !b)
@@ -7327,8 +7274,7 @@ gtk_cmclist_merge (GtkCMCList *clist,
        {
          cmp = clist->compare (clist, GTK_CMCLIST_ROW (a), GTK_CMCLIST_ROW (b));
          if ((cmp >= 0 && clist->sort_type == GTK_SORT_DESCENDING) ||
-             (cmp <= 0 && clist->sort_type == GTK_SORT_ASCENDING) ||
-             (a && !b))
+             (cmp <= 0 && clist->sort_type == GTK_SORT_ASCENDING))
            {
              c->next = a;
              a->prev = c;
@@ -7345,7 +7291,9 @@ gtk_cmclist_merge (GtkCMCList *clist,
        }
     }
 
-  z.next->prev = NULL;
+  if (z.next)
+       z.next->prev = NULL;
+
   return z.next;
 }