appchooser: add a GCancellable to the search operation

So that we can cancel it when the dialog is destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=651818
This commit is contained in:
Cosimo Cecchi 2011-10-03 11:47:09 -04:00
parent 06dbbad5a7
commit 569b5ffd5b
4 changed files with 19 additions and 4 deletions

View File

@ -77,6 +77,7 @@ struct _GtkAppChooserDialogPrivate {
GtkWidget *show_more_button; GtkWidget *show_more_button;
GtkAppChooserOnline *online; GtkAppChooserOnline *online;
GCancellable *online_cancellable;
gboolean show_more_clicked; gboolean show_more_clicked;
}; };
@ -128,17 +129,19 @@ search_for_mimetype_ready_cb (GObject *source,
_gtk_app_chooser_online_search_for_mimetype_finish (online, res, &error); _gtk_app_chooser_online_search_for_mimetype_finish (online, res, &error);
if (error != NULL) if (error != NULL &&
!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
{ {
show_error_dialog (_("Failed to look for applications online"), show_error_dialog (_("Failed to look for applications online"),
error->message, GTK_WINDOW (self)); error->message, GTK_WINDOW (self));
g_error_free (error);
} }
else else
{ {
gtk_app_chooser_refresh (GTK_APP_CHOOSER (self->priv->app_chooser_widget)); gtk_app_chooser_refresh (GTK_APP_CHOOSER (self->priv->app_chooser_widget));
} }
g_clear_error (&error);
gdk_threads_leave (); gdk_threads_leave ();
} }
@ -148,9 +151,11 @@ online_button_clicked_cb (GtkButton *b,
{ {
GtkAppChooserDialog *self = user_data; GtkAppChooserDialog *self = user_data;
self->priv->online_cancellable = g_cancellable_new ();
_gtk_app_chooser_online_search_for_mimetype_async (self->priv->online, _gtk_app_chooser_online_search_for_mimetype_async (self->priv->online,
self->priv->content_type, self->priv->content_type,
GTK_WINDOW (self), GTK_WINDOW (self),
self->priv->online_cancellable,
search_for_mimetype_ready_cb, search_for_mimetype_ready_cb,
self); self);
} }
@ -612,6 +617,12 @@ gtk_app_chooser_dialog_dispose (GObject *object)
g_clear_object (&self->priv->gfile); g_clear_object (&self->priv->gfile);
g_clear_object (&self->priv->online); g_clear_object (&self->priv->online);
if (self->priv->online_cancellable != NULL)
{
g_cancellable_cancel (self->priv->online_cancellable);
g_clear_object (&self->priv->online_cancellable);
}
G_OBJECT_CLASS (gtk_app_chooser_dialog_parent_class)->dispose (object); G_OBJECT_CLASS (gtk_app_chooser_dialog_parent_class)->dispose (object);
} }

View File

@ -77,6 +77,7 @@ void
_gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self, _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self,
const gchar *content_type, const gchar *content_type,
GtkWindow *parent, GtkWindow *parent,
GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
{ {
@ -86,7 +87,7 @@ _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self,
iface = GTK_APP_CHOOSER_ONLINE_GET_IFACE (self); iface = GTK_APP_CHOOSER_ONLINE_GET_IFACE (self);
(* iface->search_for_mimetype_async) (self, content_type, parent, callback, user_data); (* iface->search_for_mimetype_async) (self, content_type, parent, cancellable, callback, user_data);
} }
gboolean gboolean

View File

@ -46,6 +46,7 @@ struct _GtkAppChooserOnlineInterface {
void (*search_for_mimetype_async) (GtkAppChooserOnline *self, void (*search_for_mimetype_async) (GtkAppChooserOnline *self,
const gchar *content_type, const gchar *content_type,
GtkWindow *parent, GtkWindow *parent,
GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data); gpointer user_data);
@ -64,6 +65,7 @@ GtkAppChooserOnline * _gtk_app_chooser_online_get_default_finish (GObjec
void _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self, void _gtk_app_chooser_online_search_for_mimetype_async (GtkAppChooserOnline *self,
const gchar *content_type, const gchar *content_type,
GtkWindow *parent, GtkWindow *parent,
GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data); gpointer user_data);
gboolean _gtk_app_chooser_online_search_for_mimetype_finish (GtkAppChooserOnline *self, gboolean _gtk_app_chooser_online_search_for_mimetype_finish (GtkAppChooserOnline *self,

View File

@ -124,6 +124,7 @@ static void
pk_search_mime_async (GtkAppChooserOnline *obj, pk_search_mime_async (GtkAppChooserOnline *obj,
const gchar *content_type, const gchar *content_type,
GtkWindow *parent, GtkWindow *parent,
GCancellable *cancellable,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
{ {
@ -152,7 +153,7 @@ pk_search_mime_async (GtkAppChooserOnline *obj,
"hide-confirm-search"), "hide-confirm-search"),
G_DBUS_CALL_FLAGS_NONE, G_DBUS_CALL_FLAGS_NONE,
G_MAXINT, /* no timeout */ G_MAXINT, /* no timeout */
NULL, cancellable,
install_mime_types_ready_cb, install_mime_types_ready_cb,
self); self);
} }