Remove unreachable code
[claws.git] / src / gtk / gtkcmclist.c
index db17f9d276d94ba865a2b41ba825c06e85d7524a..7980b8a2469d184c4f18055461d12ac61b743671 100644 (file)
@@ -175,6 +175,13 @@ enum {
   ARG_REORDERABLE,
   ARG_USE_DRAG_ICONS,
   ARG_SORT_TYPE
+#if GTK_CHECK_VERSION(3, 0, 0)
+  ,
+  ARG_HADJUSTMENT,
+  ARG_VADJUSTMENT,
+  ARG_HADJUSTMENT_POLICY,
+  ARG_VADJUSTMENT_POLICY
+#endif
 };
 
 /* GtkCMCList Methods */
@@ -201,9 +208,11 @@ static void gtk_cmclist_get_arg  (GObject *object,
                                GParamSpec *spec);
 
 /* GtkWidget Methods */
+#if !GTK_CHECK_VERSION(3, 0, 0)
 static void gtk_cmclist_set_scroll_adjustments (GtkCMCList      *clist,
                                              GtkAdjustment *hadjustment,
                                              GtkAdjustment *vadjustment);
+#endif
 static void gtk_cmclist_realize         (GtkWidget        *widget);
 static void gtk_cmclist_unrealize       (GtkWidget        *widget);
 static void gtk_cmclist_map             (GtkWidget        *widget);
@@ -467,11 +476,13 @@ 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};
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
+static gpointer gtk_cmclist_parent_class = NULL;
+
 GType
 gtk_cmclist_get_type (void)
 {
@@ -499,6 +510,11 @@ gtk_cmclist_get_type (void)
 
   return clist_type;
 }
+#else
+G_DEFINE_TYPE_WITH_CODE (GtkCMCList, gtk_cmclist, GTK_TYPE_CONTAINER,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE,
+                         NULL))
+#endif
 
 static void
 gtk_cmclist_class_init (GtkCMCListClass *klass)
@@ -519,7 +535,9 @@ gtk_cmclist_class_init (GtkCMCListClass *klass)
   widget_class = (GtkWidgetClass *) klass;
   container_class = (GtkContainerClass *) klass;
 
-  parent_class = g_type_class_peek (GTK_TYPE_CONTAINER);
+#if !GTK_CHECK_VERSION(3, 0, 0)
+  gtk_cmclist_parent_class = g_type_class_peek (GTK_TYPE_CONTAINER);
+#endif
 
   object_class->finalize = gtk_cmclist_finalize;
 #if !GTK_CHECK_VERSION(3, 0, 0)
@@ -568,7 +586,9 @@ gtk_cmclist_class_init (GtkCMCListClass *klass)
   container_class->forall = gtk_cmclist_forall;
   container_class->set_focus_child = gtk_cmclist_set_focus_child;
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
   klass->set_scroll_adjustments = gtk_cmclist_set_scroll_adjustments;
+#endif
   klass->refresh = clist_refresh;
   klass->select_row = real_select_row;
   klass->unselect_row = real_unselect_row;
@@ -667,6 +687,12 @@ gtk_cmclist_class_init (GtkCMCListClass *klass)
                              claws_marshal_VOID__OBJECT_OBJECT,
                              G_TYPE_NONE, 2,
                              GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+#else
+  /* Scrollable interface properties */
+  g_object_class_override_property (object_class, ARG_HADJUSTMENT, "hadjustment");
+  g_object_class_override_property (object_class, ARG_VADJUSTMENT, "vadjustment");
+  g_object_class_override_property (object_class, ARG_HADJUSTMENT_POLICY, "hscroll-policy");
+  g_object_class_override_property (object_class, ARG_VADJUSTMENT_POLICY, "vscroll-policy");
 #endif
 
   clist_signals[SELECT_ROW] =
@@ -1019,6 +1045,17 @@ gtk_cmclist_set_arg (GObject *object,
     case ARG_SORT_TYPE:
       gtk_cmclist_set_sort_type (clist, g_value_get_enum (value));
       break;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    case ARG_HADJUSTMENT:
+      gtk_cmclist_set_hadjustment (clist, g_value_get_object (value));
+      break;
+    case ARG_VADJUSTMENT:
+      gtk_cmclist_set_vadjustment (clist, g_value_get_object (value));
+      break;
+    case ARG_HADJUSTMENT_POLICY:
+    case ARG_VADJUSTMENT_POLICY:
+      break;
+#endif
     }
 }
 
@@ -1067,6 +1104,18 @@ gtk_cmclist_get_arg (GObject *object,
     case ARG_SORT_TYPE:
       g_value_set_enum(value, clist->sort_type);
       break;
+#if GTK_CHECK_VERSION(3, 0, 0)
+    case ARG_HADJUSTMENT:
+      g_value_set_object(value, gtk_cmclist_get_hadjustment(clist));
+      break;
+    case ARG_VADJUSTMENT:
+      g_value_set_object(value, gtk_cmclist_get_vadjustment(clist));
+      break;
+    case ARG_HADJUSTMENT_POLICY:
+    case ARG_VADJUSTMENT_POLICY:
+      g_value_set_enum(value, GTK_SCROLL_NATURAL);
+      break;
+#endif
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, arg_id, spec);
       break;
@@ -1083,12 +1132,6 @@ gtk_cmclist_init (GtkCMCList *clist)
   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;
@@ -1156,27 +1199,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);
   
@@ -1257,12 +1284,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), "value_changed",
                          G_CALLBACK( hadjustment_value_changed),
                          (gpointer) clist);
@@ -1306,12 +1328,7 @@ 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), "value_changed",
                          G_CALLBACK(vadjustment_value_changed),
@@ -1330,6 +1347,7 @@ gtk_cmclist_get_vadjustment (GtkCMCList *clist)
   return clist->vadjustment;
 }
 
+#if !GTK_CHECK_VERSION(3, 0, 0)
 static void
 gtk_cmclist_set_scroll_adjustments (GtkCMCList      *clist,
                                  GtkAdjustment *hadjustment,
@@ -1340,6 +1358,7 @@ gtk_cmclist_set_scroll_adjustments (GtkCMCList      *clist,
   if (clist->vadjustment != vadjustment)
     gtk_cmclist_set_vadjustment (clist, vadjustment);
 }
+#endif
 
 void
 gtk_cmclist_set_shadow_type (GtkCMCList      *clist,
@@ -3676,6 +3695,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);
@@ -4504,11 +4524,11 @@ gtk_cmclist_destroy (GtkWidget *object)
       }
 
 #if !GTK_CHECK_VERSION(3, 0, 0)
-  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);
 #else
-  if (GTK_WIDGET_CLASS (parent_class)->destroy)
-    (*GTK_WIDGET_CLASS (parent_class)->destroy) (object);
+  if (GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->destroy)
+    (*GTK_WIDGET_CLASS (gtk_cmclist_parent_class)->destroy) (object);
 #endif
 }
 
@@ -4523,11 +4543,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
@@ -4548,7 +4564,7 @@ gtk_cmclist_realize (GtkWidget *widget)
 {
   GtkAllocation allocation;
   GtkCMCList *clist;
-  GtkStyle *style;
+  GtkStyle *style, *attached_style;
   GdkWindow *window;
   GdkWindowAttr attributes;
   GtkCMCListRow *clist_row;
@@ -4590,15 +4606,17 @@ gtk_cmclist_realize (GtkWidget *widget)
 #endif
 
   /* 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);
 
@@ -4769,8 +4787,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
@@ -4939,8 +4957,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);
 
@@ -5738,13 +5756,14 @@ draw_row (GtkCMCList     *clist,
     return;
 
   widget = GTK_WIDGET (clist);
-  style = clist_row->style ? clist_row->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);
@@ -6270,7 +6289,6 @@ hadjustment_value_changed (GtkAdjustment *adjustment,
 {
   GtkCMCList *clist;
   GtkContainer *container;
-  GdkRectangle area;
   gint i;
   gint y = 0;
   gint value;
@@ -6331,7 +6349,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,
@@ -6412,13 +6430,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++)
     {
@@ -6467,13 +6480,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
@@ -6581,7 +6589,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
@@ -7026,16 +7035,8 @@ scroll_vertical (GtkCMCList      *clist,
       move_focus_row (clist, scroll_type, position);
 
       if (old_focus_row != clist->focus_row)
-       {
-         if (clist->selection_mode == GTK_SELECTION_BROWSE)
-           g_signal_emit (G_OBJECT (clist), clist_signals[UNSELECT_ROW], 0,
-                            old_focus_row, -1, NULL);
-         else if (!GTK_CMCLIST_ADD_MODE(clist))
-           {
-             gtk_cmclist_unselect_all (clist);
-             clist->undo_anchor = old_focus_row;
-           }
-       }
+         g_signal_emit (G_OBJECT (clist), clist_signals[UNSELECT_ROW], 0,
+                               old_focus_row, -1, NULL);
 
       switch (gtk_cmclist_row_is_visible (clist, clist->focus_row))
        {
@@ -7083,6 +7084,7 @@ scroll_vertical (GtkCMCList      *clist,
            default:
              break;
            }
+         /* fallback is intentional */ 
        default:
          if (old_focus_row != clist->focus_row &&
              !(clist->selection_mode == GTK_SELECTION_MULTIPLE &&
@@ -7365,6 +7367,9 @@ gtk_cmclist_merge (GtkCMCList *clist,
 
   c = &z;
 
+  if (!a && !b)
+       return NULL;
+
   while (a || b)
     {
       if (a && !b)
@@ -7387,8 +7392,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;