background: use GFiles instead of filenames
We want to use GResources for system backgrounds, so move this to a GFile. https://bugzilla.gnome.org/show_bug.cgi?id=736936
This commit is contained in:
parent
8a6542c242
commit
a37f632b1b
@ -53,7 +53,7 @@ struct _MetaBackgroundImageCacheClass
|
|||||||
struct _MetaBackgroundImage
|
struct _MetaBackgroundImage
|
||||||
{
|
{
|
||||||
GObject parent_instance;
|
GObject parent_instance;
|
||||||
char *filename;
|
GFile *file;
|
||||||
MetaBackgroundImageCache *cache;
|
MetaBackgroundImageCache *cache;
|
||||||
gboolean in_cache;
|
gboolean in_cache;
|
||||||
gboolean loaded;
|
gboolean loaded;
|
||||||
@ -70,7 +70,7 @@ G_DEFINE_TYPE (MetaBackgroundImageCache, meta_background_image_cache, G_TYPE_OBJ
|
|||||||
static void
|
static void
|
||||||
meta_background_image_cache_init (MetaBackgroundImageCache *cache)
|
meta_background_image_cache_init (MetaBackgroundImageCache *cache)
|
||||||
{
|
{
|
||||||
cache->images = g_hash_table_new (g_str_hash, g_str_equal);
|
cache->images = g_hash_table_new (g_file_hash, (GEqualFunc) g_file_equal);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -124,9 +124,17 @@ load_file (GTask *task,
|
|||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GdkPixbuf *pixbuf;
|
GdkPixbuf *pixbuf;
|
||||||
|
GFileInputStream *stream;
|
||||||
|
|
||||||
pixbuf = gdk_pixbuf_new_from_file (image->filename,
|
stream = g_file_read (image->file, NULL, &error);
|
||||||
&error);
|
if (stream == NULL)
|
||||||
|
{
|
||||||
|
g_task_return_error (task, error);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pixbuf = gdk_pixbuf_new_from_stream (G_INPUT_STREAM (stream), NULL, &error);
|
||||||
|
g_object_unref (stream);
|
||||||
|
|
||||||
if (pixbuf == NULL)
|
if (pixbuf == NULL)
|
||||||
{
|
{
|
||||||
@ -156,9 +164,11 @@ file_loaded (GObject *source_object,
|
|||||||
|
|
||||||
if (pixbuf == NULL)
|
if (pixbuf == NULL)
|
||||||
{
|
{
|
||||||
|
char *uri = g_file_get_uri (image->file);
|
||||||
g_warning ("Failed to load background '%s': %s",
|
g_warning ("Failed to load background '%s': %s",
|
||||||
image->filename, error->message);
|
uri, error->message);
|
||||||
g_clear_error (&error);
|
g_clear_error (&error);
|
||||||
|
g_free (uri);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,7 +205,7 @@ out:
|
|||||||
/**
|
/**
|
||||||
* meta_background_image_cache_load:
|
* meta_background_image_cache_load:
|
||||||
* @cache: a #MetaBackgroundImageCache
|
* @cache: a #MetaBackgroundImageCache
|
||||||
* @filename: filename to load
|
* @file: #GFile to load
|
||||||
*
|
*
|
||||||
* Loads an image to use as a background, or returns a reference to an
|
* Loads an image to use as a background, or returns a reference to an
|
||||||
* image that is already in the process of loading or loaded. In either
|
* image that is already in the process of loading or loaded. In either
|
||||||
@ -209,23 +219,23 @@ out:
|
|||||||
*/
|
*/
|
||||||
MetaBackgroundImage *
|
MetaBackgroundImage *
|
||||||
meta_background_image_cache_load (MetaBackgroundImageCache *cache,
|
meta_background_image_cache_load (MetaBackgroundImageCache *cache,
|
||||||
const char *filename)
|
GFile *file)
|
||||||
{
|
{
|
||||||
MetaBackgroundImage *image;
|
MetaBackgroundImage *image;
|
||||||
GTask *task;
|
GTask *task;
|
||||||
|
|
||||||
g_return_val_if_fail (META_IS_BACKGROUND_IMAGE_CACHE (cache), NULL);
|
g_return_val_if_fail (META_IS_BACKGROUND_IMAGE_CACHE (cache), NULL);
|
||||||
g_return_val_if_fail (filename != NULL, NULL);
|
g_return_val_if_fail (file != NULL, NULL);
|
||||||
|
|
||||||
image = g_hash_table_lookup (cache->images, filename);
|
image = g_hash_table_lookup (cache->images, file);
|
||||||
if (image != NULL)
|
if (image != NULL)
|
||||||
return g_object_ref (image);
|
return g_object_ref (image);
|
||||||
|
|
||||||
image = g_object_new (META_TYPE_BACKGROUND_IMAGE, NULL);
|
image = g_object_new (META_TYPE_BACKGROUND_IMAGE, NULL);
|
||||||
image->cache = cache;
|
image->cache = cache;
|
||||||
image->in_cache = TRUE;
|
image->in_cache = TRUE;
|
||||||
image->filename = g_strdup (filename);
|
image->file = g_object_ref (file);
|
||||||
g_hash_table_insert (cache->images, image->filename, image);
|
g_hash_table_insert (cache->images, image->file, image);
|
||||||
|
|
||||||
task = g_task_new (image, NULL, file_loaded, NULL);
|
task = g_task_new (image, NULL, file_loaded, NULL);
|
||||||
|
|
||||||
@ -238,25 +248,25 @@ meta_background_image_cache_load (MetaBackgroundImageCache *cache,
|
|||||||
/**
|
/**
|
||||||
* meta_background_image_cache_purge:
|
* meta_background_image_cache_purge:
|
||||||
* @cache: a #MetaBackgroundImageCache
|
* @cache: a #MetaBackgroundImageCache
|
||||||
* @filename: filename to remove from the cache
|
* @file: file to remove from the cache
|
||||||
*
|
*
|
||||||
* Remove an entry from the cache; this would be used if monitoring
|
* Remove an entry from the cache; this would be used if monitoring
|
||||||
* showed that the file changed.
|
* showed that the file changed.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
|
meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
|
||||||
const char *filename)
|
GFile *file)
|
||||||
{
|
{
|
||||||
MetaBackgroundImage *image;
|
MetaBackgroundImage *image;
|
||||||
|
|
||||||
g_return_if_fail (META_IS_BACKGROUND_IMAGE_CACHE (cache));
|
g_return_if_fail (META_IS_BACKGROUND_IMAGE_CACHE (cache));
|
||||||
g_return_if_fail (filename != NULL);
|
g_return_if_fail (file != NULL);
|
||||||
|
|
||||||
image = g_hash_table_lookup (cache->images, filename);
|
image = g_hash_table_lookup (cache->images, file);
|
||||||
if (image == NULL)
|
if (image == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_hash_table_remove (cache->images, image->filename);
|
g_hash_table_remove (cache->images, image->file);
|
||||||
image->in_cache = FALSE;
|
image->in_cache = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -273,12 +283,12 @@ meta_background_image_finalize (GObject *object)
|
|||||||
MetaBackgroundImage *image = META_BACKGROUND_IMAGE (object);
|
MetaBackgroundImage *image = META_BACKGROUND_IMAGE (object);
|
||||||
|
|
||||||
if (image->in_cache)
|
if (image->in_cache)
|
||||||
g_hash_table_remove (image->cache->images, image->filename);
|
g_hash_table_remove (image->cache->images, image->file);
|
||||||
|
|
||||||
if (image->texture)
|
if (image->texture)
|
||||||
cogl_object_unref (image->texture);
|
cogl_object_unref (image->texture);
|
||||||
if (image->filename)
|
if (image->file)
|
||||||
g_free (image->filename);
|
g_object_unref (image->file);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_background_image_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_background_image_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
@ -50,9 +50,9 @@ struct _MetaBackgroundPrivate
|
|||||||
ClutterColor color;
|
ClutterColor color;
|
||||||
ClutterColor second_color;
|
ClutterColor second_color;
|
||||||
|
|
||||||
char *filename1;
|
GFile *file1;
|
||||||
MetaBackgroundImage *background_image1;
|
MetaBackgroundImage *background_image1;
|
||||||
char *filename2;
|
GFile *file2;
|
||||||
MetaBackgroundImage *background_image2;
|
MetaBackgroundImage *background_image2;
|
||||||
|
|
||||||
CoglTexture *color_texture;
|
CoglTexture *color_texture;
|
||||||
@ -241,16 +241,28 @@ on_background_loaded (MetaBackgroundImage *image,
|
|||||||
mark_changed (self);
|
mark_changed (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
set_filename (MetaBackground *self,
|
file_equal0 (GFile *file1,
|
||||||
char **filenamep,
|
GFile *file2)
|
||||||
MetaBackgroundImage **imagep,
|
|
||||||
const char *filename)
|
|
||||||
{
|
{
|
||||||
if (g_strcmp0 (filename, *filenamep) != 0)
|
if (file1 == file2)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if ((file1 == NULL) || (file2 == NULL))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return g_file_equal (file1, file2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_file (MetaBackground *self,
|
||||||
|
GFile **filep,
|
||||||
|
MetaBackgroundImage **imagep,
|
||||||
|
GFile *file)
|
||||||
|
{
|
||||||
|
if (!file_equal0 (*filep, file))
|
||||||
{
|
{
|
||||||
g_free (*filenamep);
|
g_clear_object (filep);
|
||||||
*filenamep = g_strdup (filename);
|
|
||||||
|
|
||||||
if (*imagep)
|
if (*imagep)
|
||||||
{
|
{
|
||||||
@ -261,10 +273,12 @@ set_filename (MetaBackground *self,
|
|||||||
*imagep = NULL;
|
*imagep = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filename)
|
if (file)
|
||||||
{
|
{
|
||||||
MetaBackgroundImageCache *cache = meta_background_image_cache_get_default ();
|
MetaBackgroundImageCache *cache = meta_background_image_cache_get_default ();
|
||||||
*imagep = meta_background_image_cache_load (cache, filename);
|
|
||||||
|
*filep = g_object_ref (file);
|
||||||
|
*imagep = meta_background_image_cache_load (cache, file);
|
||||||
g_signal_connect (*imagep, "loaded",
|
g_signal_connect (*imagep, "loaded",
|
||||||
G_CALLBACK (on_background_loaded), self);
|
G_CALLBACK (on_background_loaded), self);
|
||||||
}
|
}
|
||||||
@ -280,8 +294,8 @@ meta_background_dispose (GObject *object)
|
|||||||
free_color_texture (self);
|
free_color_texture (self);
|
||||||
free_wallpaper_texture (self);
|
free_wallpaper_texture (self);
|
||||||
|
|
||||||
set_filename (self, &priv->filename1, &priv->background_image1, NULL);
|
set_file (self, &priv->file1, &priv->background_image1, NULL);
|
||||||
set_filename (self, &priv->filename2, &priv->background_image2, NULL);
|
set_file (self, &priv->file2, &priv->background_image2, NULL);
|
||||||
|
|
||||||
set_screen (self, NULL);
|
set_screen (self, NULL);
|
||||||
|
|
||||||
@ -867,19 +881,19 @@ meta_background_set_gradient (MetaBackground *self,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_background_set_filename (MetaBackground *self,
|
meta_background_set_file (MetaBackground *self,
|
||||||
const char *filename,
|
GFile *file,
|
||||||
GDesktopBackgroundStyle style)
|
GDesktopBackgroundStyle style)
|
||||||
{
|
{
|
||||||
g_return_if_fail (META_IS_BACKGROUND (self));
|
g_return_if_fail (META_IS_BACKGROUND (self));
|
||||||
|
|
||||||
meta_background_set_blend (self, filename, NULL, 0.0, style);
|
meta_background_set_blend (self, file, NULL, 0.0, style);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_background_set_blend (MetaBackground *self,
|
meta_background_set_blend (MetaBackground *self,
|
||||||
const char *filename1,
|
GFile *file1,
|
||||||
const char *filename2,
|
GFile *file2,
|
||||||
double blend_factor,
|
double blend_factor,
|
||||||
GDesktopBackgroundStyle style)
|
GDesktopBackgroundStyle style)
|
||||||
{
|
{
|
||||||
@ -890,8 +904,8 @@ meta_background_set_blend (MetaBackground *self,
|
|||||||
|
|
||||||
priv = self->priv;
|
priv = self->priv;
|
||||||
|
|
||||||
set_filename (self, &priv->filename1, &priv->background_image1, filename1);
|
set_file (self, &priv->file1, &priv->background_image1, file1);
|
||||||
set_filename (self, &priv->filename2, &priv->background_image2, filename2);
|
set_file (self, &priv->file2, &priv->background_image2, file2);
|
||||||
|
|
||||||
priv->blend_factor = blend_factor;
|
priv->blend_factor = blend_factor;
|
||||||
priv->style = style;
|
priv->style = style;
|
||||||
|
@ -69,8 +69,8 @@ MetaBackgroundImageCache *meta_background_image_cache_get_default (void);
|
|||||||
GType meta_background_image_cache_get_type (void);
|
GType meta_background_image_cache_get_type (void);
|
||||||
|
|
||||||
MetaBackgroundImage *meta_background_image_cache_load (MetaBackgroundImageCache *cache,
|
MetaBackgroundImage *meta_background_image_cache_load (MetaBackgroundImageCache *cache,
|
||||||
const char *filename);
|
GFile *file);
|
||||||
void meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
|
void meta_background_image_cache_purge (MetaBackgroundImageCache *cache,
|
||||||
const char *filename);
|
GFile *file);
|
||||||
|
|
||||||
#endif /* __META_BACKGROUND_IMAGE_H__ */
|
#endif /* __META_BACKGROUND_IMAGE_H__ */
|
||||||
|
@ -67,12 +67,12 @@ void meta_background_set_gradient (MetaBackground *self,
|
|||||||
GDesktopBackgroundShading shading_direction,
|
GDesktopBackgroundShading shading_direction,
|
||||||
ClutterColor *color,
|
ClutterColor *color,
|
||||||
ClutterColor *second_color);
|
ClutterColor *second_color);
|
||||||
void meta_background_set_filename (MetaBackground *self,
|
void meta_background_set_file (MetaBackground *self,
|
||||||
const char *filename,
|
GFile *file,
|
||||||
GDesktopBackgroundStyle style);
|
GDesktopBackgroundStyle style);
|
||||||
void meta_background_set_blend (MetaBackground *self,
|
void meta_background_set_blend (MetaBackground *self,
|
||||||
const char *filename1,
|
GFile *file1,
|
||||||
const char *filename2,
|
GFile *file2,
|
||||||
double blend_factor,
|
double blend_factor,
|
||||||
GDesktopBackgroundStyle style);
|
GDesktopBackgroundStyle style);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user