diff options
Diffstat (limited to 'libbackground')
-rw-r--r-- | libbackground/preferences.c | 215 | ||||
-rw-r--r-- | libbackground/preferences.h | 23 |
2 files changed, 194 insertions, 44 deletions
diff --git a/libbackground/preferences.c b/libbackground/preferences.c index 491cedf6b..463a9772e 100644 --- a/libbackground/preferences.c +++ b/libbackground/preferences.c @@ -25,7 +25,6 @@ # include "config.h" #endif -#include <string.h> #include <stdlib.h> #include <gnome.h> @@ -42,6 +41,53 @@ static void bg_preferences_class_init (BGPreferencesClass *class); static void bg_preferences_finalize (GObject *object); static GdkColor *read_color_from_string (const gchar *string); +static orientation_t read_orientation_from_string (gchar *string); +static wallpaper_type_t read_wptype_from_string (gchar *string); + +static GEnumValue _bg_wptype_values[] = { + { WPTYPE_TILED, "wallpaper", N_("Tiled") }, + { WPTYPE_CENTERED, "centered", N_("Centered") }, + { WPTYPE_SCALED, "scaled", N_("Scaled") }, + { WPTYPE_STRETCHED, "stretched", N_("Stretched") }, + { WPTYPE_EMBOSSED, "embossed", N_("Embossed") }, + { WPTYPE_NONE, "none", N_("None") }, + { 0, NULL, NULL } +}; + +static GEnumValue _bg_orientation_values[] = { + { ORIENTATION_SOLID, "solid", N_("Solid") }, + { ORIENTATION_HORIZ, "horizontal-gradient", N_("Horizontal Gradient") }, + { ORIENTATION_VERT, "vertical-gradient", N_("Vertical Gradient") }, + { 0, NULL, NULL } +}; + +GType +bg_preferences_wptype_get_type (void) +{ + static GType type = 0; + + if (!type) + { + type = g_enum_register_static ("BgPreferencesWptype", + _bg_wptype_values); + } + + return type; +} + +GType +bg_preferences_orientation_get_type (void) +{ + static GType type = 0; + + if (!type) + { + type = g_enum_register_static ("BgPreferencesOrientation", + _bg_orientation_values); + } + + return type; +} GType bg_preferences_get_type (void) @@ -86,7 +132,7 @@ bg_preferences_init (BGPreferences *prefs, prefs->wallpaper_sel_path = g_strdup (g_get_home_dir ()); prefs->auto_apply = TRUE; prefs->wallpapers = NULL; - prefs->adjust_opacity = FALSE; + prefs->adjust_opacity = TRUE; prefs->opacity = 255; } @@ -174,22 +220,30 @@ bg_preferences_load (BGPreferences *prefs) client = gconf_client_get_default (); - prefs->enabled = gconf_client_get_bool (client, "/desktop/gnome/background/enabled", &error); - prefs->wallpaper_type = gconf_client_get_int (client, "/desktop/gnome/background/wallpaper-type", &error); - prefs->wallpaper_filename = gconf_client_get_string (client, "/desktop/gnome/background/wallpaper-filename", &error); - prefs->wallpaper_enabled = gconf_client_get_bool (client, "/desktop/gnome/background/wallpaper-enabled", &error); - prefs->color1 = read_color_from_string (gconf_client_get_string (client, "/desktop/gnome/background/color1", &error)); - prefs->color2 = read_color_from_string (gconf_client_get_string (client, "/desktop/gnome/background/color2", &error)); - prefs->opacity = gconf_client_get_int (client, "/desktop/gnome/background/opacity", &error); + prefs->enabled = gconf_client_get_bool (client, BG_PREFERENCES_DRAW_BACKGROUND, &error); + prefs->wallpaper_filename = gconf_client_get_string (client, BG_PREFERENCES_PICTURE_FILENAME, &error); + + prefs->color1 = read_color_from_string (gconf_client_get_string (client, BG_PREFERENCES_PRIMARY_COLOR, &error)); + prefs->color2 = read_color_from_string (gconf_client_get_string (client, BG_PREFERENCES_SECONDARY_COLOR, &error)); + + prefs->opacity = gconf_client_get_int (client, BG_PREFERENCES_PICTURE_OPACITY, &error); if (prefs->opacity >= 100 || prefs->opacity < 0) prefs->adjust_opacity = FALSE; - prefs->orientation = gconf_client_get_int (client, "/desktop/gnome/background/orientation", &error); - + prefs->orientation = read_orientation_from_string (gconf_client_get_string (client, BG_PREFERENCES_COLOR_SHADING_TYPE, &error)); if (prefs->orientation == ORIENTATION_SOLID) prefs->gradient_enabled = FALSE; else prefs->gradient_enabled = TRUE; + + prefs->wallpaper_type = read_wptype_from_string (gconf_client_get_string (client, BG_PREFERENCES_PICTURE_OPTIONS, &error)); + + if (prefs->wallpaper_type == -1) { + prefs->wallpaper_enabled = FALSE; + prefs->wallpaper_type = WPTYPE_CENTERED; + } else { + prefs->wallpaper_enabled = TRUE; + } } /* Parse the event name given (the event being notification of a property having @@ -206,10 +260,17 @@ bg_preferences_merge_entry (BGPreferences *prefs, g_return_if_fail (prefs != NULL); g_return_if_fail (IS_BG_PREFERENCES (prefs)); - if (!strcmp (entry->key, "/desktop/gnome/background/wallpaper_type")) { - prefs->wallpaper_type = gconf_value_get_int (value); + if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_OPTIONS)) { + wallpaper_type_t wallpaper_type = read_wptype_from_string (g_strdup (gconf_value_get_string (value))); + if (wallpaper_type == -1) { + prefs->wallpaper_enabled = FALSE; + } else { + prefs->wallpaper_type = wallpaper_type; + prefs->wallpaper_enabled = TRUE; + } + } - else if (!strcmp (entry->key, "/desktop/gnome/background/wallpaper-filename")) { + else if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_FILENAME)) { prefs->wallpaper_filename = g_strdup (gconf_value_get_string (value)); if (prefs->wallpaper_filename != NULL && @@ -219,40 +280,74 @@ bg_preferences_merge_entry (BGPreferences *prefs, else prefs->wallpaper_enabled = FALSE; } - else if (!strcmp (entry->key, "/desktop/gnome/background/color1")) { + else if (!strcmp (entry->key, BG_PREFERENCES_PRIMARY_COLOR)) { prefs->color1 = read_color_from_string (gconf_value_get_string (value)); } - else if (!strcmp (entry->key, "/desktop/gnome/background/color2")) { + else if (!strcmp (entry->key, BG_PREFERENCES_SECONDARY_COLOR)) { prefs->color2 = read_color_from_string (gconf_value_get_string (value)); } - else if (!strcmp (entry->key, "/desktop/gnome/background/opacity")) { + else if (!strcmp (entry->key, BG_PREFERENCES_PICTURE_OPACITY)) { prefs->opacity = gconf_value_get_int (value); if (prefs->opacity >= 100) prefs->adjust_opacity = FALSE; } - else if (!strcmp (entry->key, "/desktop/gnome/background/orientation")) { - prefs->orientation = gconf_value_get_int (value); + else if (!strcmp (entry->key, BG_PREFERENCES_COLOR_SHADING_TYPE)) { + prefs->orientation = read_orientation_from_string (g_strdup (gconf_value_get_string (value))); if (prefs->orientation == ORIENTATION_SOLID) prefs->gradient_enabled = FALSE; else prefs->gradient_enabled = TRUE; } - else if (!strcmp (entry->key, "/desktop/gnome/background/wallpaper-enabled")) { - if (gconf_value_get_bool (value) && - (prefs->wallpaper_filename != NULL) && - strcmp (prefs->wallpaper_filename, "") != 0 && - strcmp (prefs->wallpaper_filename, "(none)") != 0) - prefs->wallpaper_enabled = TRUE; + else if (!strcmp (entry->key, BG_PREFERENCES_DRAW_BACKGROUND)) { + if (gconf_value_get_bool (value)) + prefs->enabled = TRUE; else - prefs->wallpaper_enabled = FALSE; - } - else if (!strcmp (entry->key, "/desktop/gnome/background/wallpaper-type")) { - prefs->wallpaper_type = gconf_value_get_int (value); + prefs->enabled = FALSE; } else { - g_warning ("%s: Unknown property: %s", G_GNUC_FUNCTION, entry->key); + g_warning ("%s: Unknown property: %s", __FUNCTION__, entry->key); + } +} + +static wallpaper_type_t +read_wptype_from_string (gchar *string) +{ + wallpaper_type_t type = -1; + + if (string) { + if (!strncmp (string, "wallpaper", sizeof ("wallpaper"))) { + type = WPTYPE_TILED; + } else if (!strncmp (string, "centered", sizeof ("centered"))) { + type = WPTYPE_CENTERED; + } else if (!strncmp (string, "scaled", sizeof ("scaled"))) { + type = WPTYPE_SCALED; + } else if (!strncmp (string, "stretched", sizeof ("stretched"))) { + type = WPTYPE_STRETCHED; + } else if (!strncmp (string, "embossed", sizeof ("embossed"))) { + type = WPTYPE_EMBOSSED; + } + g_free (string); } + + return type; +} + +static orientation_t +read_orientation_from_string (gchar *string) +{ + orientation_t type = ORIENTATION_SOLID; + + if (string) { + if (!strncmp (string, "vertical-gradient", sizeof ("vertical-gradient"))) { + type = ORIENTATION_VERT; + } else if (!strncmp (string, "horizontal-gradient", sizeof ("horizontal-gradient"))) { + type = ORIENTATION_HORIZ; + } + g_free (string); + } + + return type; } static GdkColor * @@ -269,16 +364,51 @@ read_color_from_string (const gchar *string) ((color->green >> 8) << 8) || (color->blue >> 8); #if 0 + /* fixme: I am not sure, but this can be accomplished otherwise */ color->pixel = gdk_rgb_xpixel_from_rgb (rgb); -#else - gdk_rgb_find_color (gdk_rgb_get_colormap (), color); #endif } return color; } -#define DGB "/desktop/gnome/background/" +const gchar* +bg_preferences_get_wptype_as_string (wallpaper_type_t wp) +{ + switch (wp) + { + case WPTYPE_TILED: + return "wallpaper"; + case WPTYPE_CENTERED: + return "centered"; + case WPTYPE_SCALED: + return "scaled"; + case WPTYPE_STRETCHED: + return "stretched"; + case WPTYPE_EMBOSSED: + return "embossed"; + case WPTYPE_NONE: + return "none"; + } + + return NULL; +} + +const gchar* +bg_preferences_get_orientation_as_string (orientation_t o) +{ + switch (o) + { + case ORIENTATION_SOLID: + return "solid"; + case ORIENTATION_HORIZ: + return "horizontal-gradient"; + case ORIENTATION_VERT: + return "vertical-gradient"; + } + + return NULL; +} void bg_preferences_save (BGPreferences *prefs) @@ -290,29 +420,32 @@ bg_preferences_save (BGPreferences *prefs) g_return_if_fail (IS_BG_PREFERENCES (prefs)); cs = gconf_change_set_new (); - gconf_change_set_set_bool (cs, DGB "enabled", prefs->enabled); - gconf_change_set_set_bool (cs, DGB "wallpaper-enabled", prefs->wallpaper_enabled); - gconf_change_set_set_int (cs, DGB "wallpaper-type", prefs->wallpaper_type); - gconf_change_set_set_string (cs, DGB "wallpaper-filename", prefs->wallpaper_filename); + gconf_change_set_set_bool (cs, BG_PREFERENCES_DRAW_BACKGROUND, prefs->enabled); + if (prefs->wallpaper_enabled) + gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_OPTIONS, bg_preferences_get_wptype_as_string (prefs->wallpaper_type)); + else + gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_OPTIONS, "none"); + + gconf_change_set_set_string (cs, BG_PREFERENCES_PICTURE_FILENAME, prefs->wallpaper_filename); tmp = g_strdup_printf ("#%02x%02x%02x", prefs->color1->red >> 8, prefs->color1->green >> 8, prefs->color1->blue >> 8); - gconf_change_set_set_string (cs, DGB "color1", tmp); + gconf_change_set_set_string (cs, BG_PREFERENCES_PRIMARY_COLOR, tmp); g_free (tmp); tmp = g_strdup_printf ("#%02x%02x%02x", prefs->color2->red >> 8, prefs->color2->green >> 8, prefs->color2->blue >> 8); - gconf_change_set_set_string (cs, DGB "color2", tmp); + gconf_change_set_set_string (cs, BG_PREFERENCES_SECONDARY_COLOR, tmp); g_free (tmp); - gconf_change_set_set_int (cs, DGB "orientation", prefs->orientation); + gconf_change_set_set_string (cs, BG_PREFERENCES_COLOR_SHADING_TYPE, bg_preferences_get_orientation_as_string (prefs->orientation)); + gconf_client_commit_change_set (gconf_client_get_default (), cs, TRUE, NULL); gconf_change_set_unref (cs); } -#undef DGB diff --git a/libbackground/preferences.h b/libbackground/preferences.h index ff41c2866..ab57d1cba 100644 --- a/libbackground/preferences.h +++ b/libbackground/preferences.h @@ -32,16 +32,27 @@ #define BG_PREFERENCES_CLASS(klass) G_TYPE_CHECK_CLASS_CAST (klass, bg_preferences_get_type (), BGPreferencesClass) #define IS_BG_PREFERENCES(obj) G_TYPE_CHECK_INSTANCE_TYPE (obj, bg_preferences_get_type ()) +#define BG_PREFERENCES_DRAW_BACKGROUND "/desktop/gnome/background/draw_background" +#define BG_PREFERENCES_PRIMARY_COLOR "/desktop/gnome/background/primary_color" +#define BG_PREFERENCES_SECONDARY_COLOR "/desktop/gnome/background/secondary_color" +#define BG_PREFERENCES_COLOR_SHADING_TYPE "/desktop/gnome/background/color_shading_type" +#define BG_PREFERENCES_PICTURE_OPTIONS "/desktop/gnome/background/picture_options" +#define BG_PREFERENCES_PICTURE_OPACITY "/desktop/gnome/background/picture_opacity" +#define BG_PREFERENCES_PICTURE_FILENAME "/desktop/gnome/background/picture_filename" + + typedef struct _BGPreferences BGPreferences; typedef struct _BGPreferencesClass BGPreferencesClass; typedef enum _orientation_t { - ORIENTATION_SOLID, ORIENTATION_HORIZ, ORIENTATION_VERT + ORIENTATION_SOLID = 0, + ORIENTATION_HORIZ, + ORIENTATION_VERT } orientation_t; typedef enum _wallpaper_type_t { - WPTYPE_TILED, WPTYPE_CENTERED, WPTYPE_SCALED, - WPTYPE_STRETCHED, WPTYPE_EMBOSSED + WPTYPE_TILED = 0, WPTYPE_CENTERED, WPTYPE_SCALED, + WPTYPE_STRETCHED, WPTYPE_EMBOSSED, WPTYPE_NONE } wallpaper_type_t; struct _BGPreferences @@ -87,4 +98,10 @@ void bg_preferences_merge_entry (BGPreferences *prefs, void bg_preferences_save (BGPreferences *prefs); +const gchar *bg_preferences_get_wptype_as_string (wallpaper_type_t wp); +const gchar *bg_preferences_get_orientation_as_string (orientation_t o); +GType bg_preferences_wptype_get_type (void); +GType bg_preferences_orientation_get_type (void); + + #endif /* __PREFERENCES_H */ |