From 9b222761cc9995a09f37b7537a12e4955b586323 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Mon, 2 Jul 2012 12:58:56 +0200 Subject: [PATCH] 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 9b653ccc..393e9332 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. '' Path of the Adium theme to use - Path of the Adium theme to use if the theme used for chat is Adium. + Path of the Adium theme to use if the theme used for chat is Adium. Deprecated. false diff --git a/libempathy-gtk/empathy-theme-manager.c b/libempathy-gtk/empathy-theme-manager.c index 1f661166..c18ca56b 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 c410affd..df5e3918 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 b14f4f52..8bc61b4c 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); } -- 2.39.2