[gthumb/ext] use a common GCancellable object for all tasks
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext] use a common GCancellable object for all tasks
- Date: Sun, 4 Oct 2009 16:38:16 +0000 (UTC)
commit a264425aeeae3f5be6ab511824c7a70670990573
Author: Paolo Bacchilega <paobac src gnome org>
Date: Sun Oct 4 18:29:33 2009 +0200
use a common GCancellable object for all tasks
this avoids some code duplication
extensions/file_manager/gth-copy-task.c | 4 +-
extensions/file_manager/gth-delete-task.c | 21 +------
extensions/file_manager/gth-duplicate-task.c | 25 +-------
extensions/file_manager/gth-reorder-task.c | 4 +-
extensions/image_rotation/gth-transform-task.c | 19 +------
extensions/list_tools/gth-script-task.c | 27 ++++-----
extensions/photo_importer/gth-import-task.c | 21 ++-----
extensions/rename_series/gth-rename-task.c | 15 +----
extensions/search/gth-search-task.c | 17 ++----
gthumb/gth-async-task.c | 5 +-
gthumb/gth-browser.c | 2 +-
gthumb/gth-progress-dialog.c | 2 +-
gthumb/gth-task.c | 71 ++++++++++++++++++------
gthumb/gth-task.h | 54 +++++++++---------
14 files changed, 120 insertions(+), 167 deletions(-)
---
diff --git a/extensions/file_manager/gth-copy-task.c b/extensions/file_manager/gth-copy-task.c
index d9678c7..69c717d 100644
--- a/extensions/file_manager/gth-copy-task.c
+++ b/extensions/file_manager/gth-copy-task.c
@@ -104,7 +104,7 @@ gth_copy_task_exec (GthTask *task)
static void
-gth_copy_task_cancel (GthTask *task)
+gth_copy_task_cancelled (GthTask *task)
{
gth_file_source_cancel (GTH_COPY_TASK (task)->priv->file_source);
}
@@ -124,7 +124,7 @@ gth_copy_task_class_init (GthCopyTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_copy_task_exec;
- task_class->cancel = gth_copy_task_cancel;
+ task_class->cancelled = gth_copy_task_cancelled;
}
diff --git a/extensions/file_manager/gth-delete-task.c b/extensions/file_manager/gth-delete-task.c
index f35d856..0c56ff5 100644
--- a/extensions/file_manager/gth-delete-task.c
+++ b/extensions/file_manager/gth-delete-task.c
@@ -25,8 +25,7 @@
struct _GthDeleteTaskPrivate {
- GCancellable *cancellable;
- GList *file_list;
+ GList *file_list;
};
@@ -41,7 +40,6 @@ gth_delete_task_finalize (GObject *object)
self = GTH_DELETE_TASK (object);
_g_object_list_unref (self->priv->file_list);
- _g_object_unref (self->priv->cancellable);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -67,26 +65,13 @@ gth_delete_task_exec (GthTask *task)
_g_delete_files_async (self->priv->file_list,
TRUE,
TRUE,
- self->priv->cancellable,
+ gth_task_get_cancellable (task),
delete_ready_cb,
self);
}
static void
-gth_delete_task_cancel (GthTask *task)
-{
- GthDeleteTask *self;
-
- g_return_if_fail (GTH_IS_DELETE_TASK (task));
-
- self = GTH_DELETE_TASK (task);
-
- g_cancellable_cancel (self->priv->cancellable);
-}
-
-
-static void
gth_delete_task_class_init (GthDeleteTaskClass *klass)
{
GObjectClass *object_class;
@@ -100,7 +85,6 @@ gth_delete_task_class_init (GthDeleteTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_delete_task_exec;
- task_class->cancel = gth_delete_task_cancel;
}
@@ -108,7 +92,6 @@ static void
gth_delete_task_init (GthDeleteTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_DELETE_TASK, GthDeleteTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
}
diff --git a/extensions/file_manager/gth-duplicate-task.c b/extensions/file_manager/gth-duplicate-task.c
index b556915..39f6833 100644
--- a/extensions/file_manager/gth-duplicate-task.c
+++ b/extensions/file_manager/gth-duplicate-task.c
@@ -25,10 +25,9 @@
struct _GthDuplicateTaskPrivate {
- GCancellable *cancellable;
- GList *file_list;
- GList *current;
- int attempt;
+ GList *file_list;
+ GList *current;
+ int attempt;
};
@@ -43,7 +42,6 @@ gth_duplicate_task_finalize (GObject *object)
self = GTH_DUPLICATE_TASK (object);
_g_object_list_unref (self->priv->file_list);
- _g_object_unref (self->priv->cancellable);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -146,7 +144,7 @@ duplicate_current_file (GthDuplicateTask *self)
FALSE,
G_FILE_COPY_ALL_METADATA,
G_PRIORITY_DEFAULT,
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
copy_progress_cb,
self,
copy_dialog_cb,
@@ -174,19 +172,6 @@ gth_duplicate_task_exec (GthTask *task)
static void
-gth_duplicate_task_cancel (GthTask *task)
-{
- GthDuplicateTask *self;
-
- g_return_if_fail (GTH_IS_DUPLICATE_TASK (task));
-
- self = GTH_DUPLICATE_TASK (task);
-
- g_cancellable_cancel (self->priv->cancellable);
-}
-
-
-static void
gth_duplicate_task_class_init (GthDuplicateTaskClass *klass)
{
GObjectClass *object_class;
@@ -200,7 +185,6 @@ gth_duplicate_task_class_init (GthDuplicateTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_duplicate_task_exec;
- task_class->cancel = gth_duplicate_task_cancel;
}
@@ -208,7 +192,6 @@ static void
gth_duplicate_task_init (GthDuplicateTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_DUPLICATE_TASK, GthDuplicateTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
}
diff --git a/extensions/file_manager/gth-reorder-task.c b/extensions/file_manager/gth-reorder-task.c
index 2b5630f..011f4ef 100644
--- a/extensions/file_manager/gth-reorder-task.c
+++ b/extensions/file_manager/gth-reorder-task.c
@@ -78,7 +78,7 @@ gth_reorder_task_exec (GthTask *task)
static void
-gth_reorder_task_cancel (GthTask *task)
+gth_reorder_task_cancelled (GthTask *task)
{
gth_file_source_cancel (GTH_REORDER_TASK (task)->priv->file_source);
}
@@ -98,7 +98,7 @@ gth_reorder_task_class_init (GthReorderTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_reorder_task_exec;
- task_class->cancel = gth_reorder_task_cancel;
+ task_class->cancelled = gth_reorder_task_cancelled;
}
diff --git a/extensions/image_rotation/gth-transform-task.c b/extensions/image_rotation/gth-transform-task.c
index 3824409..f56dcaa 100644
--- a/extensions/image_rotation/gth-transform-task.c
+++ b/extensions/image_rotation/gth-transform-task.c
@@ -27,7 +27,6 @@
struct _GthTransformTaskPrivate {
GthBrowser *browser;
- GCancellable *cancellable;
GList *file_list;
GList *current;
GthTransform transform;
@@ -46,7 +45,6 @@ gth_transform_task_finalize (GObject *object)
self = GTH_TRANSFORM_TASK (object);
_g_object_list_unref (self->priv->file_list);
- _g_object_unref (self->priv->cancellable);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -138,7 +136,7 @@ transform_current_file (GthTransformTask *self)
apply_transformation_async (file_data,
self->priv->transform,
self->priv->default_action,
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
transform_file_ready_cb,
self);
}
@@ -159,19 +157,6 @@ gth_transform_task_exec (GthTask *task)
static void
-gth_transform_task_cancel (GthTask *task)
-{
- GthTransformTask *self;
-
- g_return_if_fail (GTH_IS_TRANSFORM_TASK (task));
-
- self = GTH_TRANSFORM_TASK (task);
-
- g_cancellable_cancel (self->priv->cancellable);
-}
-
-
-static void
gth_transform_task_class_init (GthTransformTaskClass *klass)
{
GObjectClass *object_class;
@@ -185,7 +170,6 @@ gth_transform_task_class_init (GthTransformTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_transform_task_exec;
- task_class->cancel = gth_transform_task_cancel;
}
@@ -193,7 +177,6 @@ static void
gth_transform_task_init (GthTransformTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_TRANSFORM_TASK, GthTransformTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
self->priv->default_action = JPEG_MCU_ACTION_ABORT; /* FIXME: save a gconf value for this */
}
diff --git a/extensions/list_tools/gth-script-task.c b/extensions/list_tools/gth-script-task.c
index 1535446..41870af 100644
--- a/extensions/list_tools/gth-script-task.c
+++ b/extensions/list_tools/gth-script-task.c
@@ -25,15 +25,14 @@
struct _GthScriptTaskPrivate {
- GthScript *script;
- GtkWindow *parent;
- GList *file_list;
- GList *current;
- int n_files;
- int n_current;
- GPid pid;
- guint script_watch;
- GCancellable *cancellable;
+ GthScript *script;
+ GtkWindow *parent;
+ GList *file_list;
+ GList *current;
+ int n_files;
+ int n_current;
+ GPid pid;
+ guint script_watch;
};
@@ -48,7 +47,6 @@ gth_script_task_finalize (GObject *object)
self = GTH_SCRIPT_TASK (object);
g_object_unref (self->priv->script);
- g_object_unref (self->priv->cancellable);
_g_object_list_unref (self->priv->file_list);
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -228,7 +226,7 @@ gth_script_task_exec (GthTask *task)
if (attributes != NULL) {
_g_query_metadata_async (self->priv->file_list,
attributes,
- self->priv->cancellable,
+ gth_task_get_cancellable (task),
file_info_ready_cb,
self);
g_free (attributes);
@@ -239,7 +237,7 @@ gth_script_task_exec (GthTask *task)
static void
-gth_script_task_cancel (GthTask *task)
+gth_script_task_cancelled (GthTask *task)
{
GthScriptTask *self;
@@ -249,8 +247,6 @@ gth_script_task_cancel (GthTask *task)
if (self->priv->pid != 0)
kill (self->priv->pid, SIGTERM);
- else
- g_cancellable_cancel (self->priv->cancellable);
}
@@ -268,7 +264,7 @@ gth_script_task_class_init (GthScriptTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_script_task_exec;
- task_class->cancel = gth_script_task_cancel;
+ task_class->cancelled = gth_script_task_cancelled;
}
@@ -276,7 +272,6 @@ static void
gth_script_task_init (GthScriptTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_SCRIPT_TASK, GthScriptTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
self->priv->pid = 0;
}
diff --git a/extensions/photo_importer/gth-import-task.c b/extensions/photo_importer/gth-import-task.c
index 1048114..cfbe015 100644
--- a/extensions/photo_importer/gth-import-task.c
+++ b/extensions/photo_importer/gth-import-task.c
@@ -35,7 +35,6 @@ struct _GthImportTaskPrivate {
char **tags;
gboolean delete_imported;
gboolean adjust_orientation;
- GCancellable *cancellable;
gsize tot_size;
gsize copied_size;
@@ -62,7 +61,6 @@ gth_import_task_finalize (GObject *object)
g_object_unref (self->priv->destination);
_g_object_unref (self->priv->destination_file);
g_strfreev (self->priv->tags);
- g_object_unref (self->priv->cancellable);
g_object_unref (self->priv->browser);
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -112,7 +110,7 @@ transformation_ready_cb (GError *error,
file_list = g_list_prepend (NULL, self->priv->destination_file);
_g_write_metadata_async (file_list,
"comment::categories",
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
write_metadata_ready_func,
self);
@@ -154,7 +152,7 @@ copy_ready_cb (GError *error,
apply_transformation_async (self->priv->destination_file,
(GthTransform) transform,
JPEG_MCU_ACTION_ABORT,
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
transformation_ready_cb,
self);
appling_tranformation = TRUE;
@@ -232,7 +230,7 @@ file_info_ready_cb (GList *files,
self->priv->subfolder_type,
self->priv->subfolder_format,
self->priv->single_subfolder);
- if (! g_file_make_directory_with_parents (destination, self->priv->cancellable, &error)) {
+ if (! g_file_make_directory_with_parents (destination, gth_task_get_cancellable (GTH_TASK (self)), &error)) {
if (! g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS)) {
gth_task_completed (GTH_TASK (self), error);
return;
@@ -248,7 +246,7 @@ file_info_ready_cb (GList *files,
self->priv->delete_imported,
G_FILE_COPY_ALL_METADATA | G_FILE_COPY_TARGET_DEFAULT_PERMS,
G_PRIORITY_DEFAULT,
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
copy_progress_cb,
self,
copy_dialog_cb,
@@ -277,7 +275,7 @@ import_current_file (GthImportTask *self)
list = g_list_prepend (NULL, file_data);
_g_query_metadata_async (list,
"Exif::Image::DateTime,Exif::Image::Orientation",
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
file_info_ready_cb,
self);
@@ -303,13 +301,6 @@ gth_import_task_exec (GthTask *base)
static void
-gth_import_task_cancel (GthTask *base)
-{
- g_cancellable_cancel (GTH_IMPORT_TASK (base)->priv->cancellable);
-}
-
-
-static void
gth_import_task_class_init (GthImportTaskClass *klass)
{
GObjectClass *object_class;
@@ -323,7 +314,6 @@ gth_import_task_class_init (GthImportTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_import_task_exec;
- task_class->cancel = gth_import_task_cancel;
}
@@ -331,7 +321,6 @@ static void
gth_import_task_init (GthImportTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_IMPORT_TASK, GthImportTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
}
diff --git a/extensions/rename_series/gth-rename-task.c b/extensions/rename_series/gth-rename-task.c
index 57c4266..2569b00 100644
--- a/extensions/rename_series/gth-rename-task.c
+++ b/extensions/rename_series/gth-rename-task.c
@@ -33,7 +33,6 @@ struct _GthRenameTaskPrivate {
int n_current;
GFile *source;
GFile *destination;
- GCancellable *cancellable;
GthOverwriteResponse default_response;
};
@@ -48,7 +47,6 @@ gth_rename_task_finalize (GObject *object)
self = GTH_RENAME_TASK (object);
- g_object_unref (self->priv->cancellable);
_g_object_unref (self->priv->source);
_g_object_unref (self->priv->destination);
_g_object_list_unref (self->priv->old_files);
@@ -140,7 +138,7 @@ _gth_rename_task_try_rename (GthRenameTask *self,
char *details;
GError *error = NULL;
- if (g_cancellable_set_error_if_cancelled (self->priv->cancellable, &error)) {
+ if (g_cancellable_set_error_if_cancelled (gth_task_get_cancellable (GTH_TASK (self)), &error)) {
gth_task_completed (GTH_TASK (self), error);
return;
}
@@ -171,7 +169,7 @@ _gth_rename_task_try_rename (GthRenameTask *self,
if (! _g_move_file (source,
destination,
G_FILE_COPY_ALL_METADATA | copy_flags,
- self->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (self)),
NULL,
NULL,
&error))
@@ -229,13 +227,6 @@ gth_rename_task_exec (GthTask *task)
static void
-gth_rename_task_cancel (GthTask *task)
-{
- g_cancellable_cancel (GTH_RENAME_TASK (task)->priv->cancellable);
-}
-
-
-static void
gth_rename_task_class_init (GthRenameTaskClass *klass)
{
GObjectClass *object_class;
@@ -249,7 +240,6 @@ gth_rename_task_class_init (GthRenameTaskClass *klass)
task_class = GTH_TASK_CLASS (klass);
task_class->exec = gth_rename_task_exec;
- task_class->cancel = gth_rename_task_cancel;
}
@@ -257,7 +247,6 @@ static void
gth_rename_task_init (GthRenameTask *self)
{
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_RENAME_TASK, GthRenameTaskPrivate);
- self->priv->cancellable = g_cancellable_new ();
self->priv->default_response = GTH_OVERWRITE_RESPONSE_UNSPECIFIED;
}
diff --git a/extensions/search/gth-search-task.c b/extensions/search/gth-search-task.c
index c319050..107ed90 100644
--- a/extensions/search/gth-search-task.c
+++ b/extensions/search/gth-search-task.c
@@ -34,7 +34,6 @@ struct _GthSearchTaskPrivate
GthSearch *search;
GthTestChain *test;
GFile *search_catalog;
- GCancellable *cancellable;
gboolean io_operation;
GError *error;
gulong location_ready_id;
@@ -61,7 +60,6 @@ gth_task_finalize (GObject *object)
task = GTH_SEARCH_TASK (object);
if (task->priv != NULL) {
- g_object_unref (task->priv->cancellable);
g_object_unref (task->priv->search);
g_object_unref (task->priv->test);
g_object_unref (task->priv->search_catalog);
@@ -175,7 +173,7 @@ done_func (GError *error,
data,
size,
G_PRIORITY_DEFAULT,
- task->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (task)),
save_search_result_copy_done_cb,
task);
@@ -298,7 +296,7 @@ browser_location_ready_cb (GthBrowser *browser,
gth_search_is_recursive (task->priv->search),
TRUE,
eel_gconf_get_boolean (PREF_FAST_FILE_TYPE, TRUE) ? GFILE_STANDARD_ATTRIBUTES_WITH_FAST_CONTENT_TYPE : GFILE_STANDARD_ATTRIBUTES_WITH_CONTENT_TYPE,
- task->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (task)),
start_dir_func,
for_each_file_func,
done_func,
@@ -350,7 +348,7 @@ gth_search_task_exec (GthTask *base)
data,
size,
G_PRIORITY_DEFAULT,
- task->priv->cancellable,
+ gth_task_get_cancellable (GTH_TASK (task)),
clear_search_result_copy_done_cb,
task);
@@ -360,11 +358,9 @@ gth_search_task_exec (GthTask *base)
static void
-gth_search_task_cancel (GthTask *task)
+gth_search_task_cancelled (GthTask *task)
{
- if (GTH_SEARCH_TASK (task)->priv->io_operation)
- g_cancellable_cancel (GTH_SEARCH_TASK (task)->priv->cancellable);
- else
+ if (! GTH_SEARCH_TASK (task)->priv->io_operation)
gth_task_completed (task, g_error_new_literal (GTH_TASK_ERROR, GTH_TASK_ERROR_CANCELLED, ""));
}
@@ -382,7 +378,7 @@ gth_search_task_class_init (GthSearchTaskClass *class)
task_class = (GthTaskClass*) class;
task_class->exec = gth_search_task_exec;
- task_class->cancel = gth_search_task_cancel;
+ task_class->cancelled = gth_search_task_cancelled;
}
@@ -390,7 +386,6 @@ static void
gth_search_task_init (GthSearchTask *task)
{
task->priv = g_new0 (GthSearchTaskPrivate, 1);
- task->priv->cancellable = g_cancellable_new ();
}
diff --git a/gthumb/gth-async-task.c b/gthumb/gth-async-task.c
index e0291df..fd6dec3 100644
--- a/gthumb/gth-async-task.c
+++ b/gthumb/gth-async-task.c
@@ -142,7 +142,7 @@ gth_async_task_exec (GthTask *task)
static void
-gth_async_task_cancel (GthTask *task)
+gth_async_task_cancelled (GthTask *task)
{
GthAsyncTask *self;
@@ -225,8 +225,7 @@ gth_async_task_class_init (GthAsyncTaskClass *class)
task_class = GTH_TASK_CLASS (class);
task_class->exec = gth_async_task_exec;
- task_class->cancel = gth_async_task_cancel;
-
+ task_class->cancelled = gth_async_task_cancelled;
g_object_class_install_property (object_class,
PROP_BEFORE_THREAD,
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 7d1cf91..551716d 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -3922,7 +3922,7 @@ gth_browser_exec_task (GthBrowser *browser,
browser);
browser->priv->activity_ref++;
gth_browser_update_sensitivity (browser);
- gth_task_exec (browser->priv->task);
+ gth_task_exec (browser->priv->task, NULL);
}
diff --git a/gthumb/gth-progress-dialog.c b/gthumb/gth-progress-dialog.c
index 9bc2431..8b68683 100644
--- a/gthumb/gth-progress-dialog.c
+++ b/gthumb/gth-progress-dialog.c
@@ -384,7 +384,7 @@ gth_progress_dialog_add_task (GthProgressDialog *self,
child = gth_task_progress_new (task);
gtk_widget_show (child);
gtk_box_pack_start (GTK_BOX (self->priv->task_box), child, TRUE, TRUE, 0);
- gth_task_exec (task);
+ gth_task_exec (task, NULL);
if (self->priv->show_event == 0)
self->priv->show_event = g_timeout_add (SHOW_DELAY, _show_dialog_cb, self);
diff --git a/gthumb/gth-task.c b/gthumb/gth-task.c
index 50644bb..e101b28 100644
--- a/gthumb/gth-task.c
+++ b/gthumb/gth-task.c
@@ -22,6 +22,7 @@
#include <config.h>
#include <glib.h>
+#include "glib-utils.h"
#include "gth-marshal.h"
#include "gth-task.h"
@@ -36,7 +37,9 @@ enum {
struct _GthTaskPrivate
{
- gboolean running;
+ gboolean running;
+ GCancellable *cancellable;
+ gulong cancellable_cancelled;
};
@@ -58,9 +61,9 @@ gth_task_finalize (GObject *object)
task = GTH_TASK (object);
- if (task->priv != NULL) {
- g_free (task->priv);
- task->priv = NULL;
+ if (task->priv->cancellable != NULL) {
+ g_signal_handler_disconnect (task->priv->cancellable, task->priv->cancellable_cancelled);
+ g_object_unref (task->priv->cancellable);
}
G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -70,14 +73,14 @@ gth_task_finalize (GObject *object)
static void
base_exec (GthTask *task)
{
- gth_task_completed (task, NULL);
+ /*gth_task_completed (task, NULL);*/
}
static void
-base_cancel (GthTask *task)
+base_cancelled (GthTask *task)
{
- gth_task_completed (task, g_error_new_literal (GTH_TASK_ERROR, GTH_TASK_ERROR_CANCELLED, ""));
+ /*gth_task_completed (task, g_error_new_literal (GTH_TASK_ERROR, GTH_TASK_ERROR_CANCELLED, ""));*/
}
@@ -87,12 +90,13 @@ gth_task_class_init (GthTaskClass *class)
GObjectClass *object_class;
parent_class = g_type_class_peek_parent (class);
- object_class = (GObjectClass*) class;
+ g_type_class_add_private (class, sizeof (GthTaskPrivate));
+ object_class = (GObjectClass*) class;
object_class->finalize = gth_task_finalize;
class->exec = base_exec;
- class->cancel = base_cancel;
+ class->cancelled = base_cancelled;
/* signals */
@@ -135,10 +139,12 @@ gth_task_class_init (GthTaskClass *class)
static void
-gth_task_init (GthTask *task)
+gth_task_init (GthTask *self)
{
- task->priv = g_new0 (GthTaskPrivate, 1);
- task->priv->running = FALSE;
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTH_TYPE_TASK, GthTaskPrivate);
+ self->priv->running = FALSE;
+ self->priv->cancellable = NULL;
+ self->priv->cancellable_cancelled = 0;
}
@@ -170,16 +176,36 @@ gth_task_get_type (void)
}
-GthTask *
-gth_task_new (void)
+static void
+cancellable_cancelled_cb (GCancellable *cancellable,
+ gpointer user_data)
{
- return (GthTask*) g_object_new (GTH_TYPE_TASK, NULL);
+ GthTask *task = user_data;
+
+ GTH_TASK_GET_CLASS (task)->cancelled (task);
}
void
-gth_task_exec (GthTask *task)
+gth_task_exec (GthTask *task,
+ GCancellable *cancellable)
{
+ if (task->priv->running)
+ return;
+
+ if (task->priv->cancellable != NULL) {
+ g_signal_handler_disconnect (task->priv->cancellable, task->priv->cancellable_cancelled);
+ g_object_unref (task->priv->cancellable);
+ }
+
+ if (cancellable != NULL)
+ task->priv->cancellable = _g_object_ref (cancellable);
+ else
+ task->priv->cancellable = g_cancellable_new ();
+ task->priv->cancellable_cancelled = g_signal_connect (task->priv->cancellable,
+ "cancelled",
+ G_CALLBACK (cancellable_cancelled_cb),
+ task);
task->priv->running = TRUE;
GTH_TASK_GET_CLASS (task)->exec (task);
}
@@ -195,8 +221,17 @@ gth_task_is_running (GthTask *task)
void
gth_task_cancel (GthTask *task)
{
- if (task->priv->running)
- GTH_TASK_GET_CLASS (task)->cancel (task);
+ if (task->priv->cancellable != NULL)
+ g_cancellable_cancel (task->priv->cancellable);
+ else
+ cancellable_cancelled_cb (NULL, task);
+}
+
+
+GCancellable *
+gth_task_get_cancellable (GthTask *task)
+{
+ return task->priv->cancellable;
}
diff --git a/gthumb/gth-task.h b/gthumb/gth-task.h
index ee67ea2..0a9cfa9 100644
--- a/gthumb/gth-task.h
+++ b/gthumb/gth-task.h
@@ -24,6 +24,7 @@
#define GTH_TASK_H
#include <glib-object.h>
+#include <gio/gio.h>
G_BEGIN_DECLS
@@ -58,38 +59,39 @@ struct _GthTaskClass
/*< signals >*/
- void (*completed) (GthTask *task,
- GError *error);
- void (*progress) (GthTask *task,
- const char *description,
- const char *details,
- gboolean pulse,
- double fraction);
- void (*dialog) (GthTask *task,
- gboolean opened);
+ void (*completed) (GthTask *task,
+ GError *error);
+ void (*progress) (GthTask *task,
+ const char *description,
+ const char *details,
+ gboolean pulse,
+ double fraction);
+ void (*dialog) (GthTask *task,
+ gboolean opened);
/*< virtual functions >*/
void (*exec) (GthTask *task);
- void (*cancel) (GthTask *task);
+ void (*cancelled) (GthTask *task);
};
-GQuark gth_task_error_quark (void);
-
-GType gth_task_get_type (void) G_GNUC_CONST;
-GthTask * gth_task_new (void);
-void gth_task_exec (GthTask *task);
-gboolean gth_task_is_running (GthTask *task);
-void gth_task_cancel (GthTask *task);
-void gth_task_completed (GthTask *task,
- GError *error);
-void gth_task_dialog (GthTask *task,
- gboolean opened);
-void gth_task_progress (GthTask *task,
- const char *description,
- const char *details,
- gboolean pulse,
- double fraction);
+GQuark gth_task_error_quark (void);
+
+GType gth_task_get_type (void) G_GNUC_CONST;
+void gth_task_exec (GthTask *task,
+ GCancellable *cancellable);
+gboolean gth_task_is_running (GthTask *task);
+void gth_task_cancel (GthTask *task);
+GCancellable * gth_task_get_cancellable (GthTask *task);
+void gth_task_completed (GthTask *task,
+ GError *error);
+void gth_task_dialog (GthTask *task,
+ gboolean opened);
+void gth_task_progress (GthTask *task,
+ const char *description,
+ const char *details,
+ gboolean pulse,
+ double fraction);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]