diff options
author | Jens Georg <mail@jensge.org> | 2016-08-18 13:14:24 +0200 |
---|---|---|
committer | Jens Georg <mail@jensge.org> | 2016-12-17 09:47:40 +0100 |
commit | d95c90bd130bcf9c587616bfd950aba141496b66 (patch) | |
tree | d487675da65d0d1649a65a7d70d4811bb80dcf7c | |
parent | 471fabfb12b86e058a7811c100489226d22ba1ea (diff) | |
download | gupnp-tools-d95c90bd130bcf9c587616bfd950aba141496b66.tar.gz |
av-cp: Make it possible to cancel a running search
So the search is not kept running when the dialog was closed.
Signed-off-by: Jens Georg <mail@jensge.org>
-rw-r--r-- | src/av-cp/playlist-treeview.c | 3 | ||||
-rw-r--r-- | src/av-cp/search-dialog.c | 75 | ||||
-rw-r--r-- | src/av-cp/search-dialog.h | 3 |
3 files changed, 56 insertions, 25 deletions
diff --git a/src/av-cp/playlist-treeview.c b/src/av-cp/playlist-treeview.c index 50a9f62..119365f 100644 --- a/src/av-cp/playlist-treeview.c +++ b/src/av-cp/playlist-treeview.c @@ -365,8 +365,7 @@ on_search_menu_item_activated (GtkMenuItem *menuitem, search_dialog_set_container_id (SEARCH_DIALOG (search_dialog), id); search_dialog_set_container_title (SEARCH_DIALOG (search_dialog), title); - gtk_dialog_run (search_dialog); - gtk_widget_hide (GTK_WIDGET (search_dialog)); + search_dialog_run (SEARCH_DIALOG (search_dialog)); } void diff --git a/src/av-cp/search-dialog.c b/src/av-cp/search-dialog.c index 4b0e7c8..34988b5 100644 --- a/src/av-cp/search-dialog.c +++ b/src/av-cp/search-dialog.c @@ -69,6 +69,7 @@ struct _SearchTask { GError *error; GSourceFunc callback; gpointer user_data; + GCancellable *cancellable; }; static void @@ -98,6 +99,7 @@ search_task_new (AVCPMediaServer *server, task->error = NULL; task->callback = callback; task->user_data = user_data; + task->cancellable = g_cancellable_new (); g_signal_connect (G_OBJECT (task->parser), "object-available", @@ -120,6 +122,11 @@ search_task_free (SearchTask *task) { g_free (task); } +static void +search_task_cancel (SearchTask *task) { + g_cancellable_cancel (task->cancellable); +} + static gboolean search_task_idle_callback (gpointer user_data) { @@ -158,10 +165,10 @@ search_task_on_search_ready (GObject *source, GAsyncResult *res, gpointer user_d &returned, &error); - g_message ("Received search slice result for %s with expression %s, result is %s", - task->container_id, - task->search_expression, - result ? "TRUE" : "FALSE"); + g_debug ("Received search slice result for %s with expression %s, result is %s", + task->container_id, + task->search_expression, + result ? "TRUE" : "FALSE"); if (!result) { @@ -170,6 +177,12 @@ search_task_on_search_ready (GObject *source, GAsyncResult *res, gpointer user_d goto out; } + if (g_cancellable_is_cancelled (task->cancellable)) { + finished = TRUE; + + goto out; + } + /* Nothing returned by the server */ if (returned == 0) { finished = TRUE; @@ -198,23 +211,23 @@ search_task_on_search_ready (GObject *source, GAsyncResult *res, gpointer user_d out: g_clear_pointer (&didl_xml, g_free); if (finished) { - g_message ("Finished search, error: %s", - error ? error->message : "none"); + g_debug ("Finished search, error: %s", + error ? error->message : "none"); search_task_set_finished (task, error); } else { - g_message ("Starting new slice %u/%u (total %u)", - task->start, - task->count, - task->total); - - av_cp_media_server_search_async (task->server, - NULL, - search_task_on_search_ready, - task->container_id, - task->search_expression, - task->start, - task->count, - task); + g_debug ("Starting new slice %u/%u (total %u)", + task->start, + task->count, + task->total); + + av_cp_media_server_search_async (task->server, + task->cancellable, + search_task_on_search_ready, + task->container_id, + task->search_expression, + task->start, + task->count, + task); } } @@ -226,9 +239,9 @@ search_task_run (SearchTask *task) { return; } - g_message ("Starting search task for %s with expression %s", - task->container_id, - task->search_expression); + g_debug ("Starting search task for %s with expression %s", + task->container_id, + task->search_expression); task->running = TRUE; @@ -356,7 +369,10 @@ search_dialog_on_search_task_done (gpointer user_data) gtk_entry_set_progress_fraction (priv->search_dialog_entry, 0); gtk_widget_set_sensitive (GTK_WIDGET (priv->search_dialog_entry), TRUE); - if (priv->task->error != NULL) { + /* Only show visible error if dialog is visible. If it's not visible, + * it's likely to be a cancelled error */ + if (priv->task->error != NULL && + gtk_widget_is_visible (GTK_WIDGET (self))) { GtkWidget *dialog = NULL; dialog = gtk_message_dialog_new (GTK_WINDOW (self), @@ -426,6 +442,19 @@ search_dialog_set_container_title (SearchDialog *self, char *title) g_free (window_title); } +void +search_dialog_run (SearchDialog *self) +{ + SearchDialogPrivate *priv = search_dialog_get_instance_private (self); + gtk_dialog_run (GTK_DIALOG (self)); + gtk_widget_hide (GTK_WIDGET (self)); + + if (priv->task != NULL && + priv->task->running) { + search_task_cancel (priv->task); + } +} + static gboolean pulse_timer (gpointer user_data) { diff --git a/src/av-cp/search-dialog.h b/src/av-cp/search-dialog.h index 0d9b60e..b1d7ea3 100644 --- a/src/av-cp/search-dialog.h +++ b/src/av-cp/search-dialog.h @@ -44,4 +44,7 @@ search_dialog_set_container_id (SearchDialog *self, char *id); void search_dialog_set_container_title (SearchDialog *self, char *title); +void +search_dialog_run (SearchDialog *self); + #endif /* SEARCH_DIALOG_H */ |