diff options
author | William Jon McCann <jmccann@redhat.com> | 2008-05-12 19:36:02 +0000 |
---|---|---|
committer | William Jon McCann <mccann@src.gnome.org> | 2008-05-12 19:36:02 +0000 |
commit | bfc5a08b4d41fe993dd889dc64d211d5ff391e2f (patch) | |
tree | c14d588d2cf7f562f5af932df0d07ea0d6bc6f18 | |
parent | 774811d74b258b900f0267d8eab61250f191c956 (diff) | |
download | gnome-desktop-bfc5a08b4d41fe993dd889dc64d211d5ff391e2f.tar.gz |
Add gnome_bg_load_from_preferences(). So applications don't have to rely
2008-05-12 William Jon McCann <jmccann@redhat.com>
* gnome-bg.c (set_color_from_string), (set_color_type_from_string),
(set_placement_from_string), (do_changed), (queue_changed),
(gnome_bg_load_from_preferences), (gnome_bg_finalize),
(gnome_bg_class_init), (gnome_bg_set_color),
(gnome_bg_set_placement), (gnome_bg_set_uri), (on_timeout):
* libgnomeui/gnome-bg.h:
Add gnome_bg_load_from_preferences(). So applications don't
have to rely on libbackground. Fixes #532414
svn path=/trunk/; revision=5076
-rw-r--r-- | libgnome-desktop/ChangeLog | 11 | ||||
-rw-r--r-- | libgnome-desktop/gnome-bg.c | 189 | ||||
-rw-r--r-- | libgnome-desktop/libgnomeui/gnome-bg.h | 18 |
3 files changed, 180 insertions, 38 deletions
diff --git a/libgnome-desktop/ChangeLog b/libgnome-desktop/ChangeLog index a8b58401..bc97defa 100644 --- a/libgnome-desktop/ChangeLog +++ b/libgnome-desktop/ChangeLog @@ -1,3 +1,14 @@ +2008-05-12 William Jon McCann <jmccann@redhat.com> + + * gnome-bg.c (set_color_from_string), (set_color_type_from_string), + (set_placement_from_string), (do_changed), (queue_changed), + (gnome_bg_load_from_preferences), (gnome_bg_finalize), + (gnome_bg_class_init), (gnome_bg_set_color), + (gnome_bg_set_placement), (gnome_bg_set_uri), (on_timeout): + * libgnomeui/gnome-bg.h: + Add gnome_bg_load_from_preferences(). So applications don't + have to rely on libbackground. Fixes #532414 + 2008-05-05 Vincent Untz <vuntz@gnome.org> * gnome-bg.c: (get_scaled_pixbuf): simplify diff --git a/libgnome-desktop/gnome-bg.c b/libgnome-desktop/gnome-bg.c index bd950a6d..04e9a6c3 100644 --- a/libgnome-desktop/gnome-bg.c +++ b/libgnome-desktop/gnome-bg.c @@ -1,9 +1,9 @@ /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- - + gnomebg.c: Object for the desktop background. Copyright (C) 2000 Eazel, Inc. -Copyright (C) 2007 Red Hat, Inc. +Copyright (C) 2007-2008 Red Hat, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as @@ -34,21 +34,31 @@ Author: Soren Sandmann <sandmann@redhat.com> #include <gio/gio.h> #include <gdk/gdkx.h> -#include <libgnomeui/libgnomeui.h> #include <X11/Xlib.h> #include <X11/Xatom.h> +#include <gconf/gconf-client.h> +#include <libgnomeui/libgnomeui.h> + #define GNOME_DESKTOP_USE_UNSTABLE_API #include <libgnomeui/gnome-bg.h> +#define BG_KEY_DRAW_BACKGROUND GNOME_BG_KEY_DIR "/draw_background" +#define BG_KEY_PRIMARY_COLOR GNOME_BG_KEY_DIR "/primary_color" +#define BG_KEY_SECONDARY_COLOR GNOME_BG_KEY_DIR "/secondary_color" +#define BG_KEY_COLOR_SHADING_TYPE GNOME_BG_KEY_DIR "/color_shading_type" +#define BG_KEY_PICTURE_OPTIONS GNOME_BG_KEY_DIR "/picture_options" +#define BG_KEY_PICTURE_OPACITY GNOME_BG_KEY_DIR "/picture_opacity" +#define BG_KEY_PICTURE_FILENAME GNOME_BG_KEY_DIR "/picture_filename" + typedef struct _SlideShow SlideShow; typedef struct _Slide Slide; struct _Slide { double duration; /* in seconds */ - gboolean fixed; - + gboolean fixed; + char *file1; char *file2; /* NULL if fixed is TRUE */ }; @@ -66,14 +76,13 @@ typedef struct FileCacheEntry FileCacheEntry; */ struct _GnomeBG { - GObject parent_instance; - + GObject parent_instance; char * uri; GnomeBGPlacement placement; GnomeBGColorType color_type; GdkColor c1; GdkColor c2; - + /* Cached information, only access through cache accessor functions */ SlideShow * slideshow; time_t uri_mtime; @@ -81,6 +90,8 @@ struct _GnomeBG int timeout_id; GList * file_cache; + + guint changed_id; }; struct _GnomeBGClass @@ -143,12 +154,130 @@ static GdkPixbuf *create_img_thumbnail (GnomeBG *bg, GdkScreen *screen, int dest_width, int dest_height); -static SlideShow * get_as_slideshow (GnomeBG *bg, +static SlideShow * get_as_slideshow (GnomeBG *bg, const char *uri); static Slide * get_current_slide (SlideShow *show, double *alpha); static void +set_color_from_string (const char *string, + GdkColor *colorp) +{ + /* If all else fails use black */ + if (string == NULL || !gdk_color_parse (string, colorp)) { + gdk_color_parse ("black", colorp); + } + gdk_rgb_find_color (gdk_rgb_get_colormap (), colorp); +} + + +static void +set_color_type_from_string (const char *string, + GnomeBGColorType *color_type) +{ + *color_type = GNOME_BG_COLOR_SOLID; + + if (string != NULL) { + if (!strncmp (string, "vertical-gradient", sizeof ("vertical-gradient"))) { + *color_type = GNOME_BG_COLOR_V_GRADIENT; + } else if (!strncmp (string, "horizontal-gradient", sizeof ("horizontal-gradient"))) { + *color_type = GNOME_BG_COLOR_H_GRADIENT; + } + } +} + +static void +set_placement_from_string (const char *string, + GnomeBGPlacement *placement) +{ + *placement = GNOME_BG_PLACEMENT_ZOOMED; + + if (string != NULL) { + if (!strncmp (string, "wallpaper", sizeof ("wallpaper"))) { + *placement = GNOME_BG_PLACEMENT_TILED; + } else if (!strncmp (string, "centered", sizeof ("centered"))) { + *placement = GNOME_BG_PLACEMENT_CENTERED; + } else if (!strncmp (string, "scaled", sizeof ("scaled"))) { + *placement = GNOME_BG_PLACEMENT_SCALED; + } else if (!strncmp (string, "stretched", sizeof ("stretched"))) { + *placement = GNOME_BG_PLACEMENT_FILL_SCREEN; + } else if (!strncmp (string, "zoom", sizeof ("zoom"))) { + *placement = GNOME_BG_PLACEMENT_ZOOMED; + } + } +} + +static gboolean +do_changed (GnomeBG *bg) +{ + bg->changed_id = 0; + + g_signal_emit (G_OBJECT (bg), signals[CHANGED], 0); + + return FALSE; +} + +static void +queue_changed (GnomeBG *bg) +{ + if (bg->changed_id > 0) { + g_source_remove (bg->changed_id); + } + + bg->changed_id = g_idle_add_full (G_PRIORITY_LOW, + (GSourceFunc)do_changed, + bg, + NULL); +} + +void +gnome_bg_load_from_preferences (GnomeBG *bg, + GConfClient *client) +{ + char *tmp; + char *uri; + + g_return_if_fail (GNOME_IS_BG (bg)); + g_return_if_fail (client != NULL); + + /* Filename */ + uri = NULL; + tmp = gconf_client_get_string (client, BG_KEY_PICTURE_FILENAME, NULL); + if (tmp != NULL) { + if (g_utf8_validate (tmp, -1, NULL) && + g_file_test (tmp, G_FILE_TEST_EXISTS)) { + uri = g_strdup (tmp); + } else { + uri = g_filename_from_utf8 (tmp, -1, NULL, NULL, NULL); + } + } + g_free (tmp); + + /* Colors */ + tmp = gconf_client_get_string (client, BG_KEY_PRIMARY_COLOR, NULL); + set_color_from_string (tmp, &bg->c1); + g_free (tmp); + + tmp = gconf_client_get_string (client, BG_KEY_SECONDARY_COLOR, NULL); + set_color_from_string (tmp, &bg->c2); + g_free (tmp); + + /* Color type */ + tmp = gconf_client_get_string (client, BG_KEY_COLOR_SHADING_TYPE, NULL); + set_color_type_from_string (tmp, &bg->color_type); + g_free (tmp); + + /* Placement */ + tmp = gconf_client_get_string (client, BG_KEY_PICTURE_OPTIONS, NULL); + set_placement_from_string (tmp, &bg->placement); + g_free (tmp); + + gnome_bg_set_uri (bg, uri); + + queue_changed (bg); +} + +static void gnome_bg_init (GnomeBG *bg) { } @@ -157,19 +286,24 @@ static void gnome_bg_finalize (GObject *object) { GnomeBG *bg = GNOME_BG (object); - + + if (bg->changed_id != 0) { + g_source_remove (bg->changed_id); + bg->changed_id = 0; + } + clear_cache (bg); - + G_OBJECT_CLASS (gnome_bg_parent_class)->finalize (object); } static void -gnome_bg_class_init (GnomeBGClass *class) +gnome_bg_class_init (GnomeBGClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (class); - + GObjectClass *object_class = G_OBJECT_CLASS (klass); + object_class->finalize = gnome_bg_finalize; - + signals[CHANGED] = g_signal_new ("changed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, @@ -179,12 +313,6 @@ gnome_bg_class_init (GnomeBGClass *class) G_TYPE_NONE, 0); } -static void -emit_changed (GnomeBG *bg) -{ - g_signal_emit (G_OBJECT (bg), signals[CHANGED], 0); -} - GnomeBG * gnome_bg_new (void) { @@ -206,18 +334,18 @@ gnome_bg_set_color (GnomeBG *bg, GdkColor *c2) { g_return_if_fail (bg != NULL); - + if (bg->color_type != type || !colors_equal (&bg->c1, c1) || (c2 && !colors_equal (&bg->c2, c2))) { - + bg->color_type = type; - bg->c1 = *c1; + bg->c1 = *c1; if (c2) { bg->c2 = *c2; } - - emit_changed (bg); + + queue_changed (bg); } } @@ -230,7 +358,7 @@ gnome_bg_set_placement (GnomeBG *bg, if (bg->placement != placement) { bg->placement = placement; - emit_changed (bg); + queue_changed (bg); } } @@ -242,8 +370,9 @@ gnome_bg_set_uri (GnomeBG *bg, g_return_if_fail (bg != NULL); - if (g_path_is_absolute (uri)) + if (g_path_is_absolute (uri)) { uri = free_me = g_filename_to_uri (uri, NULL, NULL); + } if (is_different (bg, uri)) { char *tmp = g_strdup (uri); @@ -256,7 +385,7 @@ gnome_bg_set_uri (GnomeBG *bg, clear_cache (bg); - emit_changed (bg); + queue_changed (bg); } g_free (free_me); @@ -1043,7 +1172,7 @@ on_timeout (gpointer data) bg->timeout_id = 0; - emit_changed (bg); + queue_changed (bg); return FALSE; } diff --git a/libgnome-desktop/libgnomeui/gnome-bg.h b/libgnome-desktop/libgnomeui/gnome-bg.h index 4b6bce15..002d9f22 100644 --- a/libgnome-desktop/libgnomeui/gnome-bg.h +++ b/libgnome-desktop/libgnomeui/gnome-bg.h @@ -29,12 +29,11 @@ #error GnomeBG is unstable API. You must define GNOME_DESKTOP_USE_UNSTABLE_API before including gnome-bg.h #endif -#ifdef __cplusplus -extern "C" { -#endif - #include <libgnomeui/libgnomeui.h> #include <gdk/gdk.h> +#include <gconf/gconf-client.h> + +G_BEGIN_DECLS #define GNOME_TYPE_BG (gnome_bg_get_type ()) #define GNOME_BG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_BG, GnomeBG)) @@ -43,6 +42,8 @@ extern "C" { #define GNOME_IS_BG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_BG)) #define GNOME_BG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_BG, GnomeBGClass)) +#define GNOME_BG_KEY_DIR "/desktop/gnome/background" + typedef struct _GnomeBG GnomeBG; typedef struct _GnomeBGClass GnomeBGClass; @@ -62,6 +63,10 @@ typedef enum { GType gnome_bg_get_type (void); GnomeBG * gnome_bg_new (void); + +void gnome_bg_load_from_preferences (GnomeBG *bg, + GConfClient *client); + void gnome_bg_set_placement (GnomeBG *img, GnomeBGPlacement placement); void gnome_bg_set_color (GnomeBG *img, @@ -94,9 +99,6 @@ gboolean gnome_bg_changes_with_size (GnomeBG *img); void gnome_bg_set_pixmap_as_root (GdkScreen *screen, GdkPixmap *pixmap); - -#ifdef __cplusplus -} -#endif +G_END_DECLS #endif |