Update for new capplet Update Name/Comment/Exec entries

2004-01-12  Rodney Dawes  <dobey@ximian.com>

	* Makefile.am: Update for new capplet
	* background.desktop.in: Update Name/Comment/Exec entries
	* gnome-wp-capplet.[ch]:
	* gnome-wp-info.[ch]:
	* gnome-wp-item.[ch]:
	* gnome-wp-utils.[ch]:
	* gnome-wp-xml.[ch]: Add new capplet code to CVS
This commit is contained in:
Rodney Dawes 2004-01-12 05:10:40 +00:00 committed by Rodney Dawes
parent 2865c350b6
commit 2e428e7746
14 changed files with 2662 additions and 14 deletions

View file

@ -8,4 +8,7 @@ Makefile.in
background.desktop
background.desktop.in
gnome-background-properties
gnome-wallpaper-properties
*.oaf
*.server

View file

@ -1,3 +1,13 @@
2004-01-12 Rodney Dawes <dobey@ximian.com>
* Makefile.am: Update for new capplet
* background.desktop.in: Update Name/Comment/Exec entries
* gnome-wp-capplet.[ch]:
* gnome-wp-info.[ch]:
* gnome-wp-item.[ch]:
* gnome-wp-utils.[ch]:
* gnome-wp-xml.[ch]: Add new capplet code to CVS
2003-12-30 Jody Goldberg <jody@gnome.org>
* Release 2.5.1.1

View file

@ -1,18 +1,40 @@
bin_PROGRAMS = gnome-background-properties
INCLUDES = \
$(CAPPLET_CFLAGS) \
-DDATADIR=\""$(datadir)"\" \
-DGNOMELOCALEDIR=\""$(localedir)"\"
gnome_background_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) $(top_builddir)/libbackground/libbackground.la
gnome_background_properties_SOURCES = background-properties-capplet.c
bin_PROGRAMS = gnome-wallpaper-properties
noinst_LTLIBRARIES = libgnomewp.la
gnome_wallpaper_properties_LDADD = \
$(CAPPLET_LIBS) \
libgnomewp.la
gnome_wallpaper_properties_SOURCES = \
gnome-wp-capplet.c gnome-wp-capplet.h \
gnome-wp-info.c gnome-wp-info.h
libgnomewp_la_SOURCES = \
gnome-wp-item.c gnome-wp-item.h \
gnome-wp-utils.c gnome-wp-utils.h \
gnome-wp-xml.c gnome-wp-xml.h
libgnomewp_la_LIBADD = \
$(CAPPLET_LIBS)
desktopdir = $(GNOMECC_DESKTOP_DIR)
desktop_in_files = background.desktop.in
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
@INTLTOOL_DESKTOP_RULE@
Gladedir = $(GNOMECC_GLADE_DIR)
Glade_DATA = background-properties.glade
EXTRA_DIST = \
$(desktop_in_files)
desktopdir = $(GNOMECC_DESKTOP_DIR)
Desktop_in_files = background.desktop.in
desktop_DATA = $(Desktop_in_files:.desktop.in=.desktop)
CLEANFILES = \
$(desktop_DATA)
INCLUDES = $(GNOMECC_CAPPLETS_CFLAGS) -I$(top_srcdir)/libbackground
CLEANFILES = $(GNOMECC_CAPPLETS_CLEANFILES)
EXTRA_DIST = $(Glade_DATA) $(Desktop_in_files)
MAINTAINERCLEANFILES = \
Makefile.in

View file

@ -1,8 +1,8 @@
[Desktop Entry]
Encoding=UTF-8
_Name=Background
_Comment=Customize your desktop background
Exec=gnome-background-properties
_Name=Desktop Wallpaper
_Comment=Desktop Wallpaper Preferences
Exec=gnome-wallpaper-properties
Icon=gnome-settings-background
Terminal=false
Type=Application

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,110 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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_CAPPLET_H_
#define _GNOME_WP_CAPPLET_H_
#include <config.h>
#include <gnome.h>
#include <glib.h>
#include <libgnomevfs/gnome-vfs.h>
#include <libgnomevfs/gnome-vfs-mime-handlers.h>
#include <libgnomevfs/gnome-vfs-mime-utils.h>
#include <libgnomeui/gnome-thumbnail.h>
#include <gconf/gconf-client.h>
#include <libxml/parser.h>
typedef struct _GnomeWPCapplet GnomeWPCapplet;
#include "gnome-wp-info.h"
#include "gnome-wp-item.h"
#include "gnome-wp-utils.h"
#include "gnome-wp-xml.h"
struct _GnomeWPCapplet {
GtkWidget * window;
/* The Tree View */
GtkWidget * treeview;
GtkTreeModel * model;
/* Option Menu for Scaling Options */
GtkWidget * wp_opts;
GtkWidget * rm_button;
/* Menu Items for Fill/Scale/Center/Tile Options */
GtkWidget * fitem;
GtkWidget * sitem;
GtkWidget * citem;
GtkWidget * witem;
/* Widgets for Color Options */
GtkWidget * color_opt;
GtkWidget * pc_picker;
GtkWidget * sc_picker;
/* Menu Items for Color Style Options */
GtkWidget * smenuitem;
GtkWidget * hmenuitem;
GtkWidget * vmenuitem;
/* GConf Client */
GConfClient * client;
/* Thumbnailing and Icon Theme stuff */
GnomeThumbnailFactory * thumbs;
GnomeIconTheme * theme;
/* Hash Table of Wallpapers */
GHashTable * wphash;
/* Keyboard Delay */
gint delay;
/* The Timeout ID for Setting the Wallpaper */
gint idleid;
};
typedef enum {
GNOME_WP_SHADE_TYPE_SOLID,
GNOME_WP_SHADE_TYPE_HORIZ,
GNOME_WP_SHADE_TYPE_VERT
} GnomeWPShadeType;
typedef enum {
GNOME_WP_SCALE_TYPE_CENTERED,
GNOME_WP_SCALE_TYPE_STRETCHED,
GNOME_WP_SCALE_TYPE_SCALED,
GNOME_WP_SCALE_TYPE_TILED
} GnomeWPScaleType;
#define WP_PATH_KEY "/desktop/gnome/background"
#define WP_FILE_KEY WP_PATH_KEY "/picture_filename"
#define WP_OPTIONS_KEY WP_PATH_KEY "/picture_options"
#define WP_SHADING_KEY WP_PATH_KEY "/color_shading_type"
#define WP_PCOLOR_KEY WP_PATH_KEY "/primary_color"
#define WP_SCOLOR_KEY WP_PATH_KEY "/secondary_color"
#define WP_KEYBOARD_PATH "/desktop/gnome/peripherals/keyboard"
#define WP_DELAY_KEY WP_KEYBOARD_PATH "/delay"
void gnome_wp_main_quit (GnomeWPCapplet * capplet);
#endif

View file

@ -0,0 +1,103 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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.
*
*/
#include <config.h>
#include <gnome.h>
#include "gnome-wp-info.h"
GnomeWPInfo * gnome_wp_info_new (const gchar * uri,
GnomeThumbnailFactory * thumbs) {
GnomeWPInfo * new;
GnomeVFSFileInfo * info;
GnomeVFSResult result;
info = gnome_vfs_file_info_new ();
result = gnome_vfs_get_file_info (uri, info,
GNOME_VFS_FILE_INFO_DEFAULT |
GNOME_VFS_FILE_INFO_GET_MIME_TYPE |
GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
if (info == NULL || info->mime_type == NULL || result != GNOME_VFS_OK) {
if (!strcmp (uri, "(none)")) {
new = g_new0 (GnomeWPInfo, 1);
new->mime_type = g_strdup ("image/x-no-data");
new->uri = g_strdup (uri);
new->thumburi = g_strconcat (g_get_home_dir (), "/.thumbnails/normal/",
gnome_thumbnail_md5 (uri), ".png", NULL);
new->name = g_strdup (_("No Wallpaper"));
new->size = 0;
} else {
new = NULL;
}
} else {
new = g_new0 (GnomeWPInfo, 1);
new->uri = g_strdup (uri);
new->thumburi = gnome_thumbnail_factory_lookup (thumbs,
new->uri, info->mtime);
if (new->thumburi == NULL) {
new->thumburi = g_strconcat (g_get_home_dir (), "/.thumbnails/normal/",
gnome_thumbnail_md5 (uri), ".png", NULL);
}
new->name = g_strdup (info->name);
new->mime_type = g_strdup (info->mime_type);
new->size = info->size;
new->mtime = info->mtime;
}
gnome_vfs_file_info_unref (info);
return new;
}
GnomeWPInfo * gnome_wp_info_dup (const GnomeWPInfo * info) {
GnomeWPInfo * new;
new = g_new0 (GnomeWPInfo, 1);
new->uri = g_strdup (info->uri);
new->thumburi = g_strdup (info->uri);
new->name = g_strdup (info->name);
new->mime_type = g_strdup (info->mime_type);
new->size = info->size;
new->mtime = info->mtime;
return new;
}
void gnome_wp_info_free (GnomeWPInfo * info) {
if (info == NULL) {
return;
}
g_free (info->uri);
g_free (info->thumburi);
g_free (info->name);
g_free (info->mime_type);
info = NULL;
}

View file

@ -0,0 +1,47 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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_INFO_H_
#define _GNOME_WP_INFO_H_
#include <glib.h>
#include <libgnomevfs/gnome-vfs.h>
#include <libgnomeui/gnome-thumbnail.h>
typedef struct _GnomeWPInfo GnomeWPInfo;
struct _GnomeWPInfo {
gchar * uri;
gchar * thumburi;
gchar * name;
gchar * mime_type;
GnomeVFSFileSize size;
time_t mtime;
};
GnomeWPInfo * gnome_wp_info_new (const gchar * uri,
GnomeThumbnailFactory * thumbs);
GnomeWPInfo * gnome_wp_info_dup (const GnomeWPInfo * info);
void gnome_wp_info_free (GnomeWPInfo * info);
#endif

View file

@ -0,0 +1,134 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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.
*
*/
#include "gnome-wp-item.h"
#include "gnome-wp-utils.h"
void gnome_wp_item_free (GnomeWPItem * item) {
if (item == NULL) {
return;
}
g_free (item->name);
g_free (item->filename);
g_free (item->description);
g_free (item->imguri);
g_free (item->options);
g_free (item->shade_type);
g_free (item->pri_color);
g_free (item->sec_color);
gdk_color_free (item->pcolor);
gdk_color_free (item->scolor);
gnome_wp_info_free (item->fileinfo);
gnome_wp_info_free (item->uriinfo);
gtk_tree_row_reference_free (item->rowref);
item = NULL;
}
GdkPixbuf * gnome_wp_item_get_thumbnail (GnomeWPItem * item,
GnomeThumbnailFactory * thumbs) {
GdkPixbuf * pixbuf, * bgpixbuf;
GdkPixbuf * scaled = NULL;
gint w, h, ratio;
w = gdk_screen_get_width (gdk_screen_get_default ());
h = gdk_screen_get_height (gdk_screen_get_default ());
ratio = h / 96;
if (!strcmp (item->shade_type, "solid")) {
bgpixbuf = gnome_wp_pixbuf_new_solid (item->pcolor, w / ratio, h / ratio);
} else if (!strcmp (item->shade_type, "vertical-gradient")) {
bgpixbuf = gnome_wp_pixbuf_new_gradient (GTK_ORIENTATION_VERTICAL,
item->pcolor, item->scolor,
w / ratio, h / ratio);
} else {
bgpixbuf = gnome_wp_pixbuf_new_gradient (GTK_ORIENTATION_HORIZONTAL,
item->pcolor, item->scolor,
w / ratio, h / ratio);
}
if (item->fileinfo->thumburi != NULL &&
g_file_test (item->fileinfo->thumburi, G_FILE_TEST_EXISTS)) {
pixbuf = gdk_pixbuf_new_from_file (item->fileinfo->thumburi, NULL);
} else if (!strcmp (item->filename, "(none)")) {
pixbuf = gdk_pixbuf_copy (bgpixbuf);
} else {
pixbuf = gnome_thumbnail_factory_generate_thumbnail (thumbs,
item->filename,
item->fileinfo->mime_type);
gnome_thumbnail_factory_save_thumbnail (thumbs, pixbuf,
item->filename,
item->fileinfo->mtime);
}
if (pixbuf != NULL) {
w = gdk_pixbuf_get_width (pixbuf);
h = gdk_pixbuf_get_height (pixbuf);
ratio = h / 48;
if (ratio == 1)
ratio = 2;
scaled = gnome_thumbnail_scale_down_pixbuf (pixbuf,
w / ratio, h / ratio);
if (w == h) {
item->options = g_strdup ("wallpaper");
scaled = gnome_wp_pixbuf_tile (scaled, bgpixbuf);
gnome_thumbnail_factory_save_thumbnail (thumbs, scaled,
item->filename,
item->fileinfo->mtime);
w = gdk_pixbuf_get_width (scaled);
h = gdk_pixbuf_get_height (scaled);
ratio = h / 48;
if (ratio == 1)
ratio = 2;
scaled = gnome_thumbnail_scale_down_pixbuf (scaled,
w / ratio, h / ratio);
}
if (!strcmp (item->options, "centered")) {
scaled = gnome_wp_pixbuf_center (scaled, bgpixbuf);
w = gdk_pixbuf_get_width (scaled);
h = gdk_pixbuf_get_height (scaled);
ratio = h / 48;
if (ratio == 1)
ratio = 2;
scaled = gnome_thumbnail_scale_down_pixbuf (scaled,
w / ratio, h / ratio);
}
}
g_object_unref (pixbuf);
g_object_unref (bgpixbuf);
return scaled;
}

View file

@ -0,0 +1,62 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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.
*
*/
#include <glib.h>
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtktreeview.h>
#include <libgnomeui/gnome-thumbnail.h>
#include <gnome-wp-info.h>
#include <libgnomevfs/gnome-vfs.h>
#ifndef _GNOME_WP_ITEM_H_
#define _GNOME_WP_ITEM_H_
typedef struct _GnomeWPItem GnomeWPItem;
struct _GnomeWPItem {
gchar * name;
gchar * filename;
gchar * description;
gchar * imguri;
gchar * options;
gchar * shade_type;
gchar * pri_color;
gchar * sec_color;
/* Where the Item is in the List */
GtkTreeRowReference * rowref;
/* Real colors */
GdkColor * pcolor;
GdkColor * scolor;
GnomeWPInfo * fileinfo;
GnomeWPInfo * uriinfo;
/* Did the user remove us? */
gboolean deleted;
};
void gnome_wp_item_free (GnomeWPItem * item);
GdkPixbuf * gnome_wp_item_get_thumbnail (GnomeWPItem * item,
GnomeThumbnailFactory * thumbs);
#endif

View file

@ -0,0 +1,162 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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.
*
*/
#include "gnome-wp-utils.h"
GdkPixbuf * gnome_wp_pixbuf_new_gradient (GtkOrientation orientation,
GdkColor * c1,
GdkColor * c2,
gint width, gint height) {
GdkPixbuf * pixbuf;
gint i, j;
gint dr, dg, db;
gint gs1;
gint vc = ((orientation == GTK_ORIENTATION_HORIZONTAL) || (c1 == c2));
guchar * b, * row, * d;
int rowstride;
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
d = gdk_pixbuf_get_pixels (pixbuf);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
dr = c2->red - c1->red;
dg = c2->green - c1->green;
db = c2->blue - c1->blue;
gs1 = (orientation == GTK_ORIENTATION_VERTICAL) ? height - 1 : width - 1;
row = g_new (unsigned char, rowstride);
if (vc) {
b = row;
for (j = 0; j < width; j++) {
*b++ = (c1->red + (j * dr) / gs1) >> 8;
*b++ = (c1->green + (j * dg) / gs1) >> 8;
*b++ = (c1->blue + (j * db) / gs1) >> 8;
}
}
for (i = 0; i < height; i++) {
if (!vc) {
unsigned char cr, cg, cb;
cr = (c1->red + (i * dr) / gs1) >> 8;
cg = (c1->green + (i * dg) / gs1) >> 8;
cb = (c1->blue + (i * db) / gs1) >> 8;
b = row;
for (j = 0; j < width; j++) {
*b++ = cr;
*b++ = cg;
*b++ = cb;
}
}
memcpy (d, row, width * 3);
d += rowstride;
}
g_free (row);
return pixbuf;
}
GdkPixbuf * gnome_wp_pixbuf_new_solid (GdkColor * color,
gint width, gint height) {
GdkPixbuf * pixbuf;
gint j, rowstride;
guchar * b, * d, * row;
pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
d = gdk_pixbuf_get_pixels (pixbuf);
rowstride = gdk_pixbuf_get_rowstride (pixbuf);
row = g_new (unsigned char, rowstride);
b = row;
for (j = 0; j < width; j++) {
*b++ = color->red >> 8;
*b++ = color->green >> 8;
*b++ = color->blue >> 8;
}
for (j = 0; j < height; j++) {
memcpy (d, row, width * 3);
d += rowstride;
}
g_free (row);
return pixbuf;
}
GdkPixbuf * gnome_wp_pixbuf_tile (GdkPixbuf * src_pixbuf,
GdkPixbuf * dest_pixbuf) {
gdouble cx, cy;
gdouble colorv;
gint dwidth, dheight;
gint swidth, sheight;
guint alpha = 255;
if (dest_pixbuf == NULL) {
return src_pixbuf;
}
swidth = gdk_pixbuf_get_width (src_pixbuf);
sheight = gdk_pixbuf_get_height (src_pixbuf);
dwidth = gdk_pixbuf_get_width (dest_pixbuf);
dheight = gdk_pixbuf_get_height (dest_pixbuf);
for (cy = 0; cy < dheight; cy += sheight) {
for (cx = 0; cx < dwidth; cx += swidth) {
gdk_pixbuf_composite (src_pixbuf, dest_pixbuf, cx, cy,
MIN (swidth, dwidth - cx),
MIN (sheight, dheight - cy),
cx, cy, 1.0, 1.0, GDK_INTERP_BILINEAR, alpha);
}
}
return dest_pixbuf;
}
GdkPixbuf * gnome_wp_pixbuf_center (GdkPixbuf * src_pixbuf,
GdkPixbuf * dest_pixbuf) {
gdouble cx, cy;
gdouble colorv;
gint dwidth, dheight;
gint swidth, sheight;
guint alpha = 255;
if (dest_pixbuf == NULL) {
return src_pixbuf;
}
swidth = gdk_pixbuf_get_width (src_pixbuf);
sheight = gdk_pixbuf_get_height (src_pixbuf);
dwidth = gdk_pixbuf_get_width (dest_pixbuf);
dheight = gdk_pixbuf_get_height (dest_pixbuf);
cx = (dwidth - swidth) / 2;
cy = (dheight - sheight) / 2;
gdk_pixbuf_composite (src_pixbuf, dest_pixbuf, cx, cy,
swidth, sheight,
cx, cy, 1.0, 1.0, GDK_INTERP_BILINEAR, alpha);
return dest_pixbuf;
}

View file

@ -0,0 +1,42 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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_UTILS_H_
#define _GNOME_WP_UTILS_H_
#include <glib.h>
#include <gtk/gtk.h>
G_BEGIN_DECLS
GdkPixbuf * gnome_wp_pixbuf_new_gradient (GtkOrientation orientation,
GdkColor * c1,
GdkColor * c2,
gint width, gint height);
GdkPixbuf * gnome_wp_pixbuf_new_solid (GdkColor * color,
gint width, gint height);
GdkPixbuf * gnome_wp_pixbuf_tile (GdkPixbuf * src_pixbuf,
GdkPixbuf * dest_pixbuf);
GdkPixbuf * gnome_wp_pixbuf_center (GdkPixbuf * src_pixbuf,
GdkPixbuf * dest_pixbuf);
G_END_DECLS
#endif

View file

@ -0,0 +1,370 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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.
*
*/
#include "gnome-wp-capplet.h"
static gboolean gnome_wp_xml_get_bool (const xmlNode * parent,
const gchar * prop_name) {
gchar * prop;
gboolean ret_val = FALSE;
g_return_val_if_fail (parent != NULL, FALSE);
g_return_val_if_fail (prop_name != NULL, FALSE);
prop = xmlGetProp ((xmlNode *) parent, prop_name);
if (prop != NULL) {
if (!g_strcasecmp (prop, "true") || !g_strcasecmp (prop, "1")) {
ret_val = TRUE;
} else {
ret_val = FALSE;
}
g_free (prop);
}
return ret_val;
}
static void gnome_wp_xml_set_bool (const xmlNode * parent,
const gchar * prop_name, gboolean value) {
g_return_if_fail (parent != NULL);
g_return_if_fail (prop_name != NULL);
if (value) {
xmlSetProp ((xmlNode *) parent, prop_name, "true");
} else {
xmlSetProp ((xmlNode *) parent, prop_name, "false");
}
}
static void gnome_wp_load_legacy (GnomeWPCapplet * capplet) {
FILE * fp;
gchar * foo, * filename;
GdkColor color1, color2;
filename = g_build_filename (g_get_home_dir (), ".gnome2",
"wallpapers.list", NULL);
if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
if ((fp = fopen (filename, "r")) != NULL) {
foo = (gchar *) g_malloc (sizeof (gchar) * 4096);
while (fgets (foo, 4096, fp)) {
GnomeWPItem * item;
if (foo[strlen (foo) - 1] == '\n') {
foo[strlen (foo) - 1] = '\0';
}
item = g_hash_table_lookup (capplet->wphash, foo);
if (item != NULL) {
continue;
}
item = g_new0 (GnomeWPItem, 1);
item->filename = g_strdup (foo);
item->fileinfo = gnome_wp_info_new (item->filename, capplet->thumbs);
item->shade_type = gconf_client_get_string (capplet->client,
WP_SHADING_KEY, NULL);
item->pri_color = gconf_client_get_string (capplet->client,
WP_PCOLOR_KEY, NULL);
item->sec_color = gconf_client_get_string (capplet->client,
WP_SCOLOR_KEY, NULL);
gdk_color_parse (item->pri_color, &color1);
gdk_color_parse (item->sec_color, &color2);
item->pcolor = gdk_color_copy (&color1);
item->scolor = gdk_color_copy (&color2);
if (!strncmp (item->fileinfo->mime_type, "image/",
strlen ("image/"))) {
if (item->name == NULL) {
item->name = g_strdup (item->fileinfo->name);
}
item->options = gconf_client_get_string (capplet->client,
WP_OPTIONS_KEY,
NULL);
item->description = g_strdup_printf ("<b>%s</b>\n%s (%LuK)",
item->name,
gnome_vfs_mime_get_description (item->fileinfo->mime_type),
item->fileinfo->size / 1024);
g_hash_table_insert (capplet->wphash, g_strdup (item->filename), item);
} else {
gnome_wp_item_free (item);
}
}
fclose (fp);
g_free (foo);
}
}
}
static void gnome_wp_xml_load_xml (GnomeWPCapplet * capplet,
const gchar * filename) {
xmlDoc * wplist;
xmlNode * root, * list, * wpa;
GdkColor color1, color2;
wplist = xmlParseFile (filename);
root = xmlDocGetRootElement (wplist);
g_return_if_fail (root != NULL);
for (list = root->children; list != NULL; list = list->next) {
if (!strcmp (list->name, "wallpaper")) {
GnomeWPItem * wp;
wp = g_new0 (GnomeWPItem, 1);
wp->deleted = gnome_wp_xml_get_bool (list, "deleted");
for (wpa = list->children; wpa != NULL; wpa = wpa->next) {
if (!strcmp (wpa->name, "filename")) {
if (wpa->last != NULL) {
wp->filename = g_strdup (g_strstrip (wpa->last->content));
} else {
break;
}
} else if (!strcmp (wpa->name, "name")) {
if (wpa->last != NULL) {
wp->name = g_strdup (g_strstrip (wpa->last->content));
}
} else if (!strcmp (wpa->name, "imguri")) {
if (wpa->last != NULL) {
wp->imguri = g_strdup (g_strstrip (wpa->last->content));
}
} else if (!strcmp (wpa->name, "options")) {
if (wpa->last != NULL) {
wp->options = g_strdup (g_strstrip (wpa->last->content));
} else {
wp->options = gconf_client_get_string (capplet->client,
WP_OPTIONS_KEY, NULL);
}
} else if (!strcmp (wpa->name, "shade_type")) {
if (wpa->last != NULL) {
wp->shade_type = g_strdup (g_strstrip (wpa->last->content));
}
} else if (!strcmp (wpa->name, "pcolor")) {
if (wpa->last != NULL) {
wp->pri_color = g_strdup (g_strstrip (wpa->last->content));
}
} else if (!strcmp (wpa->name, "scolor")) {
if (wpa->last != NULL) {
wp->sec_color = g_strdup (g_strstrip (wpa->last->content));
}
} else if (!strcmp (wpa->name, "text")) {
/* Do nothing here, libxml2 is being weird */
} else {
g_warning ("Unknown Tag: %s\n", wpa->name);
}
}
/* Verify the colors and alloc some GdkColors here */
if (wp->shade_type == NULL) {
wp->shade_type = gconf_client_get_string (capplet->client,
WP_SHADING_KEY, NULL);
}
if (wp->pri_color == NULL) {
wp->pri_color = gconf_client_get_string (capplet->client,
WP_PCOLOR_KEY, NULL);
}
if (wp->sec_color == NULL) {
wp->sec_color = gconf_client_get_string (capplet->client,
WP_SCOLOR_KEY, NULL);
}
gdk_color_parse (wp->pri_color, &color1);
gdk_color_parse (wp->sec_color, &color2);
wp->pcolor = gdk_color_copy (&color1);
wp->scolor = gdk_color_copy (&color2);
if ((wp->filename != NULL &&
g_file_test (wp->filename, G_FILE_TEST_EXISTS)) ||
!strcmp (wp->filename, "(none)")) {
wp->fileinfo = gnome_wp_info_new (wp->filename, capplet->thumbs);
if (wp->name == NULL) {
wp->name = g_strdup (wp->fileinfo->name);
}
if (!strcmp (wp->filename, "(none)")) {
wp->description = g_strdup_printf ("<b>%s</b>", wp->name);
} else {
wp->description = g_strdup_printf ("<b>%s</b>\n%s (%LuK)",
wp->name,
gnome_vfs_mime_get_description (wp->fileinfo->mime_type),
wp->fileinfo->size / 1024);
}
g_hash_table_insert (capplet->wphash, g_strdup (wp->filename), wp);
} else {
gnome_wp_item_free (wp);
}
}
}
xmlFreeDoc (wplist);
}
static void gnome_wp_file_changed (GnomeVFSMonitorHandle * handle,
const gchar * monitor_uri,
const gchar * info_uri,
GnomeVFSMonitorEventType event_type,
GnomeWPCapplet * capplet) {
gchar * filename;
switch (event_type) {
case GNOME_VFS_MONITOR_EVENT_CHANGED:
case GNOME_VFS_MONITOR_EVENT_CREATED:
filename = gnome_vfs_get_local_path_from_uri (info_uri);
gnome_wp_xml_load_xml (capplet, filename);
g_free (filename);
default:
break;
}
}
void gnome_wp_xml_load_list (GnomeWPCapplet * capplet) {
GnomeVFSMonitorHandle * handle;
GList * list, * l;
gchar * wpdbfile, * xdgdirslist;
gchar ** xdgdirs;
gint i;
wpdbfile = g_build_filename (g_get_home_dir (),
".gnome2",
"wp-list.xml",
NULL);
if (g_file_test (wpdbfile, G_FILE_TEST_EXISTS)) {
gnome_wp_xml_load_xml (capplet, wpdbfile);
}
g_free (wpdbfile);
xdgdirslist = g_strdup (g_getenv ("XDG_DATA_DIRS"));
if (xdgdirslist == NULL || strlen (xdgdirslist) == 0)
xdgdirslist = g_strdup ("/usr/local/share:/usr/share");
xdgdirs = g_strsplit (xdgdirslist, ":", -1);
for (i = 0; xdgdirs && xdgdirs[i]; i++) {
gchar * datadir;
datadir = g_build_filename (xdgdirs[i], "gnome-wallpaper-properties",
NULL);
if (g_file_test (datadir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
gnome_vfs_directory_list_load (&list, datadir,
GNOME_VFS_FILE_INFO_DEFAULT |
GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
for (l = list; l != NULL; l = l->next) {
GnomeVFSFileInfo * info = l->data;
if (strcmp (".", info->name) != 0 && strcmp ("..", info->name) != 0) {
gchar * filename;
filename = g_build_filename (datadir, info->name, NULL);
gnome_wp_xml_load_xml (capplet, filename);
g_free (filename);
}
}
g_list_free (list);
gnome_vfs_monitor_add (&handle, datadir, GNOME_VFS_MONITOR_DIRECTORY,
(GnomeVFSMonitorCallback) gnome_wp_file_changed,
capplet);
}
g_free (datadir);
}
g_strfreev (xdgdirs);
g_free (xdgdirslist);
wpdbfile = g_build_filename (DATADIR, "gnome-wallpaper-properties", NULL);
if (g_file_test (wpdbfile, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
gnome_vfs_directory_list_load (&list, wpdbfile,
GNOME_VFS_FILE_INFO_DEFAULT |
GNOME_VFS_FILE_INFO_FOLLOW_LINKS);
for (l = list; l != NULL; l = l->next) {
GnomeVFSFileInfo * info = l->data;
if (strcmp (".", info->name) != 0 && strcmp ("..", info->name) != 0) {
gchar * filename;
filename = g_build_filename (wpdbfile, info->name, NULL);
gnome_wp_xml_load_xml (capplet, filename);
g_free (filename);
}
}
g_list_free (list);
gnome_vfs_monitor_add (&handle, wpdbfile, GNOME_VFS_MONITOR_DIRECTORY,
(GnomeVFSMonitorCallback) gnome_wp_file_changed,
capplet);
}
g_free (wpdbfile);
gnome_wp_load_legacy (capplet);
}
static void gnome_wp_list_flatten (const gchar * key, GnomeWPItem * item,
GList ** list) {
g_return_if_fail (key != NULL);
g_return_if_fail (item != NULL);
*list = g_list_append (*list, item);
}
void gnome_wp_xml_save_list (GnomeWPCapplet * capplet) {
xmlDoc * wplist;
xmlNode * root, * wallpaper, * item;
GList * list = NULL, * wp = NULL;
gchar * wpfile;
g_hash_table_foreach (capplet->wphash,
(GHFunc) gnome_wp_list_flatten, &list);
wpfile = g_strconcat (g_get_home_dir (), "/.gnome2/wp-list.xml", NULL);
xmlKeepBlanksDefault (0);
wplist = xmlNewDoc ("1.0");
xmlCreateIntSubset (wplist, "wallpapers", NULL, "gnome-wp-list.dtd");
root = xmlNewNode (NULL, "wallpapers");
xmlDocSetRootElement (wplist, root);
for (wp = list; wp != NULL; wp = wp->next) {
GnomeWPItem * wpitem = wp->data;
wallpaper = xmlNewChild (root, NULL, "wallpaper", NULL);
gnome_wp_xml_set_bool (wallpaper, "deleted", wpitem->deleted);
item = xmlNewTextChild (wallpaper, NULL, "name", wpitem->name);
item = xmlNewTextChild (wallpaper, NULL, "filename", wpitem->filename);
item = xmlNewTextChild (wallpaper, NULL, "options", wpitem->options);
item = xmlNewTextChild (wallpaper, NULL, "shade_type", wpitem->shade_type);
item = xmlNewTextChild (wallpaper, NULL, "pcolor", wpitem->pri_color);
item = xmlNewTextChild (wallpaper, NULL, "scolor", wpitem->sec_color);
}
xmlSaveFormatFile (wpfile, wplist, 1);
xmlFreeDoc (wplist);
g_free (wpfile);
}

View file

@ -0,0 +1,28 @@
/*
* Authors: Rodney Dawes <dobey@ximian.com>
*
* Copyright 2003 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_
void gnome_wp_xml_load_list (GnomeWPCapplet * capplet);
void gnome_wp_xml_save_list (GnomeWPCapplet * capplet);
#endif