[Xfce4-commits] <ristretto:ristretto-0.0> Images can only be opened once

Stephan Arts noreply at xfce.org
Sun Oct 23 19:20:32 CEST 2011


Updating branch refs/heads/ristretto-0.0
         to 062b0f1f7443308430ec246387e3408a79a1e8d7 (commit)
       from 2366de5be112bf8a9883f40436ad6c0904bd9d34 (commit)

commit 062b0f1f7443308430ec246387e3408a79a1e8d7
Author: Stephan Arts <stephan at xfce.org>
Date:   Sat Sep 26 10:16:46 2009 +0200

    Images can only be opened once

 ChangeLog           |    6 +++++
 src/image_list.c    |   57 +++++++++++++++++++++++++++++++++++++-------------
 src/main_window.c   |   21 ++++++++++++++++++
 src/thumbnail_bar.c |    7 ++++++
 4 files changed, 76 insertions(+), 15 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 176c2e1..8aea31a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2009-09-26  Stephan Arts <stephan at xfce.org>
 
+	* src/main_window.c,
+	  src/image_list.c,
+	  src/thumbnailbar.c: Images can only be opened once
+
+2009-09-26  Stephan Arts <stephan at xfce.org>
+
 	* src/wallpaper_manager.h,
 	  src/wallpaper_manager.c,
 	  src/main_window.c,
diff --git a/src/image_list.c b/src/image_list.c
index 08eaebf..ac16f77 100644
--- a/src/image_list.c
+++ b/src/image_list.c
@@ -5,7 +5,8 @@
  *  it under the terms of the GNU General Public License as published by
  *  the Free Software Foundation; either version 2 of the License, or
  *  (at your option) any later version.
- * *  This program is distributed in the hope that it will be useful,
+ *
+ *  This program is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU Library General Public License for more details.
@@ -47,6 +48,8 @@ static gint
 cb_rstto_image_list_image_name_compare_func (RsttoImage *a, RsttoImage *b);
 static gint
 cb_rstto_image_list_exif_date_compare_func (RsttoImage *a, RsttoImage *b);
+static gint
+cb_rstto_image_list_file_compare_func (RsttoImage *a, GFile *file);
 
 static GObjectClass *parent_class = NULL;
 static GObjectClass *iter_parent_class = NULL;
@@ -181,26 +184,36 @@ rstto_image_list_new (void)
 gboolean
 rstto_image_list_add_file (RsttoImageList *image_list, GFile *file, GError **error)
 {
-    RsttoImage *image = rstto_image_new (file);
-    if (image)
-    {
-        image_list->priv->images = g_list_insert_sorted (image_list->priv->images, image, rstto_image_list_get_compare_func (image_list));
-        image_list->priv->n_images++;
+    RsttoImage *image = NULL;
+
+    GList *image_iter = g_list_find_custom (image_list->priv->images, file, (GCompareFunc)cb_rstto_image_list_file_compare_func);
 
-        g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_NEW_IMAGE], 0, image, NULL);
-        if (image_list->priv->n_images == 1)
+    if (!image_iter)
+    {
+        image = rstto_image_new (file);
+        if (image)
         {
-            /** TODO: update all iterators */
-            GSList *iter = image_list->priv->iterators;
-            while (iter)
+            image_list->priv->images = g_list_insert_sorted (image_list->priv->images, image, rstto_image_list_get_compare_func (image_list));
+            image_list->priv->n_images++;
+
+            g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_NEW_IMAGE], 0, image, NULL);
+            if (image_list->priv->n_images == 1)
             {
-                g_signal_emit (G_OBJECT (iter->data), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED], 0, NULL);
-                iter = g_slist_next (iter);
+                /** TODO: update all iterators */
+                GSList *iter = image_list->priv->iterators;
+                while (iter)
+                {
+                    g_signal_emit (G_OBJECT (iter->data), rstto_image_list_iter_signals[RSTTO_IMAGE_LIST_ITER_SIGNAL_CHANGED], 0, NULL);
+                    iter = g_slist_next (iter);
+                }
             }
+            return TRUE;
         }
-        return TRUE;
+        return FALSE;
     }
-    return FALSE;
+    g_signal_emit (G_OBJECT (image_list), rstto_image_list_signals[RSTTO_IMAGE_LIST_SIGNAL_NEW_IMAGE], 0, image_iter->data, NULL);
+
+    return TRUE;
 }
 
 gint
@@ -570,3 +583,17 @@ cb_rstto_image_list_exif_date_compare_func (RsttoImage *a, RsttoImage *b)
     g_object_unref (file_info_b);
     return result;
 }
+
+static gint
+cb_rstto_image_list_file_compare_func (RsttoImage *a, GFile *file)
+{
+    gchar *a_base = g_file_get_uri (rstto_image_get_file (a));  
+    gchar *b_base = g_file_get_uri (file);  
+    gint result = 0;
+
+    result = g_strcasecmp (a_base, b_base);
+
+    g_free (a_base);
+    g_free (b_base);
+    return result;
+}
diff --git a/src/main_window.c b/src/main_window.c
index a1615e5..e286b95 100644
--- a/src/main_window.c
+++ b/src/main_window.c
@@ -64,6 +64,7 @@ struct _RsttoMainWindowPriv
 
     guint show_fs_toolbar_timeout_id;
     gint window_save_geometry_timer_id;
+    gint open_image_timer_id;
     
     gboolean fs_toolbar_sticky;
 
@@ -138,6 +139,8 @@ rstto_main_window_get_property (GObject    *object,
 
 static gboolean
 rstto_window_save_geometry_timer (gpointer user_data);
+static gboolean
+rstto_window_open_image_timer(gpointer user_data);
 static void
 rstto_main_window_image_list_iter_changed (RsttoMainWindow *window);
 
@@ -1075,6 +1078,14 @@ rstto_window_save_geometry_timer (gpointer user_data)
     return FALSE;
 }
 
+static gboolean
+rstto_window_open_image_timer (gpointer user_data)
+{
+    RsttoMainWindow *window = RSTTO_MAIN_WINDOW (user_data);
+    window->priv->open_image_timer_id = 0;
+    return FALSE;
+}
+
 static void
 rstto_main_window_set_navigationbar_position (RsttoMainWindow *window, guint orientation)
 {
@@ -1601,6 +1612,16 @@ cb_rstto_main_window_image_list_new_image (RsttoImageList *image_list, RsttoImag
 {
     if (rstto_image_list_iter_get_position (window->priv->iter) == -1)
         rstto_image_list_iter_set_position (window->priv->iter, 0);
+    if (window->priv->open_image_timer_id > 0)
+    {
+        g_source_remove (window->priv->open_image_timer_id);
+    }
+    else
+    {
+        rstto_image_list_iter_find_image (window->priv->iter, image);
+    }
+    window->priv->open_image_timer_id = g_timeout_add (
+            1000, rstto_window_open_image_timer, window);
     rstto_main_window_image_list_iter_changed (window);
 }
 
diff --git a/src/thumbnail_bar.c b/src/thumbnail_bar.c
index fe1d22b..8711604 100644
--- a/src/thumbnail_bar.c
+++ b/src/thumbnail_bar.c
@@ -777,9 +777,16 @@ cb_rstto_thumbnail_bar_image_list_new_image (RsttoImageList *image_list, RsttoIm
 {
     RsttoThumbnailBar *bar = RSTTO_THUMBNAIL_BAR (user_data);
     GtkWidget *thumb;
+    GList *iter;
 
     g_return_if_fail (rstto_image_list_iter_find_image (bar->priv->internal_iter, image));
 
+    for (iter = bar->priv->thumbs; iter != NULL; iter = g_list_next (iter))
+    {
+        if (image == rstto_thumbnail_get_image (iter->data))
+            return;
+    }
+
     thumb = rstto_thumbnail_new (image);
 
     gtk_container_add (GTK_CONTAINER (bar), thumb);


More information about the Xfce4-commits mailing list