background: Use URIs everywhere internally

Now we'd just need gnome-bg to make the jump.

This also fixes unique IDs for the wallpapers source, as
multiple backgrounds can be defined in a single XML file.
This commit is contained in:
Bastien Nocera 2011-02-11 18:04:57 +00:00
parent eda2f27c51
commit 2735c788b4
7 changed files with 105 additions and 125 deletions

View file

@ -71,8 +71,8 @@ bg_colors_source_init (BgColorsSource *self)
flags = CC_BACKGROUND_ITEM_HAS_PCOLOR |
CC_BACKGROUND_ITEM_HAS_SCOLOR |
CC_BACKGROUND_ITEM_HAS_SHADING |
CC_BACKGROUND_ITEM_HAS_FNAME;
/* It does have a filename, it's "none" */
CC_BACKGROUND_ITEM_HAS_URI;
/* It does have a URI, it's "none" */
g_object_set (G_OBJECT (item),
"name", _(items[i].name),

View file

@ -202,7 +202,6 @@ file_info_async_ready (GObject *source,
GList *files, *l;
GError *err = NULL;
GFile *parent;
gchar *path;
files = g_file_enumerator_next_files_finish (G_FILE_ENUMERATOR (source),
res,
&err);
@ -218,7 +217,6 @@ file_info_async_ready (GObject *source,
}
parent = g_file_enumerator_get_container (G_FILE_ENUMERATOR (source));
path = g_file_get_path (parent);
/* iterate over the available files */
for (l = files; l; l = g_list_next (l))
@ -236,18 +234,18 @@ file_info_async_ready (GObject *source,
|| !strcmp ("image/jpeg", content_type))
{
CcBackgroundItem *item;
gchar *filename;
GFile *file;
char *uri;
filename = g_build_filename (path, g_file_info_get_name (info), NULL);
file = g_file_get_child (parent, g_file_info_get_name (info));
/* create a new CcBackgroundItem */
item = cc_background_item_new (filename);
g_object_set (G_OBJECT (item), "flags", CC_BACKGROUND_ITEM_HAS_FNAME, NULL);
uri = g_file_get_uri (file);
item = cc_background_item_new (uri);
g_free (uri);
g_object_set (G_OBJECT (item), "flags", CC_BACKGROUND_ITEM_HAS_URI, NULL);
cc_background_item_load (item, info); /* FIXME use asynchronous load, and remove if failed */
file = g_file_new_for_path (filename);
g_free (filename);
if (cc_background_item_get_placement (item) == G_DESKTOP_BACKGROUND_STYLE_NONE)
g_object_set (G_OBJECT (item), "placement", G_DESKTOP_BACKGROUND_STYLE_ZOOM, NULL);
g_object_set_data (G_OBJECT (file), "item", item);
@ -258,8 +256,6 @@ file_info_async_ready (GObject *source,
g_list_foreach (files, (GFunc) g_object_unref, NULL);
g_list_free (files);
g_free (path);
}
static void

View file

@ -215,7 +215,6 @@ list_load_cb (GObject *source_object,
self);
g_hash_table_destroy (wp_xml->wp_hash);
// g_object_unref (wp_xml->settings);
g_free (wp_xml);
}
@ -227,7 +226,6 @@ reload_wallpapers (BgWallpapersSource *self)
/* set up wallpaper source */
wp_xml = g_new0 (GnomeWpXml, 1);
wp_xml->wp_hash = g_hash_table_new (g_str_hash, g_str_equal);
// wp_xml->settings = g_settings_new (WP_PATH_ID);
wp_xml->wp_model = bg_source_get_liststore (BG_SOURCE (self));
wp_xml->thumb_width = THUMBNAIL_WIDTH;
wp_xml->thumb_height = THUMBNAIL_HEIGHT;

View file

@ -41,7 +41,7 @@ struct CcBackgroundItemPrivate
{
/* properties */
char *name;
char *filename;
char *uri;
char *size;
GDesktopBackgroundStyle placement;
GDesktopBackgroundShading shading;
@ -62,7 +62,7 @@ struct CcBackgroundItemPrivate
enum {
PROP_0,
PROP_NAME,
PROP_FILENAME,
PROP_URI,
PROP_PLACEMENT,
PROP_SHADING,
PROP_PRIMARY_COLOR,
@ -104,8 +104,17 @@ set_bg_properties (CcBackgroundItem *item)
GdkColor pcolor = { 0, 0, 0, 0 };
GdkColor scolor = { 0, 0, 0, 0 };
if (item->priv->filename)
gnome_bg_set_filename (item->priv->bg, item->priv->filename);
if (item->priv->uri) {
GFile *file;
char *filename;
file = g_file_new_for_commandline_arg (item->priv->uri);
filename = g_file_get_path (file);
g_object_unref (file);
gnome_bg_set_filename (item->priv->bg, filename);
g_free (filename);
}
if (item->priv->primary_color != NULL) {
gdk_color_parse (item->priv->primary_color, &pcolor);
@ -139,7 +148,7 @@ update_size (CcBackgroundItem *item)
g_free (item->priv->size);
item->priv->size = NULL;
if (item->priv->filename == NULL || g_str_equal (item->priv->filename, "(none)")) {
if (item->priv->uri == NULL) {
item->priv->size = g_strdup ("");
} else {
if (gnome_bg_has_multiple_sizes (item->priv->bg) || gnome_bg_changes_with_time (item->priv->bg)) {
@ -226,12 +235,13 @@ update_info (CcBackgroundItem *item,
GFileInfo *info;
if (_info == NULL) {
file = g_file_new_for_commandline_arg (item->priv->filename);
file = g_file_new_for_uri (item->priv->uri);
info = g_file_query_info (file,
G_FILE_ATTRIBUTE_STANDARD_NAME ","
G_FILE_ATTRIBUTE_STANDARD_SIZE ","
G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE ","
G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME ","
G_FILE_ATTRIBUTE_TIME_MODIFIED,
G_FILE_QUERY_INFO_NONE,
NULL,
@ -246,36 +256,16 @@ update_info (CcBackgroundItem *item,
if (info == NULL
|| g_file_info_get_content_type (info) == NULL) {
if (item->priv->filename == NULL) {
if (item->priv->uri == NULL) {
item->priv->mime_type = g_strdup ("image/x-no-data");
g_free (item->priv->name);
item->priv->name = g_strdup (_("No Desktop Background"));
//item->priv->size = 0;
}
} else {
if (item->priv->name == NULL) {
const char *name;
g_free (item->priv->name);
name = g_file_info_get_name (info);
if (g_utf8_validate (name, -1, NULL))
item->priv->name = g_strdup (name);
else
item->priv->name = g_filename_to_utf8 (name,
-1,
NULL,
NULL,
NULL);
}
if (item->priv->name == NULL)
item->priv->name = g_strdup (g_file_info_get_display_name (info));
item->priv->mime_type = g_strdup (g_file_info_get_content_type (info));
#if 0
item->priv->size = g_file_info_get_size (info);
item->priv->mtime = g_file_info_get_attribute_uint64 (info,
G_FILE_ATTRIBUTE_TIME_MODIFIED);
#endif
}
if (info != NULL)
@ -295,7 +285,7 @@ cc_background_item_load (CcBackgroundItem *item,
GFileInfo *info)
{
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), FALSE);
g_return_val_if_fail (item->priv->filename != NULL, FALSE);
g_return_val_if_fail (item->priv->uri != NULL, FALSE);
update_info (item, info);
@ -310,9 +300,13 @@ cc_background_item_load (CcBackgroundItem *item,
/* FIXME we should handle XML files as well */
if (item->priv->mime_type != NULL &&
g_str_has_prefix (item->priv->mime_type, "image/")) {
gdk_pixbuf_get_file_info (item->priv->filename,
char *filename;
filename = g_filename_from_uri (item->priv->uri, NULL, NULL);
gdk_pixbuf_get_file_info (filename,
&item->priv->width,
&item->priv->height);
g_free (filename);
update_size (item);
}
@ -336,19 +330,19 @@ cc_background_item_get_name (CcBackgroundItem *item)
}
static void
_set_filename (CcBackgroundItem *item,
const char *value)
_set_uri (CcBackgroundItem *item,
const char *value)
{
g_free (item->priv->filename);
item->priv->filename = g_strdup (value);
g_free (item->priv->uri);
item->priv->uri = g_strdup (value);
}
const char *
cc_background_item_get_filename (CcBackgroundItem *item)
cc_background_item_get_uri (CcBackgroundItem *item)
{
g_return_val_if_fail (CC_IS_BACKGROUND_ITEM (item), NULL);
return item->priv->filename;
return item->priv->uri;
}
static void
@ -489,8 +483,8 @@ cc_background_item_set_property (GObject *object,
case PROP_NAME:
_set_name (self, g_value_get_string (value));
break;
case PROP_FILENAME:
_set_filename (self, g_value_get_string (value));
case PROP_URI:
_set_uri (self, g_value_get_string (value));
break;
case PROP_PLACEMENT:
_set_placement (self, g_value_get_enum (value));
@ -536,8 +530,8 @@ cc_background_item_get_property (GObject *object,
case PROP_NAME:
g_value_set_string (value, self->priv->name);
break;
case PROP_FILENAME:
g_value_set_string (value, self->priv->filename);
case PROP_URI:
g_value_set_string (value, self->priv->uri);
break;
case PROP_PLACEMENT:
g_value_set_enum (value, self->priv->placement);
@ -615,10 +609,10 @@ cc_background_item_class_init (CcBackgroundItemClass *klass)
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
PROP_FILENAME,
g_param_spec_string ("filename",
"filename",
"filename",
PROP_URI,
g_param_spec_string ("uri",
"uri",
"uri",
NULL,
G_PARAM_READWRITE));
g_object_class_install_property (object_class,
@ -730,7 +724,7 @@ cc_background_item_finalize (GObject *object)
g_return_if_fail (item->priv != NULL);
g_free (item->priv->name);
g_free (item->priv->filename);
g_free (item->priv->uri);
g_free (item->priv->primary_color);
g_free (item->priv->secondary_color);
g_free (item->priv->mime_type);
@ -743,12 +737,12 @@ cc_background_item_finalize (GObject *object)
}
CcBackgroundItem *
cc_background_item_new (const char *filename)
cc_background_item_new (const char *uri)
{
GObject *object;
object = g_object_new (CC_TYPE_BACKGROUND_ITEM,
"filename", filename,
"uri", uri,
NULL);
return CC_BACKGROUND_ITEM (object);
@ -759,9 +753,8 @@ cc_background_item_copy (CcBackgroundItem *item)
{
CcBackgroundItem *ret;
ret = cc_background_item_new (item->priv->filename);
ret = cc_background_item_new (item->priv->uri);
ret->priv->name = g_strdup (item->priv->name);
ret->priv->filename = g_strdup (item->priv->filename);
ret->priv->size = g_strdup (item->priv->size);
ret->priv->placement = item->priv->placement;
ret->priv->shading = item->priv->shading;
@ -801,7 +794,7 @@ cc_background_item_dump (CcBackgroundItem *item)
priv = item->priv;
g_debug ("name:\t\t\t%s", priv->name);
g_debug ("filename:\t\t%s", priv->filename ? priv->filename : "NULL");
g_debug ("URI:\t\t\t%s", priv->uri ? priv->uri : "NULL");
if (priv->size)
g_debug ("size:\t\t\t'%s'", priv->size);
flags = g_string_new (NULL);

View file

@ -37,11 +37,11 @@ G_BEGIN_DECLS
#define CC_BACKGROUND_ITEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CC_TYPE_BACKGROUND_ITEM, CcBackgroundItemClass))
typedef enum {
CC_BACKGROUND_ITEM_HAS_SHADING = 1 << 0,
CC_BACKGROUND_ITEM_HAS_SHADING = 1 << 0,
CC_BACKGROUND_ITEM_HAS_PLACEMENT = 1 << 1,
CC_BACKGROUND_ITEM_HAS_PCOLOR = 1 << 2,
CC_BACKGROUND_ITEM_HAS_SCOLOR = 1 << 3,
CC_BACKGROUND_ITEM_HAS_FNAME = 1 << 4
CC_BACKGROUND_ITEM_HAS_PCOLOR = 1 << 2,
CC_BACKGROUND_ITEM_HAS_SCOLOR = 1 << 3,
CC_BACKGROUND_ITEM_HAS_URI = 1 << 4
} CcBackgroundItemFlags;
#define CC_BACKGROUND_ITEM_HAS_ALL (CC_BACKGROUND_ITEM_HAS_SHADING & \
@ -66,7 +66,7 @@ typedef struct
GType cc_background_item_get_type (void);
CcBackgroundItem * cc_background_item_new (const char *filename);
CcBackgroundItem * cc_background_item_new (const char *uri);
CcBackgroundItem * cc_background_item_copy (CcBackgroundItem *item);
gboolean cc_background_item_load (CcBackgroundItem *item,
GFileInfo *info);
@ -84,7 +84,7 @@ GIcon * cc_background_item_get_frame_thumbnail (CcBackgroundItem
GDesktopBackgroundStyle cc_background_item_get_placement (CcBackgroundItem *item);
GDesktopBackgroundShading cc_background_item_get_shading (CcBackgroundItem *item);
const char * cc_background_item_get_filename (CcBackgroundItem *item);
const char * cc_background_item_get_uri (CcBackgroundItem *item);
const char * cc_background_item_get_source_url (CcBackgroundItem *item);
const char * cc_background_item_get_source_xml (CcBackgroundItem *item);
CcBackgroundItemFlags cc_background_item_get_flags (CcBackgroundItem *item);

View file

@ -251,7 +251,7 @@ source_update_edit_box (CcBackgroundPanelPrivate *priv,
gtk_widget_show (WID ("style-pcolor"));
if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT ||
cc_background_item_get_filename (priv->current_background) == NULL)
cc_background_item_get_uri (priv->current_background) == NULL)
gtk_widget_hide (WID ("style-combobox"));
else
gtk_widget_show (WID ("style-combobox"));
@ -405,7 +405,7 @@ backgrounds_changed_cb (GtkIconView *icon_view,
CcBackgroundPanelPrivate *priv = panel->priv;
char *pcolor, *scolor;
gboolean draw_preview = TRUE;
const char *filename;
const char *uri;
CcBackgroundItemFlags flags;
list = gtk_icon_view_get_selected_items (icon_view);
@ -430,10 +430,10 @@ backgrounds_changed_cb (GtkIconView *icon_view,
gtk_tree_model_get (model, &iter, 1, &item, -1);
filename = cc_background_item_get_filename (item);
uri = cc_background_item_get_uri (item);
flags = cc_background_item_get_flags (item);
if ((flags & CC_BACKGROUND_ITEM_HAS_FNAME) && filename == NULL)
if ((flags & CC_BACKGROUND_ITEM_HAS_URI) && uri == NULL)
{
g_settings_set_enum (priv->settings, WP_OPTIONS_KEY, G_DESKTOP_BACKGROUND_STYLE_NONE);
g_settings_set_string (priv->settings, WP_FILE_KEY, "");
@ -444,6 +444,7 @@ backgrounds_changed_cb (GtkIconView *icon_view,
gchar *cache_path;
GdkPixbuf *pixbuf;
/* FIXME we want a URI here */
cache_path = g_build_filename (g_get_user_cache_dir (),
"gnome-background",
NULL);
@ -485,30 +486,17 @@ backgrounds_changed_cb (GtkIconView *icon_view,
copy_finished_cb, panel);
g_settings_set_string (priv->settings, WP_FILE_KEY, cache_path);
g_object_set (G_OBJECT (item), "filename", cache_path, NULL);
g_object_set (G_OBJECT (item), "uri", cache_path, NULL);
/* delay the updated drawing of the preview until the copy finishes */
draw_preview = FALSE;
}
else
{
gchar *uri;
//FIXME this is garbage, either use uri, or not
if (g_utf8_validate (filename, -1, NULL))
uri = g_strdup (filename);
else
uri = g_filename_to_utf8 (filename, -1, NULL, NULL, NULL);
if (uri == NULL)
{
g_warning ("Failed to convert filename to UTF-8: %s", filename);
}
else
{
g_settings_set_string (priv->settings, WP_FILE_KEY, uri);
g_free (uri);
}
char *filename;
filename = g_filename_from_uri (uri, NULL, NULL);
g_settings_set_string (priv->settings, WP_FILE_KEY, filename);
g_free (filename);
}
if (flags & CC_BACKGROUND_ITEM_HAS_PLACEMENT)
@ -692,7 +680,7 @@ cc_background_panel_init (CcBackgroundPanel *self)
GError *err = NULL;
GtkWidget *widget;
GtkListStore *store;
gchar *filename;
gchar *uri, *pcolor, *scolor;
priv = self->priv = BACKGROUND_PANEL_PRIVATE (self);
@ -790,21 +778,26 @@ cc_background_panel_init (CcBackgroundPanel *self)
priv->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL);
/* initalise the current background information from settings */
filename = g_settings_get_string (priv->settings, WP_FILE_KEY);
priv->current_background = cc_background_item_new (filename);
uri = g_settings_get_string (priv->settings, WP_FILE_KEY);
priv->current_background = cc_background_item_new (uri);
g_free (uri);
/* FIXME Set flags too:
* - if we have a gradient and no filename, set PCOLOR, etc.
*
* Move into cc-background-item.c like the old cc_background_item_update()?
*/
pcolor = g_settings_get_string (priv->settings, WP_PCOLOR_KEY);
scolor = g_settings_get_string (priv->settings, WP_SCOLOR_KEY);
g_object_set (G_OBJECT (priv->current_background),
"name", _("Current background"),
"placement", g_settings_get_enum (priv->settings, WP_OPTIONS_KEY),
"shading", g_settings_get_enum (priv->settings, WP_SHADING_KEY),
"primary-color", g_settings_get_string (priv->settings, WP_PCOLOR_KEY),
"secondary-color", g_settings_get_string (priv->settings, WP_SCOLOR_KEY),
"primary-color", pcolor,
"secondary-color", scolor,
NULL);
g_free (pcolor);
g_free (scolor);
cc_background_item_load (priv->current_background, NULL);

View file

@ -107,7 +107,6 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data,
xmlChar * nodelang;
const gchar * const * syslangs;
gint i;
char *fname;
wplist = xmlParseFile (filename);
@ -115,15 +114,17 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data,
return;
syslangs = g_get_language_names ();
fname = NULL;
root = xmlDocGetRootElement (wplist);
for (list = root->children; list != NULL; list = list->next) {
if (!strcmp ((gchar *)list->name, "wallpaper")) {
CcBackgroundItem * item;
CcBackgroundItemFlags flags = 0;
CcBackgroundItemFlags flags;
char *uri, *cname, *id;
flags = 0;
cname = NULL;
item = cc_background_item_new (NULL);
g_object_set (G_OBJECT (item),
@ -137,17 +138,20 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data,
} else if (!strcmp ((gchar *)wpa->name, "filename")) {
if (wpa->last != NULL && wpa->last->content != NULL) {
gchar *content = g_strstrip ((gchar *)wpa->last->content);
char *bg_uri;
/* FIXME same rubbish as in other parts of the code */
if (strcmp (content, NONE) == 0) {
fname = NULL;
} else if (g_utf8_validate (content, -1, NULL) &&
g_file_test (content, G_FILE_TEST_EXISTS)) {
fname = g_strdup (content);
bg_uri = NULL;
} else {
fname = g_filename_from_utf8 (content, -1, NULL, NULL, NULL);
GFile *file;
file = g_file_new_for_commandline_arg (content);
bg_uri = g_file_get_uri (file);
g_object_unref (file);
}
SET_FLAG(CC_BACKGROUND_ITEM_HAS_FNAME);
g_object_set (G_OBJECT (item), "filename", fname, NULL);
SET_FLAG(CC_BACKGROUND_ITEM_HAS_URI);
g_object_set (G_OBJECT (item), "uri", bg_uri, NULL);
g_free (bg_uri);
} else {
break;
}
@ -159,8 +163,9 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data,
g_object_get (G_OBJECT (item), "name", &name, NULL);
if (name == NULL && nodelang == NULL) {
g_object_set (G_OBJECT (item), "name",
g_strstrip ((gchar *)wpa->last->content), NULL);
g_free (cname);
cname = g_strdup (g_strstrip ((gchar *)wpa->last->content));
g_object_set (G_OBJECT (item), "name", cname, NULL);
} else {
for (i = 0; syslangs[i] != NULL; i++) {
if (!strcmp (syslangs[i], (gchar *)nodelang)) {
@ -209,29 +214,24 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data,
}
}
/* Make sure we don't already have this one and that filename exists */
if (fname == NULL ||
g_hash_table_lookup (data->wp_hash, fname) != NULL) {
/* FIXME, this is a broken way of doing,
* need to use proper code here */
uri = g_filename_to_uri (filename, NULL, NULL);
id = g_strdup_printf ("%s#%s", uri, cname);
g_free (uri);
/* Make sure we don't already have this one and that filename exists */
if (g_hash_table_lookup (data->wp_hash, id) != NULL) {
g_object_unref (item);
g_free (id);
continue;
}
g_object_set (G_OBJECT (item), "flags", flags, NULL);
if (fname != NULL) {
#if 0
cc_background_item_ensure_gnome_bg (wp);
cc_background_item_update_size (wp, NULL);
#endif
g_hash_table_insert (data->wp_hash, g_strdup (filename), item);
} else {
g_object_unref (item);
item = NULL;
}
g_hash_table_insert (data->wp_hash, id, item);
/* Don't free ID, we added it to the hash table */
}
}
g_free (fname);
xmlFreeDoc (wplist);
}