[empathy] Store the theme name in the 'theme' gsettings key



commit 9b222761cc9995a09f37b7537a12e4955b586323
Author: Guillaume Desmottes <guillaume desmottes collabora co uk>
Date:   Mon Jul 2 12:58:56 2012 +0200

    Store the theme name in the 'theme' gsettings key
    
    The 'adium-path' key is now deprecated as we lookup the theme path from its
    name.

 data/org.gnome.Empathy.gschema.xml     |    2 +-
 libempathy-gtk/empathy-theme-manager.c |   47 +++++++++++++------------------
 src/empathy-preferences.c              |   46 ++++++++++++++++---------------
 src/empathy-sanity-cleaning.c          |   47 +++++++++++++++++++++++--------
 4 files changed, 80 insertions(+), 62 deletions(-)
---
diff --git a/data/org.gnome.Empathy.gschema.xml b/data/org.gnome.Empathy.gschema.xml
index 9b653cc..393e933 100644
--- a/data/org.gnome.Empathy.gschema.xml
+++ b/data/org.gnome.Empathy.gschema.xml
@@ -183,7 +183,7 @@ present them to the user immediately.</description>
     <key name="adium-path" type="s">
       <default>''</default>
       <summary>Path of the Adium theme to use</summary>
-      <description>Path of the Adium theme to use if the theme used for chat is Adium.</description>
+      <description>Path of the Adium theme to use if the theme used for chat is Adium. Deprecated.</description>
     </key>
     <key name="enable-webkit-developer-tools" type="b">
       <default>false</default>
diff --git a/libempathy-gtk/empathy-theme-manager.c b/libempathy-gtk/empathy-theme-manager.c
index 1f66116..c18ca56 100644
--- a/libempathy-gtk/empathy-theme-manager.c
+++ b/libempathy-gtk/empathy-theme-manager.c
@@ -132,48 +132,41 @@ theme_manager_create_adium_view (EmpathyThemeManager *self)
 }
 
 static void
-theme_manager_notify_adium_path_cb (GSettings *gsettings_chat,
+theme_manager_notify_theme_cb (GSettings *gsettings_chat,
     const gchar *key,
     gpointer user_data)
 {
   EmpathyThemeManager *self = EMPATHY_THEME_MANAGER (user_data);
-  const gchar *current_path = NULL;
-  gchar *new_path;
+  gchar *theme, *path;
 
-  new_path = g_settings_get_string (gsettings_chat, key);
+  theme = g_settings_get_string (gsettings_chat, key);
 
-  if (self->priv->adium_data != NULL)
-    current_path = empathy_adium_data_get_path (self->priv->adium_data);
-
-  /* If path did not really changed, ignore */
-  if (!tp_strdiff (current_path, new_path))
-    goto finally;
-
-  /* If path does not really contains an adium path, ignore */
-  if (empathy_adium_path_is_valid (new_path))
-    {
-      /* pass */
-    }
-  else if (empathy_theme_manager_find_theme (new_path) != NULL)
+  if (empathy_theme_manager_find_theme (theme) != NULL)
     {
-      new_path = empathy_theme_manager_find_theme (new_path);
+      path = empathy_theme_manager_find_theme (theme);
+      g_free (theme);
     }
   else
     {
-      g_warning ("Do not understand theme: %s", new_path);
-      goto finally;
+      g_warning ("Can't find theme: %s; fallback to 'Classic'",
+          theme);
+
+      g_free (theme);
+
+      path = empathy_theme_manager_find_theme ("Classic");
+      if (path == NULL)
+        g_critical ("Can't find 'Classic theme");
     }
 
   /* Load new theme data, we can stop tracking existing views since we
    * won't be able to change them live anymore */
   clear_list_of_views (&self->priv->adium_views);
   tp_clear_pointer (&self->priv->adium_data, empathy_adium_data_unref);
-  self->priv->adium_data = empathy_adium_data_new (new_path);
+  self->priv->adium_data = empathy_adium_data_new (path);
 
   theme_manager_emit_changed (self);
 
-finally:
-  g_free (new_path);
+  g_free (path);
 }
 
 static void
@@ -261,11 +254,11 @@ empathy_theme_manager_init (EmpathyThemeManager *self)
 
   /* Take the adium path/variant and track changes */
   g_signal_connect (self->priv->gsettings_chat,
-      "changed::" EMPATHY_PREFS_CHAT_ADIUM_PATH,
-      G_CALLBACK (theme_manager_notify_adium_path_cb), self);
+      "changed::" EMPATHY_PREFS_CHAT_THEME,
+      G_CALLBACK (theme_manager_notify_theme_cb), self);
 
-  theme_manager_notify_adium_path_cb (self->priv->gsettings_chat,
-      EMPATHY_PREFS_CHAT_ADIUM_PATH, self);
+  theme_manager_notify_theme_cb (self->priv->gsettings_chat,
+      EMPATHY_PREFS_CHAT_THEME, self);
 
   g_signal_connect (self->priv->gsettings_chat,
       "changed::" EMPATHY_PREFS_CHAT_THEME_VARIANT,
diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c
index c410aff..df5e391 100644
--- a/src/empathy-preferences.c
+++ b/src/empathy-preferences.c
@@ -115,7 +115,7 @@ enum {
 
 enum {
 	COL_THEME_VISIBLE_NAME,
-	COL_THEME_ADIUM_PATH,
+	COL_THEME_ADIUM_NAME,
 	COL_THEME_ADIUM_INFO,
 	COL_THEME_COUNT
 };
@@ -834,24 +834,24 @@ preferences_theme_changed_cb (GtkComboBox        *combo,
 
 	if (gtk_combo_box_get_active_iter (combo, &iter)) {
 		GtkTreeModel *model;
-		gchar        *path;
+		gchar        *name;
 		GHashTable   *info;
 		gboolean variant;
 
 		model = gtk_combo_box_get_model (combo);
 		gtk_tree_model_get (model, &iter,
-				    COL_THEME_ADIUM_PATH, &path,
+				    COL_THEME_ADIUM_NAME, &name,
 				    COL_THEME_ADIUM_INFO, &info,
 				    -1);
 
 		g_settings_set_string (priv->gsettings_chat,
-				       EMPATHY_PREFS_CHAT_ADIUM_PATH,
-				       path);
+				       EMPATHY_PREFS_CHAT_THEME,
+				       name);
 
 		variant = preferences_theme_variants_fill (preferences, info);
 		gtk_widget_set_visible (priv->hbox_chat_theme_variant, variant);
 
-		g_free (path);
+		g_free (name);
 		tp_clear_pointer (&info, g_hash_table_unref);
 	}
 }
@@ -864,31 +864,31 @@ preferences_theme_notify_cb (GSettings   *gsettings,
 	EmpathyPreferences *preferences = user_data;
 	EmpathyPreferencesPriv *priv = GET_PRIV (preferences);
 	GtkComboBox        *combo;
-	gchar              *conf_path;
+	gchar              *theme;
 	GtkTreeModel       *model;
 	GtkTreeIter         iter;
 	gboolean            found = FALSE;
 	gboolean            ok;
 
-	conf_path = g_settings_get_string (gsettings, EMPATHY_PREFS_CHAT_ADIUM_PATH);
+	theme = g_settings_get_string (gsettings, key);
 
 	combo = GTK_COMBO_BOX (priv->combobox_chat_theme);
 	model = gtk_combo_box_get_model (combo);
 	for (ok = gtk_tree_model_get_iter_first (model, &iter);
 	     ok && !found;
 	     ok = gtk_tree_model_iter_next (model, &iter)) {
-		gchar *path;
+		gchar *name;
 
 		gtk_tree_model_get (model, &iter,
-				    COL_THEME_ADIUM_PATH, &path,
+				    COL_THEME_ADIUM_NAME, &name,
 				    -1);
 
-		if (!tp_strdiff (path, conf_path)) {
+		if (!tp_strdiff (name, theme)) {
 			found = TRUE;
 			gtk_combo_box_set_active_iter (combo, &iter);
 		}
 
-		g_free (path);
+		g_free (name);
 	}
 
 	/* Fallback to the first one. */
@@ -898,7 +898,7 @@ preferences_theme_notify_cb (GSettings   *gsettings,
 		}
 	}
 
-	g_free (conf_path);
+	g_free (theme);
 }
 
 static void
@@ -928,21 +928,23 @@ preferences_themes_setup (EmpathyPreferences *preferences)
 	adium_themes = empathy_theme_manager_get_adium_themes ();
 	while (adium_themes != NULL) {
 		GHashTable *info;
-		const gchar *name;
-		const gchar *path;
+		const gchar *visible_name;
+		gchar *name;
 
 		info = adium_themes->data;
-		name = tp_asv_get_string (info, "CFBundleName");
-		path = tp_asv_get_string (info, "path");
+		visible_name = tp_asv_get_string (info, "CFBundleName");
+		name = empathy_theme_manager_dup_theme_name_from_path (
+			tp_asv_get_string (info, "path"));
 
-		if (name != NULL && path != NULL) {
+		if (visible_name != NULL && name != NULL) {
 			gtk_list_store_insert_with_values (store, NULL, -1,
-				COL_THEME_VISIBLE_NAME, name,
-				COL_THEME_ADIUM_PATH, path,
+				COL_THEME_VISIBLE_NAME, visible_name,
+				COL_THEME_ADIUM_NAME, name,
 				COL_THEME_ADIUM_INFO, info,
 				-1);
 		}
 		g_hash_table_unref (info);
+		g_free (name);
 		adium_themes = g_list_delete_link (adium_themes, adium_themes);
 	}
 
@@ -961,11 +963,11 @@ preferences_themes_setup (EmpathyPreferences *preferences)
 
 	/* Select the theme from the GSetting key and track changes */
 	preferences_theme_notify_cb (priv->gsettings_chat,
-				     EMPATHY_PREFS_CHAT_ADIUM_PATH,
+				     EMPATHY_PREFS_CHAT_THEME,
 				     preferences);
 
 	g_signal_connect (priv->gsettings_chat,
-			  "changed::" EMPATHY_PREFS_CHAT_ADIUM_PATH,
+			  "changed::" EMPATHY_PREFS_CHAT_THEME,
 			  G_CALLBACK (preferences_theme_notify_cb),
 			  preferences);
 }
diff --git a/src/empathy-sanity-cleaning.c b/src/empathy-sanity-cleaning.c
index b14f4f5..8bc61b4 100644
--- a/src/empathy-sanity-cleaning.c
+++ b/src/empathy-sanity-cleaning.c
@@ -144,8 +144,8 @@ static void
 upgrade_chat_theme_settings (void)
 {
   GSettings *gsettings_chat;
-  gchar *theme;
-  const char *adium_theme, *variant = "";
+  gchar *theme, *new_theme = NULL;
+  const char *variant = "";
 
   gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
 
@@ -153,33 +153,56 @@ upgrade_chat_theme_settings (void)
       EMPATHY_PREFS_CHAT_THEME);
 
   if (!tp_strdiff (theme, "adium")) {
-    goto finally;
+    gchar *path, *fullname;
+
+    path = g_settings_get_string (gsettings_chat,
+        EMPATHY_PREFS_CHAT_ADIUM_PATH);
+
+    fullname = g_path_get_basename (path);
+    if (g_str_has_suffix (fullname, ".AdiumMessageStyle"))
+      {
+        gchar **tmp;
+
+        tmp = g_strsplit (fullname, ".AdiumMessageStyle", 0);
+        new_theme = g_strdup (tmp[0]);
+
+        g_strfreev (tmp);
+      }
+    else
+      {
+        /* Use the Classic theme as fallback */
+        new_theme = g_strdup ("Classic");
+      }
+
+    g_free (path);
+    g_free (fullname);
   } else if (!tp_strdiff (theme, "gnome")) {
-    adium_theme = "PlanetGNOME";
+    new_theme = g_strdup ("PlanetGNOME");
   } else if (!tp_strdiff (theme, "simple")) {
-    adium_theme = "Boxes";
+    new_theme = g_strdup ("Boxes");
     variant = "Simple";
   } else if (!tp_strdiff (theme, "clean")) {
-    adium_theme = "Boxes";
+    new_theme = g_strdup ("Boxes");
     variant = "Clean";
   } else if (!tp_strdiff (theme, "blue")) {
-    adium_theme = "Boxes";
+    new_theme = g_strdup ("Boxes");
     variant = "Blue";
   } else {
-    adium_theme = "Classic";
+    /* Assume that's an Adium theme name. The theme manager will fallback to
+     * 'Classic' if it can't find it. */
+    goto finally;
   }
 
-  DEBUG ("Migrating to '%s' variant '%s'", adium_theme, variant);
+  DEBUG ("Migrating to '%s' variant '%s'", new_theme, variant);
 
   g_settings_set_string (gsettings_chat,
-    EMPATHY_PREFS_CHAT_THEME, "adium");
-  g_settings_set_string (gsettings_chat,
-    EMPATHY_PREFS_CHAT_ADIUM_PATH, adium_theme);
+    EMPATHY_PREFS_CHAT_THEME, new_theme);
   g_settings_set_string (gsettings_chat,
     EMPATHY_PREFS_CHAT_THEME_VARIANT, variant);
 
 finally:
   g_free (theme);
+  g_free (new_theme);
   g_object_unref (gsettings_chat);
 }
 



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