background: GnomeWpXml to CcBackgroundXml

and into a GObject.
This commit is contained in:
Bastien Nocera 2011-02-12 02:01:23 +00:00
parent 2e9519a57f
commit 415d4c1111
5 changed files with 194 additions and 123 deletions

View file

@ -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 = \

View file

@ -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 <libgnome-desktop/gnome-desktop-thumbnail.h>
#include <gio/gio.h>
@ -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 *

View file

@ -1,7 +1,9 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
* Bastien Nocera <hadess@hadess.net>
*
* 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));
}

View file

@ -0,0 +1,67 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* 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 <libgnome-desktop/gnome-desktop-thumbnail.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
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

View file

@ -1,52 +0,0 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* 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 <libgnome-desktop/gnome-desktop-thumbnail.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
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