[gthumb] allow to keep browsing while executing long-running external tools
- From: Paolo Bacchilega <paobac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gthumb] allow to keep browsing while executing long-running external tools
- Date: Wed, 21 Apr 2021 13:43:43 +0000 (UTC)
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]