[gthumb/ext] use a common GCancellable object for all tasks



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]