background: always pass a cancellable down to I/O operations
So they will be properly cancelled when the panel is disposed. Also, check early if the operation was cancelled, since it's not safe to assume the data of the callback is valid anymore before that point. https://bugzilla.gnome.org/show_bug.cgi?id=672572
This commit is contained in:
parent
6c140396e6
commit
761f5f0b8b
1 changed files with 31 additions and 19 deletions
|
@ -171,16 +171,29 @@ picture_scaled (GObject *source_object,
|
|||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
BgPicturesSource *bg_source;
|
||||
CcBackgroundItem *item;
|
||||
GError *error = NULL;
|
||||
GdkPixbuf *pixbuf;
|
||||
const char *source_url;
|
||||
const char *software;
|
||||
|
||||
GtkTreeIter iter;
|
||||
GtkListStore *store;
|
||||
|
||||
pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error);
|
||||
if (pixbuf == NULL)
|
||||
{
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
g_warning ("Failed to load image: %s", error->message);
|
||||
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
/* since we were not cancelled, we can now cast user_data
|
||||
* back to BgPicturesSource.
|
||||
*/
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
store = bg_source_get_liststore (BG_SOURCE (bg_source));
|
||||
item = g_object_get_data (source_object, "item");
|
||||
|
||||
|
@ -194,15 +207,6 @@ picture_scaled (GObject *source_object,
|
|||
1,
|
||||
GTK_SORT_ASCENDING);
|
||||
|
||||
pixbuf = gdk_pixbuf_new_from_stream_finish (res, &error);
|
||||
if (pixbuf == NULL)
|
||||
{
|
||||
g_warning ("Failed to load image: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_object_unref (item);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ignore screenshots */
|
||||
software = gdk_pixbuf_get_option (pixbuf, "tEXt::Software");
|
||||
if (software != NULL &&
|
||||
|
@ -259,7 +263,7 @@ picture_opened_for_read (GObject *source_object,
|
|||
GAsyncResult *res,
|
||||
gpointer user_data)
|
||||
{
|
||||
BgPicturesSource *bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
BgPicturesSource *bg_source;
|
||||
CcBackgroundItem *item;
|
||||
GFileInputStream *stream;
|
||||
GError *error = NULL;
|
||||
|
@ -268,22 +272,28 @@ picture_opened_for_read (GObject *source_object,
|
|||
stream = g_file_read_finish (G_FILE (source_object), res, &error);
|
||||
if (stream == NULL)
|
||||
{
|
||||
char *filename;
|
||||
|
||||
filename = g_file_get_path (G_FILE (source_object));
|
||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
|
||||
{
|
||||
char *filename = g_file_get_path (G_FILE (source_object));
|
||||
g_warning ("Failed to load picture '%s': %s", filename, error->message);
|
||||
g_free (filename);
|
||||
}
|
||||
|
||||
g_error_free (error);
|
||||
g_object_unref (item);
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_set_data (G_OBJECT (stream), "item", item);
|
||||
/* since we were not cancelled, we can now cast user_data
|
||||
* back to BgPicturesSource.
|
||||
*/
|
||||
bg_source = BG_PICTURES_SOURCE (user_data);
|
||||
|
||||
g_object_set_data (G_OBJECT (stream), "item", item);
|
||||
gdk_pixbuf_new_from_stream_at_scale_async (G_INPUT_STREAM (stream),
|
||||
THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT,
|
||||
TRUE,
|
||||
NULL,
|
||||
bg_source->priv->cancellable,
|
||||
picture_scaled, bg_source);
|
||||
g_object_unref (stream);
|
||||
}
|
||||
|
@ -329,7 +339,9 @@ add_single_file (BgPicturesSource *bg_source,
|
|||
g_object_set (G_OBJECT (item), "source-url", source_uri, NULL);
|
||||
|
||||
g_object_set_data (G_OBJECT (file), "item", item);
|
||||
g_file_read_async (file, 0, NULL, picture_opened_for_read, bg_source);
|
||||
g_file_read_async (file, G_PRIORITY_DEFAULT,
|
||||
bg_source->priv->cancellable,
|
||||
picture_opened_for_read, bg_source);
|
||||
g_object_unref (file);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue