[Xfce4-commits] <ristretto:master> Fix memory leak and improve thumbnailing performance

Stephan Arts noreply at xfce.org
Wed Feb 22 17:52:01 CET 2012


Updating branch refs/heads/master
         to 3fe1a1a2fa0eebc7c443d80316de1ad695cb2f75 (commit)
       from 6d1c8e9e08f86d0b206ce86f899c8b89ed4e239e (commit)

commit 3fe1a1a2fa0eebc7c443d80316de1ad695cb2f75
Author: Stephan Arts <stephan at xfce.org>
Date:   Wed Feb 22 17:50:31 2012 +0100

    Fix memory leak and improve thumbnailing performance

 src/file.c        |   13 ++++++++
 src/icon_bar.c    |   87 ++++++++++++++++-------------------------------------
 src/thumbnailer.c |   31 +++++++++++-------
 3 files changed, 58 insertions(+), 73 deletions(-)

diff --git a/src/file.c b/src/file.c
index 13e5df3..4cc68ad 100644
--- a/src/file.c
+++ b/src/file.c
@@ -28,6 +28,7 @@
 
 #include "util.h"
 #include "file.h"
+#include "thumbnailer.h"
 
 static void
 rstto_file_init (GObject *);
@@ -454,12 +455,22 @@ const GdkPixbuf *
 rstto_file_get_thumbnail ( RsttoFile *file , RsttoThumbnailSize size)
 {
     const gchar *thumbnail_path;
+    RsttoThumbnailer *thumbnailer;
 
     if (file->priv->thumbnails[size])
         return file->priv->thumbnails[size];
 
     thumbnail_path = rstto_file_get_thumbnail_path (file);
 
+    thumbnailer = rstto_thumbnailer_new();
+    rstto_thumbnailer_queue_file (thumbnailer, file);
+
+    /* FIXME:
+     *
+     * The thumbnail should be updated on the "ready" signal
+     * of the thumbnailer, to account for changed thumbnails
+     * aswell as missing ones.
+     */
     file->priv->thumbnails[size] = gdk_pixbuf_new_from_file_at_scale (
             thumbnail_path,
             rstto_thumbnail_size[size],
@@ -467,5 +478,7 @@ rstto_file_get_thumbnail ( RsttoFile *file , RsttoThumbnailSize size)
             TRUE,
             NULL);
 
+    g_object_unref (thumbnailer);
+
     return file->priv->thumbnails[size];
 }
diff --git a/src/icon_bar.c b/src/icon_bar.c
index 500ea2e..3d6eca2 100644
--- a/src/icon_bar.c
+++ b/src/icon_bar.c
@@ -1,7 +1,9 @@
 /*-
  * Copyright (c) 2004-2006 os-cillation e.K.
+ * Copyright (c) 2012 Stephan Arts <stephan at xfce.org>
  *
  * Written by Benedikt Meurer <benny at xfce.org>.
+ * Modified by Stephan Arts <stephan at xfce.org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -38,65 +40,18 @@
 #include "marshal.h"
 #include "icon_bar.h"
 
-/**
- * SECTION: rstto-icon-bar
- * @title: RsttoIconBar
- * @short_description: A widget for displaying icon bars
- * @include: rstto/rstto.h
- * @see_also: <ulink url="http://library.gnome.org/devel/gtk/stable/GtkTreeModel.html">
- *            GtkTreeModel</ulink>,
- *            <ulink url="http://library.gnome.org/devel/gtk/stable/TreeWidget.html">
- *            Tree and List Widget Overview</ulink>
- *
- * A widget that displays any object that implements the #GtkTreeModel interface
- * in an icon bar.
- *
- * <example>
- * <title>
- *   Creating a new <structname>RsttoIconBar</structname> with a <structname>GtkListStore</structname>
- * </title>
- * <programlisting>
- * enum
- * {
- *   PIXBUF_COLUMN,
- *   STRING_COLUMN,
- *   N_COLUMNS,
- * };
- *
- * {
- *   GtkListStore *store;
- *   GtkWidget    *bar;
- *
- *   // make a new list store
- *   store = gtk_list_store_new (N_COLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING);
- *
- *   // fill the store with data
- *   fill_store (store);
- *
- *   // create the icon bar
- *   bar = rstto_icon_bar_new_with_model (GTK_TREE_MODEL (store));
- *   rstto_icon_bar_set_pixbuf_column (RSTTO_ICON_BAR (bar), PIXBUF_COLUMN);
- *   rstto_icon_bar_set_file_column (RSTTO_ICON_BAR (bar), FILE_COLUMN);
- *   gtk_widget_show (bar);
- *
- *   // the icon bar keeps a reference on the store now
- *   g_object_unref (G_OBJECT (store));
- *
- *   // add the bar to your GUI now...
- * }
- * </programlisting>
- * </example>
- **/
-
-
-
 #define MINIMUM_ICON_ITEM_WIDTH 32
 #define ICON_TEXT_PADDING 1
 
-#define RSTTO_ICON_BAR_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), RSTTO_TYPE_ICON_BAR, RsttoIconBarPrivate))
+#define RSTTO_ICON_BAR_GET_PRIVATE(obj) ( \
+            G_TYPE_INSTANCE_GET_PRIVATE ( \
+                    (obj), \
+                    RSTTO_TYPE_ICON_BAR, \
+                    RsttoIconBarPrivate))
 
-#define RSTTO_ICON_BAR_VALID_MODEL_AND_COLUMNS(obj) ((obj)->priv->model != NULL && \
-        (obj)->priv->file_column != -1)
+#define RSTTO_ICON_BAR_VALID_MODEL_AND_COLUMNS(obj) \
+            ((obj)->priv->model != NULL && \
+            (obj)->priv->file_column != -1)
 
 
 
@@ -879,7 +834,11 @@ rstto_icon_bar_size_allocate (
         if (icon_bar->priv->auto_center == TRUE)
         {
             if (icon_bar->priv->active_item)
-                value = icon_bar->priv->active_item->index * icon_bar->priv->item_height - ((page_size-icon_bar->priv->item_height)/2);
+            {
+                value = icon_bar->priv->active_item->index * icon_bar->priv->item_height;// - ((page_size-icon_bar->priv->item_height)/2);
+                g_debug("V: %f", value);
+            }
+		
 
             if (value > (gtk_adjustment_get_upper (icon_bar->priv->vadjustment)-page_size))
                 value = (gtk_adjustment_get_upper (icon_bar->priv->vadjustment)-page_size);
@@ -967,19 +926,19 @@ rstto_icon_bar_expose (
         area.width = icon_bar->priv->item_width;
         area.height = icon_bar->priv->item_height;
 
-        iter = item->iter;
-        gtk_tree_model_get (icon_bar->priv->model, &iter,
-                icon_bar->priv->file_column, &file,
-                -1);
 
         if (gdk_region_rect_in (expose->region, &area) != GDK_OVERLAP_RECTANGLE_OUT)
         {
-            rstto_thumbnailer_queue_file (icon_bar->priv->thumbnailer, file);
             rstto_icon_bar_paint_item (icon_bar, item, &expose->area);
         }
         else
         {
+            iter = item->iter;
+            gtk_tree_model_get (icon_bar->priv->model, &iter,
+                    icon_bar->priv->file_column, &file,
+                    -1);
             rstto_thumbnailer_dequeue_file (icon_bar->priv->thumbnailer, file);
+            g_object_unref (file);
         }
     }
 
@@ -1029,6 +988,7 @@ rstto_icon_bar_motion (
         gtk_tree_model_get (icon_bar->priv->model, &iter,
                 icon_bar->priv->file_column, &file,
                 -1);
+        g_object_unref (file);
 
         gtk_widget_trigger_tooltip_query (widget);
     }
@@ -1302,6 +1262,8 @@ rstto_icon_bar_paint_item (
     
     pixbuf = rstto_file_get_thumbnail (file, icon_bar->priv->thumbnail_size);
 
+    g_object_unref (file);
+
     if (NULL == pixbuf)
     {
         pixbuf = thumbnail_missing;
@@ -2175,6 +2137,7 @@ cb_rstto_thumbnail_size_changed (
 {
     GValue val_thumbnail_size = { 0, };
     RsttoIconBar *icon_bar = RSTTO_ICON_BAR (user_data);
+    gboolean auto_center = icon_bar->priv->auto_center;
 
     g_value_init (&val_thumbnail_size, G_TYPE_UINT);
 
@@ -2183,11 +2146,13 @@ cb_rstto_thumbnail_size_changed (
             "thumbnail-size",
             &val_thumbnail_size);
 
+
     icon_bar->priv->thumbnail_size = g_value_get_uint (&val_thumbnail_size);
 
     rstto_icon_bar_invalidate (icon_bar);
 
     rstto_icon_bar_update_missing_icon (icon_bar);
+    icon_bar->priv->auto_center = auto_center;
 }
 
 
diff --git a/src/thumbnailer.c b/src/thumbnailer.c
index 01f69d7..06d4312 100644
--- a/src/thumbnailer.c
+++ b/src/thumbnailer.c
@@ -359,17 +359,21 @@ rstto_thumbnailer_dequeue_file (
     if (thumbnailer->priv->request_timer_id)
     {
         g_source_remove (thumbnailer->priv->request_timer_id);
-        if (thumbnailer->priv->handle)
+    }
+
+    if (thumbnailer->priv->handle)
+    {
+        if(dbus_g_proxy_call(thumbnailer->priv->proxy,
+                "Dequeue",
+                NULL,
+                G_TYPE_UINT, thumbnailer->priv->handle,
+                G_TYPE_INVALID) == FALSE)
         {
-            if(dbus_g_proxy_call(thumbnailer->priv->proxy,
-                    "Dequeue",
-                    NULL,
-                    G_TYPE_UINT, thumbnailer->priv->handle,
-                    G_TYPE_INVALID) == FALSE)
-            {
-            }
-            thumbnailer->priv->handle = 0;
         }
+        thumbnailer->priv->handle = 0;
+        g_slist_foreach (thumbnailer->priv->in_process_queue, (GFunc)g_object_unref, NULL);
+        g_slist_free (thumbnailer->priv->in_process_queue);
+        thumbnailer->priv->in_process_queue = NULL;
     }
 
     if (g_slist_find (thumbnailer->priv->queue, file) != NULL)
@@ -502,9 +506,12 @@ cb_rstto_thumbnailer_request_finished (
 
     g_return_if_fail ( RSTTO_IS_THUMBNAILER (thumbnailer) );
 
-    g_slist_foreach (thumbnailer->priv->in_process_queue, (GFunc)g_object_unref, NULL);
-    g_slist_free (thumbnailer->priv->in_process_queue);
-    thumbnailer->priv->in_process_queue = NULL;
+    if (thumbnailer->priv->in_process_queue)
+    {
+        g_slist_foreach (thumbnailer->priv->in_process_queue, (GFunc)g_object_unref, NULL);
+        g_slist_free (thumbnailer->priv->in_process_queue);
+        thumbnailer->priv->in_process_queue = NULL;
+    }
 }
 
 static void


More information about the Xfce4-commits mailing list