[gnome-commander/GSettings] Adds migration of custom colours into GSettings



commit ac2d4dc64f365e571a3922e0f914cc9a38575ec2
Author: Uwe Scholz <uwescholz src gnome org>
Date:   Wed Jun 29 21:33:55 2016 +0200

    Adds migration of custom colours into GSettings
    
    As colours are represented by a string of special form, i.e.
    '#rrrrggggbbbb', this commit for the migration of custom colours is a
    bit longer than the others. I introduced some new functions for
    validation of a colour string, so that miss-configuration of the
    GSettings values for colour keys should not be possible so easily.

 data/org.gnome.gnome-commander.gschema.xml |   81 +++--
 src/gnome-cmd-data.cc                      |  434 +++++++++++++++++++++++-----
 src/gnome-cmd-data.h                       |   17 +-
 3 files changed, 431 insertions(+), 101 deletions(-)
---
diff --git a/data/org.gnome.gnome-commander.gschema.xml b/data/org.gnome.gnome-commander.gschema.xml
index 7443419..2975342 100644
--- a/data/org.gnome.gnome-commander.gschema.xml
+++ b/data/org.gnome.gnome-commander.gschema.xml
@@ -92,7 +92,6 @@
     <value nick="cafezinho" value="5"/>
     <value nick="green tiger" value="6"/>
     <value nick="custom" value="7"/>
-    <value nick="color modes" value="8"/>
   </enum>
 
   <schema gettext-domain="gnome-commander" id="org.gnome.gnome-commander.preferences.general" 
path="/org/gnome/gnome-commander/preferences/general/">
@@ -698,45 +697,61 @@
           This option defines the current color theme.
       </description>
     </key>
-    <key name="norm-fg" type="s">
-      <default l10n="messages">'#ffffff'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-norm-fg" type="s">
+      <default l10n="messages">'#ffffffffffff'</default>
+      <summary>Normal foreground color</summary>
+      <description>
+          Normal foreground color in custom mode.
+      </description>
     </key>
-    <key name="norm-bg" type="s">
-      <default l10n="messages">'#000000'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-norm-bg" type="s">
+      <default l10n="messages">'#000000004444'</default>
+      <summary>Normal background color</summary>
+      <description>
+          Normal background color in custom mode.
+      </description>
     </key>
-    <key name="alt-fg" type="s">
-      <default l10n="messages">'#ffffff'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-alt-fg" type="s">
+      <default l10n="messages">'#ffffffffffff'</default>
+      <summary>Alternate foreground color</summary>
+      <description>
+          Alternate foreground color in custom mode.
+      </description>
     </key>
-    <key name="alt-bg" type="s">
-      <default l10n="messages">'#000000'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-alt-bg" type="s">
+      <default l10n="messages">'#000000004444'</default>
+      <summary>Alternate background color</summary>
+      <description>
+           Alternate background color in custom mode.
+      </description>
     </key>
-    <key name="sel-fg" type="s">
-      <default l10n="messages">'#ff0000'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-sel-fg" type="s">
+      <default l10n="messages">'#ffff00000000'</default>
+      <summary>Selection foreground color</summary>
+      <description>
+           Foreground color for selections in custom mode.
+      </description>
     </key>
-    <key name="sel-bg" type="s">
-      <default l10n="messages">'#0000a4'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-sel-bg" type="s">
+      <default l10n="messages">'#000000004444'</default>
+      <summary>Selection background color</summary>
+      <description>
+           Background color for selections in custom mode.
+      </description>
     </key>
-    <key name="curs-fg" type="s">
-      <default l10n="messages">'#000000'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-curs-fg" type="s">
+      <default l10n="messages">'#000000000000'</default>
+      <summary>Cursor foreground color</summary>
+      <description>
+           Cursor foreground color in custom mode.
+      </description>
     </key>
-    <key name="curs-bg" type="s">
-      <default l10n="messages">'#a4a4a4'</default>
-      <summary></summary>
-      <description></description>
+    <key name="custom-curs-bg" type="s">
+      <default l10n="messages">'#aaaaaaaaaaaa'</default>
+      <summary>Cursor background color</summary>
+      <description>
+           Cursor background color in custom mode.
+      </description>
     </key>
     <key name="use-ls-colors" type="b">
       <default l10n="messages">false</default>
diff --git a/src/gnome-cmd-data.cc b/src/gnome-cmd-data.cc
index f171066..5114338 100644
--- a/src/gnome-cmd-data.cc
+++ b/src/gnome-cmd-data.cc
@@ -350,7 +350,7 @@ void on_symlink_string_changed ()
     gnome_cmd_data.options.symlink_prefix = g_settings_get_string 
(gnome_cmd_data.options.gcmd_settings->general, GCMD_SETTINGS_SYMLINK_PREFIX);
 }
 
-void on_layout_option_changed()
+void on_theme_changed()
 {
     gint theme;
 
@@ -360,6 +360,114 @@ void on_layout_option_changed()
     main_win->update_view();
 }
 
+void on_custom_color_changed()
+{
+    gint theme;
+    gchar *colorstring_new;
+    gchar *colorstring_old;
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_NORM_FG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_FG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_NORM_BG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_BG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_ALT_FG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_FG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_ALT_BG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_BG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'",  colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_SEL_FG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_FG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'",  colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_SEL_BG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_BG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_CURS_FG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_FG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
+    g_free(colorstring_new);
+
+    colorstring_new = g_settings_get_string (gnome_cmd_data.options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_CURS_BG);
+    if (!gnome_cmd_data.is_valid_color_string(colorstring_new))
+    {
+        colorstring_old = gdk_color_to_string 
(gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
+        g_settings_set_string (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_BG, 
colorstring_old);
+        g_warning("Illegal color string \'%s\'. Resetting to old value \'%s\'", colorstring_new, 
colorstring_old);
+        g_free(colorstring_old);
+    }
+    else
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring_new, 
gnome_cmd_data.options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
+    g_free(colorstring_new);
+
+    theme = g_settings_get_enum (gnome_cmd_data.options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_THEME);
+
+    if ((GnomeCmdColorMode) theme == GNOME_CMD_COLOR_CUSTOM)
+        main_win->update_view();
+}
+
 static void gcmd_settings_class_init (GcmdSettingsClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -553,9 +661,48 @@ static void gcmd_connect_gsettings_signals(GcmdSettings *gs)
 
     g_signal_connect (gs->colors,
                       "changed::theme",
-                      G_CALLBACK (on_layout_option_changed),
+                      G_CALLBACK (on_theme_changed),
                       NULL);
 
+    g_signal_connect (gs->colors,
+                      "changed::custom-norm-fg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-norm-bg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-alt-fg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-alt-bg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-sel-fg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-sel-bg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-curs-fg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
+
+    g_signal_connect (gs->colors,
+                      "changed::custom-curs-bg",
+                      G_CALLBACK (on_custom_color_changed),
+                      NULL);
 }
 
 
@@ -807,26 +954,6 @@ inline void GnomeCmdData::set_color (const gchar *path, GdkColor *color)
 }
 
 
-inline void GnomeCmdData::get_color (const gchar *path, GdkColor *color)
-{
-    gint red, green, blue;
-    gchar *def = g_strdup_printf ("%d %d %d",
-                                  color->red, color->green, color->blue);
-    gchar *color_str = get_string (path, def);
-    if (sscanf (color_str, "%u %u %u", &red, &green, &blue) != 3)
-        g_printerr ("Illegal color in config file\n");
-
-    if (color_str != def)
-        g_free (color_str);
-
-    color->red   = (gushort) red;
-    color->green = (gushort) green;
-    color->blue  = (gushort) blue;
-
-    g_free (def);
-}
-
-
 inline XML::xstream &operator << (XML::xstream &xml, GnomeCmdBookmark &bookmark)
 {
     xml << XML::tag("Bookmark") << XML::attr("name") << XML::escape(bookmark.name);
@@ -2091,6 +2218,41 @@ void GnomeCmdData::migrate_all_data_to_gsettings()
         //mode
         migrate_data_int_value_into_gsettings(gnome_cmd_data_get_int ("/colors/mode", 
GNOME_CMD_COLOR_GREEN_TIGER),
                                                         options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_THEME);
+        GdkColor *color = g_new0 (GdkColor, 1);
+        //custom.norm_fg
+        gnome_cmd_data_get_color_gnome_config ("/colors/norm_fg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_NORM_FG);
+        //custom.norm_bg
+        gnome_cmd_data_get_color_gnome_config ("/colors/norm_bg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_NORM_BG);
+        //custom.alt_fg
+        gnome_cmd_data_get_color_gnome_config ("/colors/alt_fg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_FG);
+        //custom.alt_bg
+        gnome_cmd_data_get_color_gnome_config ("/colors/alt_bg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_BG);
+        //custom.sel_fg
+        gnome_cmd_data_get_color_gnome_config ("/colors/sel_fg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_FG);
+        //custom.sel_bg
+        gnome_cmd_data_get_color_gnome_config ("/colors/sel_bg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_BG);
+        //custom.curs_fg
+        gnome_cmd_data_get_color_gnome_config ("/colors/curs_fg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_CURS_FG);
+        //custom.curs_bg
+        gnome_cmd_data_get_color_gnome_config ("/colors/curs_bg", color);
+        migrate_data_string_value_into_gsettings(gdk_color_to_string (color),
+                                                 options.gcmd_settings->colors, 
GCMD_SETTINGS_COLORS_CURS_BG);
+
+        g_free(color);
         // ToDo: Move old xml-file to ~/.gnome-commander/gnome-commander.xml.backup
         //       à la save_devices_old ("devices.backup");
         //       and move .gnome2/gnome-commander to .gnome2/gnome-commander.backup
@@ -2101,22 +2263,104 @@ void GnomeCmdData::migrate_all_data_to_gsettings()
     gcmd_connect_gsettings_signals(gnome_cmd_data.options.gcmd_settings);
 }
 
+/**
+ * This function checks if the given GSettings keys enholds a valid color string. If not,
+ * the keys value is resetted to the default value.
+ * @returns TRUE if the current value is resetted by the default value, else FALSE
+ */
+gboolean GnomeCmdData::set_valid_color_string(GSettings *settings, const char* key)
+{
+    gchar *colorstring;
+    gboolean return_value;
+
+    colorstring = g_settings_get_string (settings, key);
+    if (!is_valid_color_string(colorstring))
+    {
+        GVariant *variant;
+        variant = g_settings_get_default_value (settings, key);
+        g_warning("Illegal color string \'%s\' for gsettings key %s. Resetting to default value \'%s\'",
+                  colorstring, key, g_variant_get_string(variant, NULL));
+        g_settings_set_string (settings, key, g_variant_get_string(variant, NULL));
+        g_variant_unref (variant);
+        return_value = TRUE;
+    }
+    else
+        return_value = FALSE;
+
+    g_free(colorstring);
+
+    return return_value;
+}
 
 void GnomeCmdData::load()
 {
     gchar *xml_cfg_path = config_dir ? g_build_filename (config_dir, PACKAGE ".xml", NULL) : 
g_build_filename (g_get_home_dir (), "." PACKAGE, PACKAGE ".xml", NULL);
+    gchar *colorstring;
 
     priv = g_new0 (Private, 1);
 
     options.color_themes[GNOME_CMD_COLOR_CUSTOM].respect_theme = FALSE;
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg = gdk_color_new (0xffff,0xffff,0xffff);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg = gdk_color_new (0,0,0x4444);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg = gdk_color_new (0xffff,0xffff,0xffff);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg = gdk_color_new (0,0,0x4444);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg = gdk_color_new (0xffff,0,0);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg = gdk_color_new (0,0,0x4444);
+
+    /* Initialization */
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg = gdk_color_new (0,0,0);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg = gdk_color_new (0,0,0);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg = gdk_color_new (0,0,0);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg = gdk_color_new (0,0,0);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg = gdk_color_new (0,0,0);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg = gdk_color_new (0,0,0);
     options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg = gdk_color_new (0,0,0);
-    options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg = gdk_color_new (0xaaaa,0xaaaa,0xaaaa);
+    options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg = gdk_color_new (0,0,0);
+    /* Loading of actual values */
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_FG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_FG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
+        g_free(colorstring);
+    }
+
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_BG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_BG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_FG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_FG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_BG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_BG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_FG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_FG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_BG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_BG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_FG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_FG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
+        g_free(colorstring);
+    }
+    if (set_valid_color_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_BG) == FALSE)
+    {
+        colorstring = g_settings_get_string (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_BG);
+        gnome_cmd_data.gnome_cmd_data_parse_color(colorstring, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
+        g_free(colorstring);
+    }
+    colorstring = NULL;
 
     options.color_themes[GNOME_CMD_COLOR_MODERN].respect_theme = FALSE;
     options.color_themes[GNOME_CMD_COLOR_MODERN].norm_fg = gdk_color_new (0,0,0);
@@ -2232,15 +2476,6 @@ void GnomeCmdData::load()
     options.color_mode = gcmd_owner.is_root() ? (GnomeCmdColorMode) g_settings_get_enum 
(options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_THEME)
                                               : (GnomeCmdColorMode) GNOME_CMD_COLOR_DEEP_BLUE;
 
-    gnome_cmd_data_get_color ("/colors/norm_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
-    gnome_cmd_data_get_color ("/colors/norm_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
-    gnome_cmd_data_get_color ("/colors/alt_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
-    gnome_cmd_data_get_color ("/colors/alt_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
-    gnome_cmd_data_get_color ("/colors/sel_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
-    gnome_cmd_data_get_color ("/colors/sel_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
-    gnome_cmd_data_get_color ("/colors/curs_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
-    gnome_cmd_data_get_color ("/colors/curs_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
-
     options.use_ls_colors = gnome_cmd_data_get_bool ("/colors/use_ls_colors", FALSE);
 
     options.ls_colors_palette.black_fg = gdk_color_new (0, 0, 0);
@@ -2309,22 +2544,22 @@ void GnomeCmdData::load()
 
     options.device_only_icon = gnome_cmd_data_get_bool ("/devices/only_icon", FALSE);
 
-    gnome_cmd_data_get_color ("/colors/ls_colors_black_fg", options.ls_colors_palette.black_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_black_bg", options.ls_colors_palette.black_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_red_fg", options.ls_colors_palette.red_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_red_bg", options.ls_colors_palette.red_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_green_fg", options.ls_colors_palette.green_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_green_bg", options.ls_colors_palette.green_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_yellow_fg", options.ls_colors_palette.yellow_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_yellow_bg", options.ls_colors_palette.yellow_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_blue_fg", options.ls_colors_palette.blue_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_blue_bg", options.ls_colors_palette.blue_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_magenta_fg", options.ls_colors_palette.magenta_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_magenta_bg", options.ls_colors_palette.magenta_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_cyan_fg", options.ls_colors_palette.cyan_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_cyan_bg", options.ls_colors_palette.cyan_bg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_white_fg", options.ls_colors_palette.white_fg);
-    gnome_cmd_data_get_color ("/colors/ls_colors_white_bg", options.ls_colors_palette.white_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_black_fg", options.ls_colors_palette.black_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_black_bg", options.ls_colors_palette.black_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_red_fg", options.ls_colors_palette.red_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_red_bg", options.ls_colors_palette.red_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_green_fg", options.ls_colors_palette.green_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_green_bg", options.ls_colors_palette.green_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_yellow_fg", 
options.ls_colors_palette.yellow_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_yellow_bg", 
options.ls_colors_palette.yellow_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_blue_fg", options.ls_colors_palette.blue_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_blue_bg", options.ls_colors_palette.blue_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_magenta_fg", 
options.ls_colors_palette.magenta_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_magenta_bg", 
options.ls_colors_palette.magenta_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_cyan_fg", options.ls_colors_palette.cyan_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_cyan_bg", options.ls_colors_palette.cyan_bg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_white_fg", options.ls_colors_palette.white_fg);
+    gnome_cmd_data_get_color_gnome_config ("/colors/ls_colors_white_bg", options.ls_colors_palette.white_bg);
 
     options.save_dirs_on_exit = g_settings_get_boolean (options.gcmd_settings->general, 
GCMD_SETTINGS_SAVE_DIRS_ON_EXIT);
     options.save_tabs_on_exit = g_settings_get_boolean (options.gcmd_settings->general, 
GCMD_SETTINGS_SAVE_TABS_ON_EXIT);
@@ -2768,14 +3003,14 @@ void GnomeCmdData::save()
 
     set_gsettings_enum_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_THEME, 
options.color_mode);
 
-    gnome_cmd_data_set_color  ("/colors/norm_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
-    gnome_cmd_data_set_color  ("/colors/norm_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
-    gnome_cmd_data_set_color  ("/colors/alt_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
-    gnome_cmd_data_set_color  ("/colors/alt_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
-    gnome_cmd_data_set_color  ("/colors/sel_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
-    gnome_cmd_data_set_color  ("/colors/sel_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
-    gnome_cmd_data_set_color  ("/colors/curs_fg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
-    gnome_cmd_data_set_color  ("/colors/curs_bg", options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_FG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_fg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_NORM_BG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].norm_bg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_FG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_fg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_ALT_BG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].alt_bg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_FG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_fg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_SEL_BG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].sel_bg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_FG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_fg);
+    set_gsettings_color_when_changed (options.gcmd_settings->colors, GCMD_SETTINGS_COLORS_CURS_BG, 
options.color_themes[GNOME_CMD_COLOR_CUSTOM].curs_bg);
 
     gnome_cmd_data_set_bool   ("/colors/use_ls_colors", options.use_ls_colors);
 
@@ -3021,13 +3256,67 @@ void GnomeCmdData::gnome_cmd_data_set_color (const gchar *path, GdkColor *color)
     g_free (s);
 }
 
-void GnomeCmdData::gnome_cmd_data_get_color (const gchar *path, GdkColor *color)
+/**
+ * This function tests if the given colorstring enholds a valid color-describing string.
+ * See documentation of gdk_color_parse() for valid strings.
+ * @returns TRUE if the string is a valid color representation, else FALSE.
+ */
+gboolean GnomeCmdData::is_valid_color_string(const char *colorstring)
 {
-    gchar *s = g_build_path (G_DIR_SEPARATOR_S, PACKAGE, path, NULL);
+    g_return_val_if_fail(colorstring, FALSE);
 
-    get_color (s, color);
+    gboolean return_value;
+    GdkColor *test_color;
 
-    g_free (s);
+    test_color = gdk_color_new (0,0,0);
+    return_value = gdk_color_parse (colorstring, test_color);
+    g_free(test_color);
+
+    return return_value;
+}
+
+/**
+ * This function loads a color specification, stored at the char pointer spec,
+ * into *color if it is a valid color specification.
+ * @returns the return value of gdk_color_parse function.
+ */
+gboolean GnomeCmdData::gnome_cmd_data_parse_color (const gchar *spec, GdkColor *color)
+{
+    g_return_val_if_fail(spec,FALSE);
+    g_return_val_if_fail(color,FALSE);
+
+    if (is_valid_color_string(spec) == TRUE)
+        return gdk_color_parse (spec, color);
+    else
+        return FALSE;
+}
+
+/**
+ * This function loads a color specification into color by using gnome_config.
+ * It will be obsolete in GCMD > 1.6.0
+ */
+void GnomeCmdData::gnome_cmd_data_get_color_gnome_config (const gchar *path, GdkColor *color)
+{
+    gchar *def = g_strdup_printf ("%d %d %d",
+                                  color->red, color->green, color->blue);
+
+    gchar *gcmd_path = g_build_path (G_DIR_SEPARATOR_S, PACKAGE, path, NULL);
+
+    gchar *color_str = get_string (gcmd_path, def);
+
+    gint red, green, blue;
+    if (sscanf (color_str, "%u %u %u", &red, &green, &blue) != 3)
+        g_printerr ("Illegal color in config file\n");
+
+    if (color_str != def)
+        g_free (color_str);
+    g_free (def);
+
+    color->red   = (gushort) red;
+    color->green = (gushort) green;
+    color->blue  = (gushort) blue;
+
+    g_free (gcmd_path);
 }
 
 /**
@@ -3134,6 +3423,19 @@ gboolean GnomeCmdData::set_gsettings_when_changed (GSettings *settings, const ch
     return rv;
 }
 
+gboolean GnomeCmdData::set_gsettings_color_when_changed (GSettings *settings, const char *key, GdkColor 
*color)
+{
+    gboolean return_value;
+    gchar *colorstring;
+
+
+    colorstring = gdk_color_to_string (color);
+    return_value = set_gsettings_when_changed (settings, key, colorstring);
+    g_free(colorstring);
+
+    return return_value;
+}
+
 
 GnomeCmdFileList::ColumnID GnomeCmdData::get_sort_col(FileSelectorID id) const
 {
diff --git a/src/gnome-cmd-data.h b/src/gnome-cmd-data.h
index 71ebafb..2545e32 100644
--- a/src/gnome-cmd-data.h
+++ b/src/gnome-cmd-data.h
@@ -114,6 +114,14 @@ GcmdSettings *gcmd_settings_new (void);
 
 #define GCMD_PREF_COLORS                              "org.gnome.gnome-commander.preferences.colors"
 #define GCMD_SETTINGS_COLORS_THEME                    "theme"
+#define GCMD_SETTINGS_COLORS_NORM_FG                  "custom-norm-fg"
+#define GCMD_SETTINGS_COLORS_NORM_BG                  "custom-norm-bg"
+#define GCMD_SETTINGS_COLORS_ALT_FG                   "custom-alt-fg"
+#define GCMD_SETTINGS_COLORS_ALT_BG                   "custom-alt-bg"
+#define GCMD_SETTINGS_COLORS_SEL_FG                   "custom-sel-fg"
+#define GCMD_SETTINGS_COLORS_SEL_BG                   "custom-sel-bg"
+#define GCMD_SETTINGS_COLORS_CURS_FG                  "custom-curs-fg"
+#define GCMD_SETTINGS_COLORS_CURS_BG                  "custom-curs-bg"
 
 struct GnomeCmdConRemote;
 
@@ -511,7 +519,6 @@ struct GnomeCmdData
     inline gboolean get_bool (const gchar *path, gboolean def);
     inline void set_bool (const gchar *path, gboolean value);
     inline void set_color (const gchar *path, GdkColor *color);
-    inline void get_color (const gchar *path, GdkColor *color);
 
   public:
 
@@ -570,11 +577,17 @@ struct GnomeCmdData
     void gnome_cmd_data_set_string (const gchar *path, const gchar *value);
     void gnome_cmd_data_set_bool (const gchar *path, gboolean value);
     void gnome_cmd_data_set_color (const gchar *path, GdkColor *color);
-    void gnome_cmd_data_get_color (const gchar *path, GdkColor *color);
+    gboolean gnome_cmd_data_parse_color (const gchar *spec, GdkColor *color);
+    void gnome_cmd_data_get_color_gnome_config (const gchar *path, GdkColor *color);
     gboolean gnome_cmd_data_get_bool (const gchar *path, gboolean def);
     gboolean set_gsettings_when_changed (GSettings *settings, const char *key, gpointer value);
+    gboolean set_gsettings_color_when_changed (GSettings *settings, const char *key, GdkColor *color);
     gboolean set_gsettings_enum_when_changed (GSettings *settings, const char *key, gint value);
     inline void gnome_cmd_data_set_string_history (const gchar *format, GList *strings);
+    gboolean is_valid_color_string(const char *colorstring);
+    gboolean set_valid_color_string(GSettings *settings, const char* key);
+
+
 
     GnomeCmdConRemote *get_quick_connect() const       {  return quick_connect;                     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]