From 415d4c111191a419dd901d61b85425f95520625e Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Sat, 12 Feb 2011 02:01:23 +0000 Subject: [PATCH] background: GnomeWpXml to CcBackgroundXml and into a GObject. --- panels/background/Makefile.am | 8 +- panels/background/bg-wallpapers-source.c | 38 ++--- .../{gnome-wp-xml.c => cc-background-xml.c} | 152 +++++++++++++----- panels/background/cc-background-xml.h | 67 ++++++++ panels/background/gnome-wp-xml.h | 52 ------ 5 files changed, 194 insertions(+), 123 deletions(-) rename panels/background/{gnome-wp-xml.c => cc-background-xml.c} (76%) create mode 100644 panels/background/cc-background-xml.h delete mode 100644 panels/background/gnome-wp-xml.h diff --git a/panels/background/Makefile.am b/panels/background/Makefile.am index 687edf3de..9ac3741e9 100644 --- a/panels/background/Makefile.am +++ b/panels/background/Makefile.am @@ -33,12 +33,14 @@ BUILT_SOURCES = \ gdesktop-enums-types.h libbackground_la_SOURCES = \ - $(BUILT_SOURCES) \ + $(BUILT_SOURCES) \ background-module.c \ cc-background-panel.c \ cc-background-panel.h \ cc-background-item.c \ cc-background-item.h \ + cc-background-xml.c \ + cc-background-xml.h \ bg-source.c \ bg-source.h \ bg-pictures-source.c \ @@ -46,9 +48,7 @@ libbackground_la_SOURCES = \ bg-wallpapers-source.c \ bg-wallpapers-source.h \ bg-colors-source.c \ - bg-colors-source.h \ - gnome-wp-xml.c \ - gnome-wp-xml.h + bg-colors-source.h libbackground_la_LIBADD = \ diff --git a/panels/background/bg-wallpapers-source.c b/panels/background/bg-wallpapers-source.c index 4f8dfa59c..c202f9bc3 100644 --- a/panels/background/bg-wallpapers-source.c +++ b/panels/background/bg-wallpapers-source.c @@ -24,7 +24,7 @@ #include "bg-wallpapers-source.h" #include "cc-background-item.h" -#include "gnome-wp-xml.h" +#include "cc-background-xml.h" #include #include @@ -38,7 +38,6 @@ struct _BgWallpapersSourcePrivate { GtkListStore *store; GnomeDesktopThumbnailFactory *thumb_factory; - guint reload_id; }; @@ -79,12 +78,6 @@ bg_wallpapers_source_dispose (GObject *object) priv->thumb_factory = NULL; } - if (priv->reload_id != 0) - { - g_source_remove (priv->reload_id); - priv->reload_id = 0; - } - G_OBJECT_CLASS (bg_wallpapers_source_parent_class)->dispose (object); } @@ -114,7 +107,6 @@ load_wallpapers (gchar *key, { BgWallpapersSourcePrivate *priv = source->priv; GtkTreeIter iter; -// GtkTreePath *path; GIcon *pixbuf; GtkListStore *store = bg_source_get_liststore (BG_SOURCE (source)); gboolean deleted; @@ -127,11 +119,11 @@ load_wallpapers (gchar *key, gtk_list_store_append (store, &iter); pixbuf = cc_background_item_get_thumbnail (item, priv->thumb_factory, - THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); + THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT); gtk_list_store_set (store, &iter, 0, pixbuf, - 1, item, + 1, g_object_ref (item), -1); if (pixbuf) @@ -144,32 +136,24 @@ list_load_cb (GObject *source_object, gpointer user_data) { BgWallpapersSource *self = (BgWallpapersSource *) user_data; - GnomeWpXml *wp_xml; + const GHashTable *ht; - wp_xml = gnome_wp_xml_load_list_finish (res); - g_hash_table_foreach (wp_xml->wp_hash, + ht = cc_background_xml_load_list_finish (res); + g_hash_table_foreach ((GHashTable *) ht, (GHFunc) load_wallpapers, self); - g_hash_table_destroy (wp_xml->wp_hash); - g_free (wp_xml); + g_object_unref (source_object); } static gboolean reload_wallpapers (BgWallpapersSource *self) { - GnomeWpXml *wp_xml; + CcBackgroundXml *wp_xml; /* 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->wp_model = bg_source_get_liststore (BG_SOURCE (self)); - wp_xml->thumb_width = THUMBNAIL_WIDTH; - wp_xml->thumb_height = THUMBNAIL_HEIGHT; - wp_xml->thumb_factory = self->priv->thumb_factory; - - gnome_wp_xml_load_list_async (wp_xml, NULL, list_load_cb, self); - self->priv->reload_id = 0; + wp_xml = cc_background_xml_new (); + cc_background_xml_load_list_async (wp_xml, NULL, list_load_cb, self); return FALSE; } @@ -184,7 +168,7 @@ bg_wallpapers_source_init (BgWallpapersSource *self) priv->thumb_factory = gnome_desktop_thumbnail_factory_new (GNOME_DESKTOP_THUMBNAIL_SIZE_NORMAL); - priv->reload_id = g_idle_add ((GSourceFunc)reload_wallpapers, self); + reload_wallpapers (self); } BgWallpapersSource * diff --git a/panels/background/gnome-wp-xml.c b/panels/background/cc-background-xml.c similarity index 76% rename from panels/background/gnome-wp-xml.c rename to panels/background/cc-background-xml.c index 5860f3272..1292b0cf1 100644 --- a/panels/background/gnome-wp-xml.c +++ b/panels/background/cc-background-xml.c @@ -1,7 +1,9 @@ /* * Authors: Rodney Dawes + * Bastien Nocera * * Copyright 2003-2006 Novell, Inc. (www.novell.com) + * Copyright 2011 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of version 2 of the GNU General Public License @@ -26,10 +28,25 @@ #include "gdesktop-enums-types.h" #include "cc-background-item.h" -#include "gnome-wp-xml.h" +#include "cc-background-xml.h" -static gboolean gnome_wp_xml_get_bool (const xmlNode * parent, - const gchar * prop_name) { +struct CcBackgroundXmlPrivate +{ + GHashTable *wp_hash; +}; + +#define CC_BACKGROUND_XML_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_BACKGROUND_XML, CcBackgroundXmlPrivate)) + +static void cc_background_xml_class_init (CcBackgroundXmlClass *klass); +static void cc_background_xml_init (CcBackgroundXml *background_item); +static void cc_background_xml_finalize (GObject *object); + +G_DEFINE_TYPE (CcBackgroundXml, cc_background_xml, G_TYPE_OBJECT) + +static gboolean +cc_background_xml_get_bool (const xmlNode *parent, + const gchar *prop_name) +{ xmlChar * prop; gboolean ret_val = FALSE; @@ -50,7 +67,7 @@ static gboolean gnome_wp_xml_get_bool (const xmlNode * parent, } #if 0 -static void gnome_wp_xml_set_bool (const xmlNode * parent, +static void cc_background_xml_set_bool (const xmlNode * parent, const xmlChar * prop_name, gboolean value) { g_return_if_fail (parent != NULL); g_return_if_fail (prop_name != NULL); @@ -100,8 +117,10 @@ enum_string_to_value (GType type, #define UNSET_FLAG(flag) G_STMT_START{ (flags&=~(flag)); }G_STMT_END #define SET_FLAG(flag) G_STMT_START{ (flags|=flag); }G_STMT_END -static void gnome_wp_xml_load_xml (GnomeWpXml *data, - const gchar * filename) { +static void +cc_background_xml_load_xml (CcBackgroundXml *xml, + const gchar * filename) +{ xmlDoc * wplist; xmlNode * root, * list, * wpa; xmlChar * nodelang; @@ -128,7 +147,7 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data, item = cc_background_item_new (NULL); g_object_set (G_OBJECT (item), - "is-deleted", gnome_wp_xml_get_bool (list, "deleted"), + "is-deleted", cc_background_xml_get_bool (list, "deleted"), "source-xml", filename, NULL); @@ -221,32 +240,34 @@ static void gnome_wp_xml_load_xml (GnomeWpXml *data, 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) { + if (g_hash_table_lookup (xml->priv->wp_hash, id) != NULL) { g_object_unref (item); g_free (id); continue; } g_object_set (G_OBJECT (item), "flags", flags, NULL); - g_hash_table_insert (data->wp_hash, id, item); + g_hash_table_insert (xml->priv->wp_hash, id, item); /* Don't free ID, we added it to the hash table */ } } xmlFreeDoc (wplist); } -static void gnome_wp_file_changed (GFileMonitor *monitor, - GFile *file, - GFile *other_file, - GFileMonitorEvent event_type, - GnomeWpXml *data) { - gchar * filename; +static void +gnome_wp_file_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + CcBackgroundXml *data) +{ + gchar *filename; switch (event_type) { case G_FILE_MONITOR_EVENT_CHANGED: case G_FILE_MONITOR_EVENT_CREATED: filename = g_file_get_path (file); - gnome_wp_xml_load_xml (data, filename); + cc_background_xml_load_xml (data, filename); g_free (filename); break; default: @@ -254,8 +275,10 @@ static void gnome_wp_file_changed (GFileMonitor *monitor, } } -static void gnome_wp_xml_add_monitor (GFile *directory, - GnomeWpXml *data) { +static void +cc_background_xml_add_monitor (GFile *directory, + CcBackgroundXml *data) +{ GFileMonitor *monitor; GError *error = NULL; @@ -279,8 +302,10 @@ static void gnome_wp_xml_add_monitor (GFile *directory, data); } -static void gnome_wp_xml_load_from_dir (const gchar *path, - GnomeWpXml *data) { +static void +cc_background_xml_load_from_dir (const gchar *path, + CcBackgroundXml *data) +{ GFile *directory; GFileEnumerator *enumerator; GError *error = NULL; @@ -311,18 +336,20 @@ static void gnome_wp_xml_load_from_dir (const gchar *path, fullpath = g_build_filename (path, filename, NULL); g_object_unref (info); - gnome_wp_xml_load_xml (data, fullpath); + cc_background_xml_load_xml (data, fullpath); g_free (fullpath); } g_file_enumerator_close (enumerator, NULL, NULL); - gnome_wp_xml_add_monitor (directory, data); + cc_background_xml_add_monitor (directory, data); g_object_unref (directory); g_object_unref (enumerator); } -void gnome_wp_xml_load_list (GnomeWpXml *data) { +static void +cc_background_xml_load_list (CcBackgroundXml *data) +{ const char * const *system_data_dirs; gchar * datadir; gint i; @@ -330,7 +357,7 @@ void gnome_wp_xml_load_list (GnomeWpXml *data) { datadir = g_build_filename (g_get_user_data_dir (), "gnome-background-properties", NULL); - gnome_wp_xml_load_from_dir (datadir, data); + cc_background_xml_load_from_dir (datadir, data); g_free (datadir); system_data_dirs = g_get_system_data_dirs (); @@ -338,20 +365,22 @@ void gnome_wp_xml_load_list (GnomeWpXml *data) { datadir = g_build_filename (system_data_dirs[i], "gnome-background-properties", NULL); - gnome_wp_xml_load_from_dir (datadir, data); + cc_background_xml_load_from_dir (datadir, data); g_free (datadir); } } -GnomeWpXml * -gnome_wp_xml_load_list_finish (GAsyncResult *async_result) +const GHashTable * +cc_background_xml_load_list_finish (GAsyncResult *async_result) { GSimpleAsyncResult *result = G_SIMPLE_ASYNC_RESULT (async_result); + CcBackgroundXml *data; g_return_val_if_fail (G_IS_ASYNC_RESULT (async_result), NULL); - g_warn_if_fail (g_simple_async_result_get_source_tag (result) == gnome_wp_xml_load_list_async); + g_warn_if_fail (g_simple_async_result_get_source_tag (result) == cc_background_xml_load_list_async); - return g_simple_async_result_get_op_res_gpointer (result); + data = CC_BACKGROUND_XML (g_simple_async_result_get_op_res_gpointer (result)); + return data->priv->wp_hash; } static void @@ -359,29 +388,29 @@ load_list_thread (GSimpleAsyncResult *res, GObject *object, GCancellable *cancellable) { - GnomeWpXml *data; + CcBackgroundXml *data; data = g_simple_async_result_get_op_res_gpointer (res); - gnome_wp_xml_load_list (data); + cc_background_xml_load_list (data); } -void gnome_wp_xml_load_list_async (GnomeWpXml *data, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) +void cc_background_xml_load_list_async (CcBackgroundXml *data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { GSimpleAsyncResult *result; g_return_if_fail (data != NULL); - result = g_simple_async_result_new (NULL, callback, user_data, gnome_wp_xml_load_list_async); + result = g_simple_async_result_new (G_OBJECT (data), callback, user_data, cc_background_xml_load_list_async); g_simple_async_result_set_op_res_gpointer (result, data, NULL); g_simple_async_result_run_in_thread (result, (GSimpleAsyncThreadFunc) load_list_thread, G_PRIORITY_LOW, cancellable); g_object_unref (result); } #if 0 -static void gnome_wp_list_flatten (const gchar * key, CcBackgroundItem * item, +static void gnome_wp_list_flatten (const gchar * key, CcBackgroundXml * item, GSList ** list) { g_return_if_fail (key != NULL); g_return_if_fail (item != NULL); @@ -389,7 +418,7 @@ static void gnome_wp_list_flatten (const gchar * key, CcBackgroundItem * item, *list = g_slist_prepend (*list, item); } #endif -void gnome_wp_xml_save_list (GnomeWpXml *data) { +void cc_background_xml_save_list (CcBackgroundXml *data) { //FIXME implement save or remove? #if 0 xmlDoc * wplist; @@ -415,7 +444,7 @@ void gnome_wp_xml_save_list (GnomeWpXml *data) { xmlDocSetRootElement (wplist, root); while (list != NULL) { - CcBackgroundItem * wpitem = list->data; + CcBackgroundXml * wpitem = list->data; const char * none = "(none)"; gchar * filename; const gchar * scale, * shade; @@ -434,7 +463,7 @@ void gnome_wp_xml_save_list (GnomeWpXml *data) { shade = wp_item_shading_to_string (wpitem->shade_type); wallpaper = xmlNewChild (root, NULL, (xmlChar *)"wallpaper", NULL); - gnome_wp_xml_set_bool (wallpaper, (xmlChar *)"deleted", wpitem->deleted); + cc_background_xml_set_bool (wallpaper, (xmlChar *)"deleted", wpitem->deleted); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"name", (xmlChar *)wpitem->name); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"filename", (xmlChar *)filename); item = xmlNewTextChild (wallpaper, NULL, (xmlChar *)"options", (xmlChar *)scale); @@ -454,3 +483,46 @@ void gnome_wp_xml_save_list (GnomeWpXml *data) { #endif } +static void +cc_background_xml_finalize (GObject *object) +{ + CcBackgroundXml *xml; + + g_return_if_fail (object != NULL); + g_return_if_fail (CC_IS_BACKGROUND_XML (object)); + + xml = CC_BACKGROUND_XML (object); + + g_return_if_fail (xml->priv != NULL); + + if (xml->priv->wp_hash) { + g_hash_table_destroy (xml->priv->wp_hash); + xml->priv->wp_hash = NULL; + } +} + +static void +cc_background_xml_class_init (CcBackgroundXmlClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->finalize = cc_background_xml_finalize; + + g_type_class_add_private (klass, sizeof (CcBackgroundXmlPrivate)); +} + +static void +cc_background_xml_init (CcBackgroundXml *xml) +{ + xml->priv = CC_BACKGROUND_XML_GET_PRIVATE (xml); + xml->priv->wp_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) g_object_unref); +} + +CcBackgroundXml * +cc_background_xml_new (void) +{ + return CC_BACKGROUND_XML (g_object_new (CC_TYPE_BACKGROUND_XML, NULL)); +} diff --git a/panels/background/cc-background-xml.h b/panels/background/cc-background-xml.h new file mode 100644 index 000000000..f302e0dc7 --- /dev/null +++ b/panels/background/cc-background-xml.h @@ -0,0 +1,67 @@ +/* + * Authors: Rodney Dawes + * + * Copyright 2003-2006 Novell, Inc. (www.novell.com) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef _CC_BACKGROUND_XML_H_ +#define _CC_BACKGROUND_XML_H_ + +#include +#include +#include + +G_BEGIN_DECLS + +#define CC_TYPE_BACKGROUND_XML (cc_background_xml_get_type ()) +#define CC_BACKGROUND_XML(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), CC_TYPE_BACKGROUND_XML, CcBackgroundXml)) +#define CC_BACKGROUND_XML_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), CC_TYPE_BACKGROUND_XML, CcBackgroundXmlClass)) +#define CC_IS_BACKGROUND_XML(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), CC_TYPE_BACKGROUND_XML)) +#define CC_IS_BACKGROUND_XML_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), CC_TYPE_BACKGROUND_XML)) +#define CC_BACKGROUND_XML_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), CC_TYPE_BACKGROUND_XML, CcBackgroundXmlClass)) + +typedef struct CcBackgroundXmlPrivate CcBackgroundXmlPrivate; + +typedef struct +{ + GObjectClass parent_class; +} CcBackgroundXmlClass; + +typedef struct +{ + GObject parent; + CcBackgroundXmlPrivate *priv; +} CcBackgroundXml; + +GType cc_background_xml_get_type (void); + +CcBackgroundXml *cc_background_xml_new (void); +void cc_background_xml_save_list (CcBackgroundXml *data); +/* FIXME this should be an iterator instead, so the bg + * pops up as soon as a new one is available */ +void cc_background_xml_load_list_async (CcBackgroundXml *data, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +/* FIXME, this is ugly API, which wouldn't be + * needed if this was an object */ +const GHashTable *cc_background_xml_load_list_finish (GAsyncResult *async_result); + +G_END_DECLS + +#endif + diff --git a/panels/background/gnome-wp-xml.h b/panels/background/gnome-wp-xml.h deleted file mode 100644 index 5e04c6a48..000000000 --- a/panels/background/gnome-wp-xml.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Authors: Rodney Dawes - * - * Copyright 2003-2006 Novell, Inc. (www.novell.com) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License - * as published by the Free Software Foundation - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. - * - */ - -#ifndef _GNOME_WP_XML_H_ -#define _GNOME_WP_XML_H_ - -#include -#include -#include - -typedef struct _GnomeWpXml GnomeWpXml; - -struct _GnomeWpXml -{ - GHashTable *wp_hash; - GnomeDesktopThumbnailFactory *thumb_factory; - gint thumb_height; - gint thumb_width; - GtkListStore *wp_model; -}; - -void gnome_wp_xml_load_list (GnomeWpXml *data); -void gnome_wp_xml_save_list (GnomeWpXml *data); -/* FIXME this should be an iterator instead, so the bg - * pops up as soon as a new one is available */ -void gnome_wp_xml_load_list_async (GnomeWpXml *data, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -/* FIXME, this is ugly API, which wouldn't be - * needed if this was an object */ -GnomeWpXml *gnome_wp_xml_load_list_finish (GAsyncResult *async_result); - -#endif -