[gthumb] allow to keep browsing while executing long-running external tools



commit fea9086a23397f61afa327f725170d534dbad8d1
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Wed Apr 21 10:34:39 2021 +0200

    allow to keep browsing while executing long-running external tools
    
    Only close viewer-related tasks when closing the viewer.

 extensions/image_viewer/gth-image-viewer-page.c |  1 +
 extensions/image_viewer/gth-image-viewer-task.c |  1 +
 gthumb/gth-browser.c                            | 16 +++++++++---
 gthumb/gth-image-task-chain.c                   |  1 +
 gthumb/gth-image-task.c                         |  1 +
 gthumb/gth-task.c                               | 33 ++++++++++++++++++++++++-
 gthumb/gth-task.h                               |  3 +++
 7 files changed, 51 insertions(+), 5 deletions(-)
---
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 2940c781..cbc1213d 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -2547,6 +2547,7 @@ static void
 gth_original_image_task_init (GthOriginalImageTask *self)
 {
        self->viewer_page = NULL;
+       gth_task_set_for_viewer (GTH_TASK (self), TRUE);
 }
 
 
diff --git a/extensions/image_viewer/gth-image-viewer-task.c b/extensions/image_viewer/gth-image-viewer-task.c
index a4947624..eb0f1a08 100644
--- a/extensions/image_viewer/gth-image-viewer-task.c
+++ b/extensions/image_viewer/gth-image-viewer-task.c
@@ -138,6 +138,7 @@ gth_image_viewer_task_init (GthImageViewerTask *self)
        self->priv->original_image_task = NULL;
        self->priv->load_original = TRUE;
        self->priv->loading_image = FALSE;
+       gth_task_set_for_viewer (GTH_TASK (self), TRUE);
 }
 
 
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 871c9d49..f0fc5108 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -165,6 +165,7 @@ struct _GthBrowserPrivate {
        gulong             task_completed;
        gulong             task_progress;
        GList             *background_tasks;
+       GList             *viewer_tasks;
        gboolean           close_with_task;
        GList             *load_data_queue;
        gpointer           last_folder_to_open;
@@ -4320,6 +4321,7 @@ gth_browser_init (GthBrowser *browser)
        browser->priv->task_progress = 0;
        browser->priv->next_task = NULL;
        browser->priv->background_tasks = NULL;
+       browser->priv->viewer_tasks = NULL;
        browser->priv->close_with_task = FALSE;
        browser->priv->load_data_queue = NULL;
        browser->priv->last_folder_to_open = NULL;
@@ -5618,7 +5620,10 @@ background_task_completed_cb (GthTask  *task,
 
        _gth_browser_remove_activity (browser);
 
-       browser->priv->background_tasks = g_list_remove (browser->priv->background_tasks, task_data);
+       if (gth_task_get_for_viewer (task_data->task))
+               browser->priv->viewer_tasks = g_list_remove (browser->priv->viewer_tasks, task_data);
+       else
+               browser->priv->background_tasks = g_list_remove (browser->priv->background_tasks, task_data);
        g_signal_handler_disconnect (task, task_data->completed_event);
        task_data_free (task_data);
 
@@ -5731,7 +5736,10 @@ gth_browser_exec_task (GthBrowser   *browser,
                _gth_browser_add_activity (browser);
 
                task_data = task_data_new (browser, task, flags);
-               browser->priv->background_tasks = g_list_prepend (browser->priv->background_tasks, task_data);
+               if (gth_task_get_for_viewer (task))
+                       browser->priv->viewer_tasks = g_list_prepend (browser->priv->viewer_tasks, task_data);
+               else
+                       browser->priv->background_tasks = g_list_prepend (browser->priv->background_tasks, 
task_data);
 
                if (browser->priv->progress_dialog == NULL) {
                        browser->priv->progress_dialog = gth_progress_dialog_new (GTK_WINDOW (browser));
@@ -6757,7 +6765,7 @@ check_cancellable_cb (gpointer user_data)
        if ((browser->priv->load_data_queue == NULL)
            && (browser->priv->load_file_data_queue == NULL)
            && (browser->priv->task == NULL)
-           && (browser->priv->background_tasks == NULL))
+           && (browser->priv->viewer_tasks == NULL))
        {
                g_source_remove (cancel_data->check_id);
                cancel_data->check_id = 0;
@@ -6809,7 +6817,7 @@ _gth_browser_cancel (GthBrowser *browser,
                g_cancellable_cancel (data->cancellable);
        }
 
-       for (scan = browser->priv->background_tasks; scan; scan = scan->next) {
+       for (scan = browser->priv->viewer_tasks; scan; scan = scan->next) {
                TaskData *data = scan->data;
                if (gth_task_is_running (data->task))
                        gth_task_cancel (data->task);
diff --git a/gthumb/gth-image-task-chain.c b/gthumb/gth-image-task-chain.c
index cde6da26..934e5be4 100644
--- a/gthumb/gth-image-task-chain.c
+++ b/gthumb/gth-image-task-chain.c
@@ -183,6 +183,7 @@ gth_image_task_chain_init (GthImageTaskChain *self)
        self->priv->task_completed = 0;
        self->priv->task_dialog = 0;
        self->priv->task_progress = 0;
+       gth_task_set_for_viewer (GTH_TASK (self), TRUE);
 }
 
 
diff --git a/gthumb/gth-image-task.c b/gthumb/gth-image-task.c
index 105f13c7..f74c681b 100644
--- a/gthumb/gth-image-task.c
+++ b/gthumb/gth-image-task.c
@@ -67,6 +67,7 @@ gth_image_task_init (GthImageTask *self)
        self->priv = gth_image_task_get_instance_private (self);
        self->priv->source = NULL;
        self->priv->destination = NULL;
+       gth_task_set_for_viewer (GTH_TASK (self), TRUE);
 }
 
 
diff --git a/gthumb/gth-task.c b/gthumb/gth-task.c
index ed64b770..374be5d4 100644
--- a/gthumb/gth-task.c
+++ b/gthumb/gth-task.c
@@ -29,7 +29,8 @@
 /* Properties */
 enum {
        PROP_0,
-       PROP_DESCRIPTION
+       PROP_DESCRIPTION,
+       PROP_FOR_VIEWER
 };
 
 
@@ -46,6 +47,8 @@ struct _GthTaskPrivate {
        gboolean      running;
        GCancellable *cancellable;
        gulong        cancellable_cancelled;
+       gboolean      for_viewer; /* Whether this task is needed by the current viewer.
+                                  * It is cancelled if the viewer is closed. */
 };
 
 
@@ -113,6 +116,8 @@ gth_task_set_property (GObject      *object,
                g_free (self->priv->description);
                self->priv->description = g_strdup (g_value_get_string (value));
                break;
+       case PROP_FOR_VIEWER:
+               self->priv->for_viewer = g_value_get_boolean (value);
        default:
                break;
        }
@@ -133,6 +138,9 @@ gth_task_get_property (GObject    *object,
        case PROP_DESCRIPTION:
                g_value_set_string (value, self->priv->description);
                break;
+       case PROP_FOR_VIEWER:
+               g_value_set_boolean (value, self->priv->for_viewer);
+               break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
                break;
@@ -163,6 +171,14 @@ gth_task_class_init (GthTaskClass *class)
                                                              NULL,
                                                              G_PARAM_READWRITE));
 
+       g_object_class_install_property (object_class,
+                                        PROP_FOR_VIEWER,
+                                        g_param_spec_string ("for-viewer",
+                                                             "For Viewer",
+                                                             "Whether this task is needed by the current 
viewer. It is cancelled if the viewer is closed.",
+                                                             NULL,
+                                                             G_PARAM_READWRITE));
+
        /* signals */
 
        gth_task_signals[COMPLETED] =
@@ -316,3 +332,18 @@ gth_task_progress (GthTask    *task,
 {
        g_signal_emit (task, gth_task_signals[PROGRESS], 0, description, details, pulse, fraction);
 }
+
+
+void
+gth_task_set_for_viewer (GthTask  *task,
+                        gboolean  for_viewer)
+{
+       g_object_set (G_OBJECT (task), "for-viewer", for_viewer, NULL);
+}
+
+
+gboolean
+gth_task_get_for_viewer (GthTask *task)
+{
+       return task->priv->for_viewer;
+}
diff --git a/gthumb/gth-task.h b/gthumb/gth-task.h
index c4308532..e6333676 100644
--- a/gthumb/gth-task.h
+++ b/gthumb/gth-task.h
@@ -102,6 +102,9 @@ void            gth_task_progress        (GthTask      *task,
                                          const char   *details,
                                          gboolean      pulse,
                                          double        fraction);
+void           gth_task_set_for_viewer  (GthTask      *task,
+                                         gboolean      for_viewer);
+gboolean       gth_task_get_for_viewer  (GthTask      *task);
 
 G_END_DECLS
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]