[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