[frogr] Fixed memory and reference handling issues, related to how objects and lists of objects were being p



commit 2320863f9d679ec6d43272372fe0453d77efe5a5
Author: Mario Sanchez Prada <msanchez gnome org>
Date:   Wed Oct 31 07:40:16 2012 +0100

    Fixed memory and reference handling issues, related to how objects and lists of objects
    were being passing around among the main window, dialogs and the controller.

 src/frogr-add-tags-dialog.c       |   16 ++++++++++---
 src/frogr-add-tags-dialog.h       |    2 +-
 src/frogr-add-to-group-dialog.c   |   40 ++++++++++++++++++++++++++++-------
 src/frogr-add-to-group-dialog.h   |    4 +-
 src/frogr-add-to-set-dialog.c     |   41 +++++++++++++++++++++++++++++-------
 src/frogr-add-to-set-dialog.h     |    4 +-
 src/frogr-controller.c            |   25 ++++++++++++++++++++++
 src/frogr-create-new-set-dialog.c |   38 ++++++++++++++++++++++++++++-----
 src/frogr-create-new-set-dialog.h |    4 +-
 src/frogr-details-dialog.c        |   32 ++++++++++++++++------------
 src/frogr-details-dialog.h        |    4 ++-
 src/frogr-file-loader.c           |   10 +-------
 src/frogr-live-entry.c            |   10 ++++----
 src/frogr-live-entry.h            |    2 +-
 src/frogr-main-view.c             |   24 +++++----------------
 src/frogr-picture.c               |   16 +++----------
 src/frogr-util.c                  |    6 +++-
 17 files changed, 184 insertions(+), 94 deletions(-)
---
diff --git a/src/frogr-add-tags-dialog.c b/src/frogr-add-tags-dialog.c
index 7befdde..a7b9ad6 100644
--- a/src/frogr-add-tags-dialog.c
+++ b/src/frogr-add-tags-dialog.c
@@ -52,11 +52,21 @@ enum  {
 
 /* Prototypes */
 
+static void _set_pictures (FrogrAddTagsDialog *self, const GSList *pictures);
+
 static void _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data);
 
 /* Private API */
 
 static void
+_set_pictures (FrogrAddTagsDialog *self, const GSList *pictures)
+{
+  FrogrAddTagsDialogPrivate *priv = FROGR_ADD_TAGS_DIALOG_GET_PRIVATE (self);
+  priv->pictures = g_slist_copy ((GSList*) pictures);
+  g_slist_foreach (priv->pictures, (GFunc)g_object_ref, NULL);
+}
+
+static void
 _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
 {
   if (response == GTK_RESPONSE_OK)
@@ -109,12 +119,10 @@ _frogr_add_tags_dialog_set_property (GObject *object,
                                      const GValue *value,
                                      GParamSpec *pspec)
 {
-  FrogrAddTagsDialogPrivate *priv = FROGR_ADD_TAGS_DIALOG_GET_PRIVATE (object);
-
   switch (prop_id)
     {
     case PROP_PICTURES:
-      priv->pictures = (GSList *) g_value_get_pointer (value);
+      _set_pictures (FROGR_ADD_TAGS_DIALOG (object), g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -215,7 +223,7 @@ frogr_add_tags_dialog_init (FrogrAddTagsDialog *self)
 /* Public API */
 
 void
-frogr_add_tags_dialog_show (GtkWindow *parent, GSList *pictures, GSList *tags)
+frogr_add_tags_dialog_show (GtkWindow *parent, const GSList *pictures, const GSList *tags)
 {
   FrogrConfig *config = NULL;
   GObject *new = NULL;
diff --git a/src/frogr-add-tags-dialog.h b/src/frogr-add-tags-dialog.h
index b92b6aa..96a4a6b 100644
--- a/src/frogr-add-tags-dialog.h
+++ b/src/frogr-add-tags-dialog.h
@@ -47,7 +47,7 @@ struct _FrogrAddTagsDialog
 
 GType frogr_add_tags_dialog_get_type (void) G_GNUC_CONST;
 
-void frogr_add_tags_dialog_show (GtkWindow *parent, GSList *pictures, GSList *tags);
+void frogr_add_tags_dialog_show (GtkWindow *parent, const GSList *pictures, const GSList *tags);
 
 G_END_DECLS  /* FROGR_ADD_TAGS_DIALOG_H */
 
diff --git a/src/frogr-add-to-group-dialog.c b/src/frogr-add-to-group-dialog.c
index e94e0c8..6638dfc 100644
--- a/src/frogr-add-to-group-dialog.c
+++ b/src/frogr-add-to-group-dialog.c
@@ -68,6 +68,10 @@ enum {
 
 /* Prototypes */
 
+static void _set_pictures (FrogrAddToGroupDialog *self, const GSList *pictures);
+
+static void _set_groups (FrogrAddToGroupDialog *self, const GSList *groups);
+
 static GtkWidget *_create_tree_view (FrogrAddToGroupDialog *self);
 
 static void _column_clicked_cb (GtkTreeViewColumn *col, gpointer data);
@@ -97,6 +101,23 @@ static void _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data
 
 /* Private API */
 
+static void
+_set_pictures (FrogrAddToGroupDialog *self, const GSList *pictures)
+{
+  FrogrAddToGroupDialogPrivate *priv = FROGR_ADD_TO_GROUP_DIALOG_GET_PRIVATE (self);
+  priv->pictures = g_slist_copy ((GSList*) pictures);
+  g_slist_foreach (priv->pictures, (GFunc)g_object_ref, NULL);
+}
+
+static void _set_groups (FrogrAddToGroupDialog *self, const GSList *groups)
+{
+  FrogrAddToGroupDialogPrivate *priv = NULL;
+
+  priv = FROGR_ADD_TO_GROUP_DIALOG_GET_PRIVATE (self);
+  priv->groups = g_slist_copy ((GSList*)groups);
+  g_slist_foreach (priv->groups, (GFunc)g_object_ref, NULL);
+}
+
 static GtkWidget *
 _create_tree_view (FrogrAddToGroupDialog *self)
 {
@@ -381,7 +402,6 @@ _update_pictures (FrogrAddToGroupDialog *self)
       picture = FROGR_PICTURE (item->data);
       frogr_picture_set_groups (picture, selected_groups);
     }
-  g_slist_free (selected_groups);
 }
 
 static void
@@ -405,15 +425,13 @@ _frogr_add_to_group_dialog_set_property (GObject *object,
                                          const GValue *value,
                                          GParamSpec *pspec)
 {
-  FrogrAddToGroupDialogPrivate *priv = FROGR_ADD_TO_GROUP_DIALOG_GET_PRIVATE (object);
-
   switch (prop_id)
     {
     case PROP_PICTURES:
-      priv->pictures = (GSList *) g_value_get_pointer (value);
+      _set_pictures (FROGR_ADD_TO_GROUP_DIALOG (object), g_value_get_pointer (value));
       break;
     case PROP_GROUPS:
-      priv->groups = (GSList *) g_value_get_pointer (value);
+      _set_groups (FROGR_ADD_TO_GROUP_DIALOG (object), g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -455,8 +473,12 @@ _frogr_add_to_group_dialog_dispose (GObject *object)
       priv->pictures = NULL;
     }
 
-  if (priv->groups)
-    priv->groups = NULL;
+   if (priv->groups)
+    {
+      g_slist_foreach (priv->groups, (GFunc)g_object_unref, NULL);
+      g_slist_free (priv->groups);
+      priv->groups = NULL;
+    }
 
   if (priv->treemodel)
     {
@@ -554,7 +576,9 @@ frogr_add_to_group_dialog_init (FrogrAddToGroupDialog *self)
 /* Public API */
 
 void
-frogr_add_to_group_dialog_show (GtkWindow *parent, GSList *pictures, GSList *groups)
+frogr_add_to_group_dialog_show (GtkWindow *parent,
+                                const GSList *pictures,
+                                const GSList *groups)
 {
   FrogrAddToGroupDialog *self = NULL;
   GObject *new = NULL;
diff --git a/src/frogr-add-to-group-dialog.h b/src/frogr-add-to-group-dialog.h
index fd387b5..7332782 100644
--- a/src/frogr-add-to-group-dialog.h
+++ b/src/frogr-add-to-group-dialog.h
@@ -48,8 +48,8 @@ struct _FrogrAddToGroupDialog
 GType frogr_add_to_group_dialog_get_type (void) G_GNUC_CONST;
 
 void frogr_add_to_group_dialog_show (GtkWindow *parent,
-                                     GSList *pictures,
-                                     GSList *groups);
+                                     const GSList *pictures,
+                                     const GSList *groups);
 
 G_END_DECLS  /* FROGR_ADD_TO_GROUP_DIALOG_H */
 
diff --git a/src/frogr-add-to-set-dialog.c b/src/frogr-add-to-set-dialog.c
index 5c44645..08b4072 100644
--- a/src/frogr-add-to-set-dialog.c
+++ b/src/frogr-add-to-set-dialog.c
@@ -68,6 +68,10 @@ enum {
 
 /* Prototypes */
 
+static void _set_pictures (FrogrAddToSetDialog *self, const GSList *pictures);
+
+static void _set_photosets (FrogrAddToSetDialog *self, const GSList *photosets);
+
 static GtkWidget *_create_tree_view (FrogrAddToSetDialog *self);
 
 static void _column_clicked_cb (GtkTreeViewColumn *col, gpointer data);
@@ -97,6 +101,24 @@ static void _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data
 
 /* Private API */
 
+static void
+_set_pictures (FrogrAddToSetDialog *self, const GSList *pictures)
+{
+  FrogrAddToSetDialogPrivate *priv = FROGR_ADD_TO_SET_DIALOG_GET_PRIVATE (self);
+  priv->pictures = g_slist_copy ((GSList*) pictures);
+  g_slist_foreach (priv->pictures, (GFunc)g_object_ref, NULL);
+}
+
+static void
+_set_photosets (FrogrAddToSetDialog *self, const GSList *photosets)
+{
+  FrogrAddToSetDialogPrivate *priv = NULL;
+
+  priv = FROGR_ADD_TO_SET_DIALOG_GET_PRIVATE (self);
+  priv->photosets = g_slist_copy ((GSList*)photosets);
+  g_slist_foreach (priv->photosets, (GFunc)g_object_ref, NULL);
+}
+
 static GtkWidget *
 _create_tree_view (FrogrAddToSetDialog *self)
 {
@@ -381,7 +403,6 @@ _update_pictures (FrogrAddToSetDialog *self)
       picture = FROGR_PICTURE (item->data);
       frogr_picture_set_photosets (picture, selected_sets);
     }
-  g_slist_free (selected_sets);
 }
 
 static void
@@ -405,15 +426,13 @@ _frogr_add_to_set_dialog_set_property (GObject *object,
                                        const GValue *value,
                                        GParamSpec *pspec)
 {
-  FrogrAddToSetDialogPrivate *priv = FROGR_ADD_TO_SET_DIALOG_GET_PRIVATE (object);
-
   switch (prop_id)
     {
     case PROP_PICTURES:
-      priv->pictures = (GSList *) g_value_get_pointer (value);
+      _set_pictures (FROGR_ADD_TO_SET_DIALOG (object), g_value_get_pointer (value));
       break;
     case PROP_PHOTOSETS:
-      priv->photosets = (GSList *) g_value_get_pointer (value);
+      _set_photosets (FROGR_ADD_TO_SET_DIALOG (object), g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -455,8 +474,12 @@ _frogr_add_to_set_dialog_dispose (GObject *object)
       priv->pictures = NULL;
     }
 
-  if (priv->photosets)
-    priv->photosets = NULL;
+   if (priv->photosets)
+    {
+      g_slist_foreach (priv->photosets, (GFunc)g_object_unref, NULL);
+      g_slist_free (priv->photosets);
+      priv->photosets = NULL;
+    }
 
   if (priv->treemodel)
     {
@@ -554,7 +577,9 @@ frogr_add_to_set_dialog_init (FrogrAddToSetDialog *self)
 /* Public API */
 
 void
-frogr_add_to_set_dialog_show (GtkWindow *parent, GSList *pictures, GSList *photosets)
+frogr_add_to_set_dialog_show (GtkWindow *parent,
+                              const GSList *pictures,
+                              const GSList *photosets)
 {
   FrogrAddToSetDialog *self = NULL;
   GObject *new = NULL;
diff --git a/src/frogr-add-to-set-dialog.h b/src/frogr-add-to-set-dialog.h
index d3d5eed..8f6f1dc 100644
--- a/src/frogr-add-to-set-dialog.h
+++ b/src/frogr-add-to-set-dialog.h
@@ -48,8 +48,8 @@ struct _FrogrAddToSetDialog
 GType frogr_add_to_set_dialog_get_type (void) G_GNUC_CONST;
 
 void frogr_add_to_set_dialog_show (GtkWindow *parent,
-                                   GSList *pictures,
-                                   GSList *photosets);
+                                   const GSList *pictures,
+                                   const GSList *photosets);
 
 G_END_DECLS  /* FROGR_ADD_TO_SET_DIALOG_H */
 
diff --git a/src/frogr-controller.c b/src/frogr-controller.c
index 4d4e2c2..260179b 100644
--- a/src/frogr-controller.c
+++ b/src/frogr-controller.c
@@ -1761,6 +1761,10 @@ _show_details_dialog_on_idle (GSList *pictures)
   window = frogr_main_view_get_window (priv->mainview);
   frogr_details_dialog_show (window, pictures, tags_list);
 
+  /* FrogrController's responsibility over this list ends here */
+  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
+  g_slist_free (pictures);
+
   return FALSE;
 }
 
@@ -1791,6 +1795,10 @@ _show_add_tags_dialog_on_idle (GSList *pictures)
   window = frogr_main_view_get_window (priv->mainview);
   frogr_add_tags_dialog_show (window, pictures, tags_list);
 
+  /* FrogrController's responsibility over this list ends here */
+  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
+  g_slist_free (pictures);
+
   return FALSE;
 }
 
@@ -1820,6 +1828,10 @@ _show_create_new_set_dialog_on_idle (GSList *pictures)
   window = frogr_main_view_get_window (priv->mainview);
   frogr_create_new_set_dialog_show (window, pictures, photosets);
 
+  /* FrogrController's responsibility over this list ends here */
+  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
+  g_slist_free (pictures);
+
   return FALSE;
 }
 
@@ -1852,6 +1864,10 @@ _show_add_to_set_dialog_on_idle (GSList *pictures)
   else if (priv->photosets_fetched)
     frogr_util_show_info_dialog (window, _("No sets found"));
 
+  /* FrogrController's responsibility over this list ends here */
+  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
+  g_slist_free (pictures);
+
   return FALSE;
 }
 
@@ -1884,6 +1900,10 @@ _show_add_to_group_dialog_on_idle (GSList *pictures)
   else if (priv->groups_fetched)
     frogr_util_show_info_dialog (window, _("No groups found"));
 
+  /* FrogrController's responsibility over this list ends here */
+  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
+  g_slist_free (pictures);
+
   return FALSE;
 }
 
@@ -2378,6 +2398,7 @@ frogr_controller_show_details_dialog (FrogrController *self,
     }
 
   /* Show the dialog when possible */
+  g_slist_foreach (pictures, (GFunc) g_object_ref, NULL);
   gdk_threads_add_timeout (DEFAULT_TIMEOUT, (GSourceFunc) _show_details_dialog_on_idle, pictures);
 }
 
@@ -2400,6 +2421,7 @@ frogr_controller_show_add_tags_dialog (FrogrController *self,
     }
 
   /* Show the dialog when possible */
+  g_slist_foreach (pictures, (GFunc) g_object_ref, NULL);
   gdk_threads_add_timeout (DEFAULT_TIMEOUT, (GSourceFunc) _show_add_tags_dialog_on_idle, pictures);
 }
 
@@ -2422,6 +2444,7 @@ frogr_controller_show_create_new_set_dialog (FrogrController *self,
     }
 
   /* Show the dialog when possible */
+  g_slist_foreach (pictures, (GFunc) g_object_ref, NULL);
   gdk_threads_add_timeout (DEFAULT_TIMEOUT, (GSourceFunc) _show_create_new_set_dialog_on_idle, pictures);
 }
 
@@ -2444,6 +2467,7 @@ frogr_controller_show_add_to_set_dialog (FrogrController *self,
     }
 
   /* Show the dialog when possible */
+  g_slist_foreach (pictures, (GFunc) g_object_ref, NULL);
   gdk_threads_add_timeout (DEFAULT_TIMEOUT, (GSourceFunc) _show_add_to_set_dialog_on_idle, pictures);
 }
 
@@ -2466,6 +2490,7 @@ frogr_controller_show_add_to_group_dialog (FrogrController *self,
     }
 
   /* Show the dialog when possible */
+  g_slist_foreach (pictures, (GFunc) g_object_ref, NULL);
   gdk_threads_add_timeout (DEFAULT_TIMEOUT, (GSourceFunc) _show_add_to_group_dialog_on_idle, pictures);
 }
 
diff --git a/src/frogr-create-new-set-dialog.c b/src/frogr-create-new-set-dialog.c
index 9b7e704..9cb0965 100644
--- a/src/frogr-create-new-set-dialog.c
+++ b/src/frogr-create-new-set-dialog.c
@@ -58,6 +58,10 @@ enum  {
 
 /* Prototypes */
 
+static void _set_pictures (FrogrCreateNewSetDialog *self, const GSList *pictures);
+
+static void _set_photosets (FrogrCreateNewSetDialog *self, const GSList *photosets);
+
 static void _on_button_toggled (GtkToggleButton *button, gpointer data);
 
 static gboolean _validate_dialog_data (FrogrCreateNewSetDialog *self);
@@ -73,6 +77,24 @@ static void _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data
 /* Private API */
 
 static void
+_set_pictures (FrogrCreateNewSetDialog *self, const GSList *pictures)
+{
+  FrogrCreateNewSetDialogPrivate *priv = FROGR_CREATE_NEW_SET_DIALOG_GET_PRIVATE (self);
+  priv->pictures = g_slist_copy ((GSList*) pictures);
+  g_slist_foreach (priv->pictures, (GFunc)g_object_ref, NULL);
+}
+
+static void
+_set_photosets (FrogrCreateNewSetDialog *self, const GSList *photosets)
+{
+  FrogrCreateNewSetDialogPrivate *priv = NULL;
+
+  priv = FROGR_CREATE_NEW_SET_DIALOG_GET_PRIVATE (self);
+  priv->photosets = g_slist_copy ((GSList*)photosets);
+  g_slist_foreach (priv->photosets, (GFunc)g_object_ref, NULL);
+}
+
+static void
 _on_button_toggled (GtkToggleButton *button, gpointer data)
 {
   FrogrCreateNewSetDialog *self = NULL;
@@ -203,15 +225,13 @@ _frogr_create_new_set_dialog_set_property (GObject *object,
                                            const GValue *value,
                                            GParamSpec *pspec)
 {
-  FrogrCreateNewSetDialogPrivate *priv = FROGR_CREATE_NEW_SET_DIALOG_GET_PRIVATE (object);
-
   switch (prop_id)
     {
     case PROP_PICTURES:
-      priv->pictures = (GSList *) g_value_get_pointer (value);
+      _set_pictures (FROGR_CREATE_NEW_SET_DIALOG (object), g_value_get_pointer (value));
       break;
     case PROP_PHOTOSETS:
-      priv->photosets = (GSList *) g_value_get_pointer (value);
+      _set_photosets (FROGR_CREATE_NEW_SET_DIALOG (object), g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -254,7 +274,11 @@ _frogr_create_new_set_dialog_dispose (GObject *object)
     }
 
   if (priv->photosets)
-    priv->photosets = NULL;
+    {
+      g_slist_foreach (priv->photosets, (GFunc)g_object_unref, NULL);
+      g_slist_free (priv->photosets);
+      priv->photosets = NULL;
+    }
 
   G_OBJECT_CLASS(frogr_create_new_set_dialog_parent_class)->dispose (object);
 }
@@ -371,7 +395,9 @@ frogr_create_new_set_dialog_init (FrogrCreateNewSetDialog *self)
 /* Public API */
 
 void
-frogr_create_new_set_dialog_show (GtkWindow *parent, GSList *pictures, GSList *photosets)
+frogr_create_new_set_dialog_show (GtkWindow *parent,
+                                  const GSList *pictures,
+                                  const GSList *photosets)
 {
   GtkWidget *dialog = NULL;
   dialog = GTK_WIDGET (g_object_new (FROGR_TYPE_CREATE_NEW_SET_DIALOG,
diff --git a/src/frogr-create-new-set-dialog.h b/src/frogr-create-new-set-dialog.h
index e9ff651..5906172 100644
--- a/src/frogr-create-new-set-dialog.h
+++ b/src/frogr-create-new-set-dialog.h
@@ -48,8 +48,8 @@ struct _FrogrCreateNewSetDialog
 GType frogr_create_new_set_dialog_get_type (void) G_GNUC_CONST;
 
 void frogr_create_new_set_dialog_show (GtkWindow *parent,
-                                       GSList *pictures,
-                                       GSList *photosets);
+                                       const GSList *pictures,
+                                       const GSList *photosets);
 
 G_END_DECLS  /* FROGR_CREATE_NEW_SET_DIALOG_H */
 
diff --git a/src/frogr-details-dialog.c b/src/frogr-details-dialog.c
index 1451a16..9cf04f0 100644
--- a/src/frogr-details-dialog.c
+++ b/src/frogr-details-dialog.c
@@ -102,6 +102,8 @@ static const gchar *license_descriptions[] = {
 
 /* Prototypes */
 
+static void _set_pictures (FrogrDetailsDialog *self, const GSList *pictures);
+
 static void _create_widgets (FrogrDetailsDialog *self);
 
 static void _update_ui (FrogrDetailsDialog *self);
@@ -132,6 +134,14 @@ static void _dialog_response_cb (GtkDialog *dialog, gint response, gpointer data
 /* Private API */
 
 static void
+_set_pictures (FrogrDetailsDialog *self, const GSList *pictures)
+{
+  FrogrDetailsDialogPrivate *priv = FROGR_DETAILS_DIALOG_GET_PRIVATE (self);
+  priv->pictures = g_slist_copy ((GSList*) pictures);
+  g_slist_foreach (priv->pictures, (GFunc)g_object_ref, NULL);
+}
+
+static void
 _create_widgets (FrogrDetailsDialog *self)
 {
   FrogrDetailsDialogPrivate *priv = NULL;
@@ -1053,25 +1063,19 @@ _on_toggle_button_toggled (GtkToggleButton *tbutton, gpointer data)
 static void
 _on_picture_button_clicked (GtkButton *button, gpointer data)
 {
-  FrogrDetailsDialog *self = FROGR_DETAILS_DIALOG (data);
-  FrogrDetailsDialogPrivate *priv = FROGR_DETAILS_DIALOG_GET_PRIVATE (self);
+  FrogrDetailsDialogPrivate *priv = FROGR_DETAILS_DIALOG_GET_PRIVATE (data);
   GSList *current_pic = NULL;
   GList *uris_list = NULL;
   FrogrPicture *picture = NULL;
-  gchar *fileuri = NULL;
 
   for (current_pic = priv->pictures; current_pic; current_pic = g_slist_next (current_pic))
     {
       picture = FROGR_PICTURE (current_pic->data);
-      fileuri = g_strdup (frogr_picture_get_fileuri (picture));
-
-      /* Dupped uris in the GList must NOT be freed here */
-      uris_list = g_list_append (uris_list, fileuri);
+      uris_list = g_list_append (uris_list, g_strdup (frogr_picture_get_fileuri (picture)));
     }
 
+  /* This function will already free the list and its elements */
   frogr_util_open_images_in_viewer (uris_list);
-
-  g_list_free (uris_list);
 }
 
 static void
@@ -1096,12 +1100,10 @@ _frogr_details_dialog_set_property (GObject *object,
                                     const GValue *value,
                                     GParamSpec *pspec)
 {
-  FrogrDetailsDialogPrivate *priv = FROGR_DETAILS_DIALOG_GET_PRIVATE (object);
-
   switch (prop_id)
     {
     case PROP_PICTURES:
-      priv->pictures = (GSList *) g_value_get_pointer (value);
+      _set_pictures (FROGR_DETAILS_DIALOG (object), g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1212,14 +1214,16 @@ frogr_details_dialog_init (FrogrDetailsDialog *self)
 /* Public API */
 
 void
-frogr_details_dialog_show (GtkWindow *parent, GSList *fpictures, GSList *tags)
+frogr_details_dialog_show (GtkWindow *parent,
+                           const GSList *pictures,
+                           const GSList *tags)
 {
   FrogrConfig *config = NULL;
   GObject *new = NULL;
 
   new = g_object_new (FROGR_TYPE_DETAILS_DIALOG,
                       "modal", TRUE,
-                      "pictures", fpictures,
+                      "pictures", pictures,
                       "transient-for", parent,
                       "width-request", DIALOG_MIN_WIDTH,
                       "height-request", -1,
diff --git a/src/frogr-details-dialog.h b/src/frogr-details-dialog.h
index eec418c..10e6cb9 100644
--- a/src/frogr-details-dialog.h
+++ b/src/frogr-details-dialog.h
@@ -47,7 +47,9 @@ struct _FrogrDetailsDialog
 
 GType frogr_details_dialog_get_type (void) G_GNUC_CONST;
 
-void frogr_details_dialog_show (GtkWindow *parent, GSList *fpictures, GSList *tags);
+void frogr_details_dialog_show (GtkWindow *parent,
+                                const GSList *pictures,
+                                const GSList *tags);
 
 G_END_DECLS  /* FROGR_DETAILS_DIALOG_H */
 
diff --git a/src/frogr-file-loader.c b/src/frogr-file-loader.c
index 3eb9d7d..3fe626b 100644
--- a/src/frogr-file-loader.c
+++ b/src/frogr-file-loader.c
@@ -687,21 +687,15 @@ frogr_file_loader_new (GSList *file_uris, gulong max_filesize)
 {
   FrogrFileLoader *self = NULL;
   FrogrFileLoaderPrivate *priv = NULL;
-  GSList *uri = NULL;
 
   self = FROGR_FILE_LOADER (g_object_new(FROGR_TYPE_FILE_LOADER, NULL));
   priv = FROGR_FILE_LOADER_GET_PRIVATE (self);
 
-  /* We need to gain ownership of the strings */
-  for (uri = file_uris; uri; uri = g_slist_next (uri))
-    priv->file_uris = g_slist_prepend (priv->file_uris, g_strdup ((gchar *)uri->data));
-  priv->file_uris = g_slist_reverse (priv->file_uris);
-
-  /* Other internal data */
-  priv->max_filesize = max_filesize;
+  priv->file_uris = file_uris;
   priv->current = priv->file_uris;
   priv->index = 0;
   priv->n_files = g_slist_length (priv->file_uris);
+  priv->max_filesize = max_filesize;
 
   return self;
 }
diff --git a/src/frogr-live-entry.c b/src/frogr-live-entry.c
index 95cf23c..ea32f12 100644
--- a/src/frogr-live-entry.c
+++ b/src/frogr-live-entry.c
@@ -49,7 +49,7 @@ enum {
 
 /* Prototypes */
 
-static void _populate_treemodel_with_data (GtkTreeModel *treemodel, GSList *entries);
+static void _populate_treemodel_with_data (GtkTreeModel *treemodel, const GSList *entries);
 
 static gboolean _entry_list_completion_func (GtkEntryCompletion *completion, const gchar *key,
                                              GtkTreeIter *iter, gpointer data);
@@ -60,11 +60,11 @@ static gboolean _completion_match_selected_cb (GtkEntryCompletion *widget, GtkTr
 /* Private API */
 
 static void
-_populate_treemodel_with_data (GtkTreeModel *treemodel, GSList *entries)
+_populate_treemodel_with_data (GtkTreeModel *treemodel, const GSList *entries)
 {
   if (treemodel && entries)
     {
-      GSList *item = NULL;
+      const GSList *item = NULL;
       gchar *entry = NULL;
       GtkTreeIter iter;
 
@@ -217,7 +217,7 @@ frogr_live_entry_new (void)
 }
 
 void
-frogr_live_entry_set_auto_completion (FrogrLiveEntry *self, GSList *data)
+frogr_live_entry_set_auto_completion (FrogrLiveEntry *self, const GSList *data)
 {
   FrogrLiveEntryPrivate *priv = NULL;
 
@@ -246,7 +246,7 @@ frogr_live_entry_set_auto_completion (FrogrLiveEntry *self, GSList *data)
     }
 
   /* Enable or disable auto-completion as needed */
-  gtk_entry_set_completion (GTK_ENTRY (self), data ? priv->entry_completion: NULL);
+  gtk_entry_set_completion (GTK_ENTRY (self), data ? priv->entry_completion : NULL);
 
   /* Populate the tree model with the data (or 'no data) passed */
   if (priv->treemodel)
diff --git a/src/frogr-live-entry.h b/src/frogr-live-entry.h
index 5887ed7..bbda0a5 100644
--- a/src/frogr-live-entry.h
+++ b/src/frogr-live-entry.h
@@ -49,7 +49,7 @@ GType frogr_live_entry_get_type (void) G_GNUC_CONST;
 
 GtkWidget *frogr_live_entry_new (void);
 
-void frogr_live_entry_set_auto_completion (FrogrLiveEntry *self, GSList *data);
+void frogr_live_entry_set_auto_completion (FrogrLiveEntry *self, const GSList *data);
 
 G_END_DECLS  /* FROGR_LIVE_ENTRY_H */
 
diff --git a/src/frogr-main-view.c b/src/frogr-main-view.c
index 72d3b50..f77d52c 100644
--- a/src/frogr-main-view.c
+++ b/src/frogr-main-view.c
@@ -454,11 +454,8 @@ _on_icon_view_drag_data_received (GtkWidget *widget,
   fileuris_array = g_strsplit ((const gchar*)files_string, "\r\n", -1);
   for (i = 0;  fileuris_array[i]; i++)
     {
-      gchar *fileuri = g_strdup (fileuris_array[i]);
-      if (fileuri && !g_str_equal (g_strstrip (fileuri), ""))
-        fileuris_list = g_slist_append (fileuris_list, fileuri);
-      else
-        g_free (fileuri);
+      if (fileuris_array[i] && fileuris_array[i][0] != '\0')
+        fileuris_list = g_slist_append (fileuris_list, g_strdup (fileuris_array[i]));
     }
 
   /* Load pictures */
@@ -470,7 +467,6 @@ _on_icon_view_drag_data_received (GtkWidget *widget,
 
   /* Free */
   g_strfreev (fileuris_array);
-  g_slist_free (fileuris_list);
 }
 
 void
@@ -828,9 +824,7 @@ _get_selected_pictures (FrogrMainView *self)
                           -1);
 
       /* Add the picture to the list */
-      g_object_ref (picture);
-      pictures = g_slist_prepend (pictures, picture);
-
+      pictures = g_slist_prepend (pictures, g_object_ref (picture));
       gtk_tree_path_free (path);
     }
 
@@ -925,11 +919,7 @@ _load_pictures_dialog_response_cb (GtkDialog *dialog, gint response, gpointer da
       /* Add selected pictures to icon view area */
       fileuris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (dialog));
       if (fileuris != NULL)
-        {
-          _load_pictures (FROGR_MAIN_VIEW (self), fileuris);
-          g_slist_foreach (fileuris, (GFunc) g_free, NULL);
-          g_slist_free (fileuris);
-        }
+        _load_pictures (FROGR_MAIN_VIEW (self), fileuris);
     }
 
   gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -1077,13 +1067,12 @@ _open_pictures_in_external_viewer (FrogrMainView *self)
   for (current_pic = pictures; current_pic; current_pic = g_slist_next (current_pic))
     {
       picture = FROGR_PICTURE (current_pic->data);
-      uris_list = g_list_append (uris_list, (gchar *) frogr_picture_get_fileuri (picture));
+      uris_list = g_list_append (uris_list, g_strdup (frogr_picture_get_fileuri (picture)));
     }
-  g_slist_foreach (pictures, (GFunc) g_object_unref, NULL);
   g_slist_free (pictures);
 
+  /* This function will already free the list and its elements */
   frogr_util_open_images_in_viewer (uris_list);
-  g_list_free (uris_list);
 }
 
 static void
@@ -1108,7 +1097,6 @@ _remove_selected_pictures (FrogrMainView *self)
   _update_ui (self);
 
   /* Free */
-  g_slist_foreach (selected_pictures, (GFunc)g_object_unref, NULL);
   g_slist_free (selected_pictures);
 }
 
diff --git a/src/frogr-picture.c b/src/frogr-picture.c
index c23fde2..8d31309 100644
--- a/src/frogr-picture.c
+++ b/src/frogr-picture.c
@@ -1068,12 +1068,8 @@ frogr_picture_set_photosets (FrogrPicture *self, GSList *photosets)
   g_slist_foreach (priv->photosets, (GFunc) g_object_unref, NULL);
   g_slist_free (priv->photosets);
 
-  priv->photosets = NULL;
-  if (photosets)
-    {
-      priv->photosets = g_slist_copy (photosets);
-      g_slist_foreach (priv->photosets, (GFunc) g_object_ref, NULL);
-    }
+  priv->photosets = photosets;
+  g_slist_foreach (priv->photosets, (GFunc) g_object_ref, NULL);
 }
 
 void
@@ -1138,12 +1134,8 @@ frogr_picture_set_groups (FrogrPicture *self, GSList *groups)
   g_slist_foreach (priv->groups, (GFunc) g_object_unref, NULL);
   g_slist_free (priv->groups);
 
-  priv->groups = NULL;
-  if (groups)
-    {
-      priv->groups = g_slist_copy (groups);
-      g_slist_foreach (priv->groups, (GFunc) g_object_ref, NULL);
-    }
+  priv->groups = groups;
+  g_slist_foreach (priv->groups, (GFunc) g_object_ref, NULL);
 }
 
 void
diff --git a/src/frogr-util.c b/src/frogr-util.c
index 8acc2e5..8dac1d4 100644
--- a/src/frogr-util.c
+++ b/src/frogr-util.c
@@ -162,6 +162,9 @@ _open_uris_with_app_info (GList *uris_list, GAppInfo *app_info)
       g_free (command);
       g_free (uris);
     }
+
+  g_list_foreach (uris_list, (GFunc) g_free, NULL);
+  g_list_free (uris_list);
 }
 
 void
@@ -184,9 +187,8 @@ frogr_util_open_uri (const gchar *uri)
     app_info = g_app_info_get_default_for_uri_scheme ("ghelp");
 #endif
 
-  uris_list = g_list_append (uris_list, (gchar *) uri);
+  uris_list = g_list_append (uris_list, g_strdup (uri));
   _open_uris_with_app_info (uris_list, app_info);
-  g_list_free (uris_list);
 }
 
 void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]