[Xfce4-commits] <tumbler:master> Add cancel capability to the thumbnail operations.

Jannis Pohlmann noreply at xfce.org
Wed Oct 14 12:50:01 CEST 2009


Updating branch refs/heads/master
         to b79b1e603cf47232b4fd0f36bb2b2deb1e9f64a6 (commit)
       from 66f251bbfbf0eb7b5a8e7e12ca0d4dfdcff0e245 (commit)

commit b79b1e603cf47232b4fd0f36bb2b2deb1e9f64a6
Author: Philip Van Hoof <philip at codeminded.be>
Date:   Wed Oct 14 11:06:21 2009 +0200

    Add cancel capability to the thumbnail operations.

 plugins/font-thumbnailer/font-thumbnailer.c     |    7 +++++--
 plugins/pixbuf-thumbnailer/pixbuf-thumbnailer.c |    8 ++++++--
 tumbler/tumbler-abstract-thumbnailer.c          |    5 ++++-
 tumbler/tumbler-abstract-thumbnailer.h          |    2 ++
 tumbler/tumbler-thumbnailer.c                   |    8 +++++---
 tumbler/tumbler-thumbnailer.h                   |    3 +++
 tumblerd/tumbler-group-scheduler.c              |   15 ++++++++++++---
 tumblerd/tumbler-lifo-scheduler.c               |   15 ++++++++++++---
 tumblerd/tumbler-naive-scheduler.c              |    4 +++-
 tumblerd/tumbler-scheduler.c                    |   13 +++++++++++++
 tumblerd/tumbler-scheduler.h                    |    2 ++
 tumblerd/tumbler-specialized-thumbnailer.c      |    2 ++
 12 files changed, 69 insertions(+), 15 deletions(-)

diff --git a/plugins/font-thumbnailer/font-thumbnailer.c b/plugins/font-thumbnailer/font-thumbnailer.c
index 958568e..d7a1f96 100644
--- a/plugins/font-thumbnailer/font-thumbnailer.c
+++ b/plugins/font-thumbnailer/font-thumbnailer.c
@@ -42,6 +42,7 @@
 
 static void font_thumbnailer_finalize (GObject                    *object);
 static void font_thumbnailer_create   (TumblerAbstractThumbnailer *thumbnailer,
+                                       GCancellable               *cancellable,
                                        const gchar                *uri,
                                        const gchar                *mime_hint);
 
@@ -434,6 +435,7 @@ generate_pixbuf (FT_Face                face,
 
 static void
 font_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
+                         GCancellable               *cancellable,
                          const gchar                *uri,
                          const gchar                *mime_hint)
 {
@@ -483,7 +485,7 @@ font_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
 
   /* try to read the file into memory */
   file = g_file_new_for_uri (uri);
-  if (!g_file_load_contents (file, NULL, &font_data, &length, NULL, &error))
+  if (!g_file_load_contents (file, cancellable, &font_data, &length, NULL, &error))
     {
       /* there was an error, emit error signal */
       error_msg = g_strdup_printf (_("Could not load file contents: %s"), 
@@ -604,7 +606,8 @@ font_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
 
             /* if an image for this flavor was generated, save it now */
             if (pixbuf != NULL)
-              tumbler_thumbnail_save_pixbuf (lp->data, pixbuf, mtime, NULL, &error);
+              tumbler_thumbnail_save_pixbuf (lp->data, pixbuf, mtime, 
+                                             cancellable, &error);
           }
     }
 
diff --git a/plugins/pixbuf-thumbnailer/pixbuf-thumbnailer.c b/plugins/pixbuf-thumbnailer/pixbuf-thumbnailer.c
index 109a375..06b1198 100644
--- a/plugins/pixbuf-thumbnailer/pixbuf-thumbnailer.c
+++ b/plugins/pixbuf-thumbnailer/pixbuf-thumbnailer.c
@@ -36,6 +36,7 @@
 
 
 static void pixbuf_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
+                                       GCancellable               *cancellable,
                                        const gchar                *uri,
                                        const gchar                *mime_hint);
 
@@ -140,6 +141,7 @@ generate_pixbuf (GdkPixbuf              *source,
 
 static void
 pixbuf_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
+                           GCancellable               *cancellable,
                            const gchar                *uri,
                            const gchar                *mime_hint)
 {
@@ -185,7 +187,8 @@ pixbuf_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
       return;
     }
 
-  source_pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (stream), NULL, &error);
+  source_pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (stream), 
+                                              cancellable, &error);
   g_object_unref (stream);
 
   if (source_pixbuf == NULL)
@@ -220,7 +223,8 @@ pixbuf_thumbnailer_create (TumblerAbstractThumbnailer *thumbnailer,
             pixbuf = g_hash_table_lookup (pixbufs, GINT_TO_POINTER (flavor));
 
             if (pixbuf != NULL)
-              tumbler_thumbnail_save_pixbuf (lp->data, pixbuf, mtime, NULL, &error);
+              tumbler_thumbnail_save_pixbuf (lp->data, pixbuf, mtime, 
+                                             cancellable, &error);
           }
     }
 
diff --git a/tumbler/tumbler-abstract-thumbnailer.c b/tumbler/tumbler-abstract-thumbnailer.c
index 36b0e05..535871f 100644
--- a/tumbler/tumbler-abstract-thumbnailer.c
+++ b/tumbler/tumbler-abstract-thumbnailer.c
@@ -57,6 +57,7 @@ static void tumbler_abstract_thumbnailer_set_property     (GObject
                                                            const GValue            *value,
                                                            GParamSpec              *pspec);
 static void tumbler_abstract_thumbnailer_create           (TumblerThumbnailer      *thumbnailer,
+                                                           GCancellable            *cancellable,
                                                            const gchar             *uri,
                                                            const gchar             *mime_hint);
 
@@ -233,6 +234,7 @@ tumbler_abstract_thumbnailer_set_property (GObject      *object,
 
 static void
 tumbler_abstract_thumbnailer_create (TumblerThumbnailer *thumbnailer,
+                                     GCancellable       *cancellable,
                                      const gchar        *uri,
                                      const gchar        *mime_hint)
 {
@@ -241,5 +243,6 @@ tumbler_abstract_thumbnailer_create (TumblerThumbnailer *thumbnailer,
   g_return_if_fail (TUMBLER_ABSTRACT_THUMBNAILER_GET_CLASS (thumbnailer)->create != NULL);
 
   TUMBLER_ABSTRACT_THUMBNAILER_GET_CLASS (thumbnailer)->create (TUMBLER_ABSTRACT_THUMBNAILER (thumbnailer),
-                                                                uri, mime_hint);
+                                                                cancellable, uri, 
+                                                                mime_hint);
 }
diff --git a/tumbler/tumbler-abstract-thumbnailer.h b/tumbler/tumbler-abstract-thumbnailer.h
index 5a12ade..69438d0 100644
--- a/tumbler/tumbler-abstract-thumbnailer.h
+++ b/tumbler/tumbler-abstract-thumbnailer.h
@@ -26,6 +26,7 @@
 #define __TUMBLER_ABSTRACT_THUMBNAILER_H__
 
 #include <glib-object.h>
+#include <gio/gio.h>
 
 G_BEGIN_DECLS;
 
@@ -46,6 +47,7 @@ struct _TumblerAbstractThumbnailerClass
 
   /* virtual methods */
   void (*create) (TumblerAbstractThumbnailer *thumbnailer,
+                  GCancellable               *cancellable,
                   const gchar                *uri,
                   const gchar                *mime_hint);
 };
diff --git a/tumbler/tumbler-thumbnailer.c b/tumbler/tumbler-thumbnailer.c
index 23d5f09..31dad95 100644
--- a/tumbler/tumbler-thumbnailer.c
+++ b/tumbler/tumbler-thumbnailer.c
@@ -136,9 +136,10 @@ tumbler_thumbnailer_class_init (TumblerThumbnailerIface *klass)
 
 
 void
-tumbler_thumbnailer_create (TumblerThumbnailer *thumbnailer,
-                            const gchar        *uri,
-                            const gchar        *mime_hint)
+tumbler_thumbnailer_create (TumblerThumbnailer      *thumbnailer,
+                            GCancellable            *cancellable,
+                            const gchar             *uri,
+                            const gchar             *mime_hint)
 {
   g_return_if_fail (TUMBLER_IS_THUMBNAILER (thumbnailer));
   g_return_if_fail (uri != NULL);
@@ -146,6 +147,7 @@ tumbler_thumbnailer_create (TumblerThumbnailer *thumbnailer,
   g_return_if_fail (TUMBLER_THUMBNAILER_GET_IFACE (thumbnailer)->create != NULL);
 
   return (*TUMBLER_THUMBNAILER_GET_IFACE (thumbnailer)->create) (thumbnailer, 
+                                                                 cancellable,
                                                                  uri, 
                                                                  mime_hint);
 }
diff --git a/tumbler/tumbler-thumbnailer.h b/tumbler/tumbler-thumbnailer.h
index e283a1d..5bcc1ef 100644
--- a/tumbler/tumbler-thumbnailer.h
+++ b/tumbler/tumbler-thumbnailer.h
@@ -26,6 +26,7 @@
 #define __TUMBLER_THUMBNAILER_H__
 
 #include <glib-object.h>
+#include <gio/gio.h>
 
 G_BEGIN_DECLS
 
@@ -52,6 +53,7 @@ struct _TumblerThumbnailerIface
 
   /* virtual methods */
   void (*create) (TumblerThumbnailer *thumbnailer,
+                  GCancellable       *cancellable,
                   const gchar        *uri,
                   const gchar        *mime_hint);
 };
@@ -59,6 +61,7 @@ struct _TumblerThumbnailerIface
 GType                tumbler_thumbnailer_get_type        (void) G_GNUC_CONST;
 
 void                 tumbler_thumbnailer_create          (TumblerThumbnailer  *thumbnailer,
+                                                          GCancellable        *cancellable,
                                                           const gchar         *uri,
                                                           const gchar         *mime_hint);
 
diff --git a/tumblerd/tumbler-group-scheduler.c b/tumblerd/tumbler-group-scheduler.c
index 3a29e77..9477519 100644
--- a/tumblerd/tumbler-group-scheduler.c
+++ b/tumblerd/tumbler-group-scheduler.c
@@ -305,13 +305,20 @@ tumbler_group_scheduler_unqueue_request (TumblerSchedulerRequest *request,
                                          gpointer                 user_data)
 {
   guint handle = GPOINTER_TO_UINT (user_data);
+  gint  n;
 
   g_return_if_fail (request != NULL);
   g_return_if_fail (handle != 0);
 
   /* mark the request as unqueued if the handles match */
-  if (request->handle == handle)
-    request->unqueued = TRUE;
+  if (request->handle == handle) 
+    {
+      request->unqueued = TRUE;
+
+      /* try cancel all thumbnails that are part of the request */
+      for (n = 0; n < request->length; ++n)
+        g_cancellable_cancel (request->cancellables[n]);
+  }
 }
 
 
@@ -520,7 +527,9 @@ tumbler_group_scheduler_thread (gpointer data,
                         &ready_uris);
 
       /* tell the thumbnailer to generate the thumbnail */
-      tumbler_thumbnailer_create (request->thumbnailers[n], request->uris[n], 
+      tumbler_thumbnailer_create (request->thumbnailers[n], 
+                                  request->cancellables[n],
+                                  request->uris[n], 
                                   request->mime_hints[n]);
 
       /* disconnect from all signals when we're finished */
diff --git a/tumblerd/tumbler-lifo-scheduler.c b/tumblerd/tumbler-lifo-scheduler.c
index 8865183..c9c01e4 100644
--- a/tumblerd/tumbler-lifo-scheduler.c
+++ b/tumblerd/tumbler-lifo-scheduler.c
@@ -281,13 +281,20 @@ tumbler_lifo_scheduler_unqueue_request (TumblerSchedulerRequest *request,
                                         gpointer                 user_data)
 {
   guint handle = GPOINTER_TO_UINT (user_data);
+  gint  n;
 
   g_return_if_fail (request != NULL);
   g_return_if_fail (handle != 0);
 
   /* mark the request as unqueued if the handles match */
-  if (request->handle == handle)
-    request->unqueued = TRUE;
+  if (request->handle == handle) 
+    {
+      request->unqueued = TRUE;
+
+      /* cancel all thumbnails that are part of the request */
+      for (n = 0; n < request->length; ++n)
+        g_cancellable_cancel (request->cancellables[n]);
+  }
 }
 
 
@@ -452,7 +459,9 @@ tumbler_lifo_scheduler_thread (gpointer data,
                         request);
 
       /* tell the thumbnailer to generate the thumbnail */
-      tumbler_thumbnailer_create (request->thumbnailers[n], request->uris[n], 
+      tumbler_thumbnailer_create (request->thumbnailers[n], 
+                                  request->cancellables[n],
+                                  request->uris[n], 
                                   request->mime_hints[n]);
 
       /* disconnect from all signals when we're finished */
diff --git a/tumblerd/tumbler-naive-scheduler.c b/tumblerd/tumbler-naive-scheduler.c
index 7919368..e8e0bcc 100644
--- a/tumblerd/tumbler-naive-scheduler.c
+++ b/tumblerd/tumbler-naive-scheduler.c
@@ -138,7 +138,9 @@ tumbler_naive_scheduler_push (TumblerScheduler        *scheduler,
                             request);
 
           /* tell the thumbnailer to generate the thumbnail */
-          tumbler_thumbnailer_create (request->thumbnailers[n], request->uris[n], 
+          tumbler_thumbnailer_create (request->thumbnailers[n], 
+                                      request->cancellables[n],
+                                      request->uris[n], 
                                       request->mime_hints[n]);
 
           /* disconnect from all signals when we're finished */
diff --git a/tumblerd/tumbler-scheduler.c b/tumblerd/tumbler-scheduler.c
index 043462b..4de245b 100644
--- a/tumblerd/tumbler-scheduler.c
+++ b/tumblerd/tumbler-scheduler.c
@@ -244,6 +244,7 @@ tumbler_scheduler_request_new (const GStrv          uris,
 {
   TumblerSchedulerRequest *request = NULL;
   static gint              handle  = 0;
+  gint                     n;
 
   g_return_val_if_fail (uris != NULL, NULL);
   g_return_val_if_fail (mime_hints != NULL, NULL);
@@ -257,6 +258,11 @@ tumbler_scheduler_request_new (const GStrv          uris,
   request->mime_hints = g_strdupv (mime_hints);
   request->thumbnailers = tumbler_thumbnailer_array_copy (thumbnailers, length);
   request->length = length;
+  request->cancellables = g_new0 (GCancellable *, request->length + 1);
+
+  for (n = 0; n < request->length; ++n)
+    request->cancellables[n] = g_cancellable_new ();
+  request->cancellables[n] = NULL;
 
   return request;
 }
@@ -266,6 +272,8 @@ tumbler_scheduler_request_new (const GStrv          uris,
 void
 tumbler_scheduler_request_free (TumblerSchedulerRequest *request)
 {
+  gint n;
+
   g_return_if_fail (request != NULL);
 
   g_strfreev (request->uris);
@@ -276,6 +284,11 @@ tumbler_scheduler_request_free (TumblerSchedulerRequest *request)
 
   tumbler_thumbnailer_array_free (request->thumbnailers, request->length);
 
+  for (n = 0; n < request->length; ++n)
+    g_object_unref (request->cancellables[n]);
+
+  g_free (request->cancellables);
+
   g_free (request);
 }
 
diff --git a/tumblerd/tumbler-scheduler.h b/tumblerd/tumbler-scheduler.h
index db5445e..5662b7d 100644
--- a/tumblerd/tumbler-scheduler.h
+++ b/tumblerd/tumbler-scheduler.h
@@ -21,6 +21,7 @@
 #ifndef __TUMBLER_SCHEDULER_H__
 #define __TUMBLER_SCHEDULER_H__
 
+#include <gio/gio.h>
 #include <tumbler/tumbler.h>
 
 G_BEGIN_DECLS
@@ -92,6 +93,7 @@ struct _TumblerSchedulerRequest
   GStrv                uris;
   guint                handle;
   gint                 length;
+  GCancellable       **cancellables;
 };
 
 G_END_DECLS
diff --git a/tumblerd/tumbler-specialized-thumbnailer.c b/tumblerd/tumbler-specialized-thumbnailer.c
index ca122a2..63ea663 100644
--- a/tumblerd/tumbler-specialized-thumbnailer.c
+++ b/tumblerd/tumbler-specialized-thumbnailer.c
@@ -59,6 +59,7 @@ static void tumbler_specialized_thumbnailer_set_property    (GObject
                                                              const GValue                  *value,
                                                              GParamSpec                    *pspec);
 static void tumbler_specialized_thumbnailer_create          (TumblerThumbnailer            *thumbnailer,
+                                                             GCancellable                  *cancellable,
                                                              const gchar                   *uri,
                                                              const gchar                   *mime_hint);
 static void tumbler_specialized_thumbnailer_proxy_ready     (DBusGProxy                    *proxy,
@@ -319,6 +320,7 @@ tumbler_specialized_thumbnailer_set_property (GObject      *object,
 
 static void
 tumbler_specialized_thumbnailer_create (TumblerThumbnailer *thumbnailer,
+                                        GCancellable       *cancellable,
                                         const gchar        *uri,
                                         const gchar        *mime_hint)
 {



More information about the Xfce4-commits mailing list