[gnome-control-center] sound: remove theme selection
- From: William Jon McCann <mccann src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] sound: remove theme selection
- Date: Mon, 22 Nov 2010 02:37:36 +0000 (UTC)
commit d2bacbfa59138bb92eebb3e6832313aa90338443
Author: William Jon McCann <jmccann redhat com>
Date: Sun Nov 21 21:33:02 2010 -0500
sound: remove theme selection
Like appearance themes this is something that should move to
a tweakers paradise app.
panels/sound/gvc-sound-theme-chooser.c | 459 ++++++++------------------------
1 files changed, 109 insertions(+), 350 deletions(-)
---
diff --git a/panels/sound/gvc-sound-theme-chooser.c b/panels/sound/gvc-sound-theme-chooser.c
index 4743a09..e5f80c4 100644
--- a/panels/sound/gvc-sound-theme-chooser.c
+++ b/panels/sound/gvc-sound-theme-chooser.c
@@ -42,14 +42,14 @@
struct GvcSoundThemeChooserPrivate
{
- GtkWidget *combo_box;
GtkWidget *treeview;
- GtkWidget *theme_box;
GtkWidget *selection_box;
GtkWidget *click_feedback_button;
GConfClient *client;
guint sounds_dir_id;
guint metacity_dir_id;
+ char *current_theme;
+ char *current_parent;
};
static void gvc_sound_theme_chooser_class_init (GvcSoundThemeChooserClass *klass);
@@ -92,181 +92,6 @@ enum {
};
static void
-on_combobox_changed (GtkComboBox *widget,
- GvcSoundThemeChooser *chooser)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- char *theme_name;
-
- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter) == FALSE) {
- return;
- }
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box));
- gtk_tree_model_get (model, &iter, THEME_IDENTIFIER_COL, &theme_name, -1);
-
- g_assert (theme_name != NULL);
-
- /* special case for no sounds */
- if (strcmp (theme_name, NO_SOUNDS_THEME_NAME) == 0) {
- gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, FALSE, NULL);
- return;
- } else {
- gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, TRUE, NULL);
- }
-
- gconf_client_set_string (chooser->priv->client, SOUND_THEME_KEY, theme_name, NULL);
-
- g_free (theme_name);
-
- /* FIXME: reset alert model */
-}
-
-static char *
-load_index_theme_name (const char *index,
- char **parent)
-{
- GKeyFile *file;
- char *indexname = NULL;
- gboolean hidden;
-
- file = g_key_file_new ();
- if (g_key_file_load_from_file (file, index, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) == FALSE) {
- g_key_file_free (file);
- return NULL;
- }
- /* Don't add hidden themes to the list */
- hidden = g_key_file_get_boolean (file, "Sound Theme", "Hidden", NULL);
- if (!hidden) {
- indexname = g_key_file_get_locale_string (file,
- "Sound Theme",
- "Name",
- NULL,
- NULL);
-
- /* Save the parent theme, if there's one */
- if (parent != NULL) {
- *parent = g_key_file_get_string (file,
- "Sound Theme",
- "Inherits",
- NULL);
- }
- }
-
- g_key_file_free (file);
- return indexname;
-}
-
-static void
-sound_theme_in_dir (GHashTable *hash,
- const char *dir)
-{
- GDir *d;
- const char *name;
-
- d = g_dir_open (dir, 0, NULL);
- if (d == NULL) {
- return;
- }
-
- while ((name = g_dir_read_name (d)) != NULL) {
- char *dirname, *index, *indexname;
-
- /* Look for directories */
- dirname = g_build_filename (dir, name, NULL);
- if (g_file_test (dirname, G_FILE_TEST_IS_DIR) == FALSE) {
- g_free (dirname);
- continue;
- }
-
- /* Look for index files */
- index = g_build_filename (dirname, "index.theme", NULL);
- g_free (dirname);
-
- /* Check the name of the theme in the index.theme file */
- indexname = load_index_theme_name (index, NULL);
- g_free (index);
- if (indexname == NULL) {
- continue;
- }
-
- g_hash_table_insert (hash, g_strdup (name), indexname);
- }
-
- g_dir_close (d);
-}
-
-static void
-add_theme_to_store (const char *key,
- const char *value,
- GtkListStore *store)
-{
- char *parent;
-
- parent = NULL;
-
- /* Get the parent, if we're checking the custom theme */
- if (strcmp (key, CUSTOM_THEME_NAME) == 0) {
- char *name, *path;
-
- path = custom_theme_dir_path ("index.theme");
- name = load_index_theme_name (path, &parent);
- g_free (name);
- g_free (path);
- }
- gtk_list_store_insert_with_values (store, NULL, G_MAXINT,
- THEME_DISPLAY_COL, value,
- THEME_IDENTIFIER_COL, key,
- THEME_PARENT_ID_COL, parent,
- -1);
- g_free (parent);
-}
-
-static void
-set_combox_for_theme_name (GvcSoundThemeChooser *chooser,
- const char *name)
-{
- GtkTreeIter iter;
- GtkTreeModel *model;
- gboolean found;
-
- /* If the name is empty, use "freedesktop" */
- if (name == NULL || *name == '\0') {
- name = "freedesktop";
- }
-
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box));
- if (model == NULL) {
- /* No theme was installed, don't warn again
- * See setup_theme_selector() */
- return;
- }
-
- if (gtk_tree_model_get_iter_first (model, &iter) == FALSE) {
- return;
- }
-
- do {
- char *value;
-
- gtk_tree_model_get (model, &iter, THEME_IDENTIFIER_COL, &value, -1);
- found = (value != NULL && strcmp (value, name) == 0);
- g_free (value);
-
- } while (!found && gtk_tree_model_iter_next (model, &iter));
-
- /* When we can't find the theme we need to set, try to set the default
- * one "freedesktop" */
- if (found) {
- gtk_combo_box_set_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter);
- } else if (strcmp (name, "freedesktop") != 0) {
- g_debug ("not found, falling back to fdo");
- set_combox_for_theme_name (chooser, "freedesktop");
- }
-}
-
-static void
set_input_feedback_enabled (GvcSoundThemeChooser *chooser,
gboolean enabled)
{
@@ -274,81 +99,6 @@ set_input_feedback_enabled (GvcSoundThemeChooser *chooser,
enabled);
}
-static void
-setup_theme_selector (GvcSoundThemeChooser *chooser)
-{
- GHashTable *hash;
- GtkListStore *store;
- GtkCellRenderer *renderer;
- const char * const *data_dirs;
- const char *data_dir;
- char *dir;
- guint i;
-
- /* Add the theme names and their display name to a hash table,
- * makes it easy to avoid duplicate themes */
- hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- data_dirs = g_get_system_data_dirs ();
- for (i = 0; data_dirs[i] != NULL; i++) {
- dir = g_build_filename (data_dirs[i], "sounds", NULL);
- sound_theme_in_dir (hash, dir);
- g_free (dir);
- }
-
- data_dir = g_get_user_data_dir ();
- dir = g_build_filename (data_dir, "sounds", NULL);
- sound_theme_in_dir (hash, dir);
- g_free (dir);
-
- /* If there isn't at least one theme, make everything
- * insensitive, LAME! */
- if (g_hash_table_size (hash) == 0) {
- gtk_widget_set_sensitive (GTK_WIDGET (chooser), FALSE);
- g_warning ("Bad setup, install the freedesktop sound theme");
- g_hash_table_destroy (hash);
- return;
- }
-
- /* Setup the tree model, 3 columns:
- * - internal theme name/directory
- * - display theme name
- * - the internal id for the parent theme, used for the custom theme */
- store = gtk_list_store_new (THEME_NUM_COLS,
- G_TYPE_STRING,
- G_TYPE_STRING,
- G_TYPE_STRING);
-
- /* Add the themes to a combobox */
- gtk_list_store_insert_with_values (store,
- NULL,
- G_MAXINT,
- THEME_DISPLAY_COL, _("No sounds"),
- THEME_IDENTIFIER_COL, "__no_sounds",
- THEME_PARENT_ID_COL, NULL,
- -1);
- g_hash_table_foreach (hash, (GHFunc) add_theme_to_store, store);
- g_hash_table_destroy (hash);
-
- /* Set the display */
- gtk_combo_box_set_model (GTK_COMBO_BOX (chooser->priv->combo_box),
- GTK_TREE_MODEL (store));
-
- renderer = gtk_cell_renderer_text_new ();
- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (chooser->priv->combo_box),
- renderer,
- TRUE);
- gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (chooser->priv->combo_box),
- renderer,
- "text", THEME_DISPLAY_COL,
- NULL);
-
- g_signal_connect (chooser->priv->combo_box,
- "changed",
- G_CALLBACK (on_combobox_changed),
- chooser);
-}
-
#define GVC_SOUND_SOUND (xmlChar *) "sound"
#define GVC_SOUND_NAME (xmlChar *) "name"
#define GVC_SOUND_FILENAME (xmlChar *) "filename"
@@ -571,29 +321,100 @@ update_alert_model (GvcSoundThemeChooser *chooser,
}
static void
+save_theme_name (GvcSoundThemeChooser *chooser,
+ const char *theme_name)
+{
+ /* If the name is empty, use "freedesktop" */
+ if (theme_name == NULL || *theme_name == '\0') {
+ theme_name = "freedesktop";
+ }
+
+ /* special case for no sounds */
+ if (strcmp (theme_name, NO_SOUNDS_THEME_NAME) == 0) {
+ gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, FALSE, NULL);
+ return;
+ } else {
+ gconf_client_set_bool (chooser->priv->client, EVENT_SOUNDS_KEY, TRUE, NULL);
+ }
+
+ gconf_client_set_string (chooser->priv->client, SOUND_THEME_KEY, theme_name, NULL);
+}
+
+static gboolean
+load_theme_file (const char *path,
+ char **parent)
+{
+ GKeyFile *file;
+ char *indexname = NULL;
+ gboolean hidden;
+
+ file = g_key_file_new ();
+ if (g_key_file_load_from_file (file, path, G_KEY_FILE_KEEP_TRANSLATIONS, NULL) == FALSE) {
+ g_key_file_free (file);
+ return FALSE;
+ }
+ /* Don't add hidden themes to the list */
+ hidden = g_key_file_get_boolean (file, "Sound Theme", "Hidden", NULL);
+ if (!hidden) {
+ indexname = g_key_file_get_locale_string (file,
+ "Sound Theme",
+ "Name",
+ NULL,
+ NULL);
+
+ /* Save the parent theme, if there's one */
+ if (parent != NULL) {
+ *parent = g_key_file_get_string (file,
+ "Sound Theme",
+ "Inherits",
+ NULL);
+ }
+ }
+
+ g_key_file_free (file);
+
+ return TRUE;
+}
+
+static gboolean
+load_theme_name (const char *name,
+ char **parent)
+{
+ const char * const *data_dirs;
+ const char *data_dir;
+ char *path;
+ guint i;
+ gboolean res;
+
+ data_dir = g_get_user_data_dir ();
+ path = g_build_filename (data_dir, "sounds", name, "index.theme", NULL);
+ res = load_theme_file (path, parent);
+ g_free (path);
+ if (res)
+ return TRUE;
+
+ data_dirs = g_get_system_data_dirs ();
+ for (i = 0; data_dirs[i] != NULL; i++) {
+ path = g_build_filename (data_dirs[i], "sounds", name, "index.theme", NULL);
+ res = load_theme_file (path, parent);
+ g_free (path);
+ if (res)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void
update_alert (GvcSoundThemeChooser *chooser,
const char *alert_id)
{
- GtkTreeModel *theme_model;
- GtkTreeIter iter;
- char *theme;
- char *parent;
gboolean is_custom;
gboolean is_default;
gboolean add_custom;
gboolean remove_custom;
- theme_model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box));
- /* Get the current theme's name, and set the parent */
- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &iter) == FALSE) {
- return;
- }
-
- gtk_tree_model_get (theme_model, &iter,
- THEME_IDENTIFIER_COL, &theme,
- THEME_IDENTIFIER_COL, &parent,
- -1);
- is_custom = strcmp (theme, CUSTOM_THEME_NAME) == 0;
+ is_custom = strcmp (chooser->priv->current_theme, CUSTOM_THEME_NAME) == 0;
is_default = strcmp (alert_id, DEFAULT_ALERT_ID) == 0;
/* So a few possibilities:
@@ -608,7 +429,7 @@ update_alert (GvcSoundThemeChooser *chooser,
/* remove custom just in case */
remove_custom = TRUE;
} else if (! is_custom && ! is_default) {
- create_custom_theme (parent);
+ create_custom_theme (chooser->priv->current_parent);
save_alert_sounds (chooser, alert_id);
add_custom = TRUE;
} else if (is_custom && is_default) {
@@ -622,77 +443,31 @@ update_alert (GvcSoundThemeChooser *chooser,
}
if (add_custom) {
- gtk_list_store_insert_with_values (GTK_LIST_STORE (theme_model),
- NULL,
- G_MAXINT,
- THEME_DISPLAY_COL, _("Custom"),
- THEME_IDENTIFIER_COL, CUSTOM_THEME_NAME,
- THEME_PARENT_ID_COL, theme,
- -1);
- set_combox_for_theme_name (chooser, CUSTOM_THEME_NAME);
+ save_theme_name (chooser, CUSTOM_THEME_NAME);
} else if (remove_custom) {
- gtk_tree_model_get_iter_first (theme_model, &iter);
- do {
- char *this_parent;
-
- gtk_tree_model_get (theme_model, &iter,
- THEME_PARENT_ID_COL, &this_parent,
- -1);
- if (this_parent != NULL && strcmp (this_parent, CUSTOM_THEME_NAME) != 0) {
- g_free (this_parent);
- gtk_list_store_remove (GTK_LIST_STORE (theme_model), &iter);
- break;
- }
- g_free (this_parent);
- } while (gtk_tree_model_iter_next (theme_model, &iter));
-
delete_custom_theme_dir ();
-
- set_combox_for_theme_name (chooser, parent);
+ if (is_custom) {
+ save_theme_name (chooser, chooser->priv->current_parent);
+ }
}
update_alert_model (chooser, alert_id);
-
- g_free (theme);
- g_free (parent);
}
static void
play_preview_for_id (GvcSoundThemeChooser *chooser,
const char *id)
{
- GtkTreeIter theme_iter;
- char *parent_theme;
-
g_return_if_fail (id != NULL);
- parent_theme = NULL;
- if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (chooser->priv->combo_box), &theme_iter)) {
- GtkTreeModel *theme_model;
- char *theme_id;
- char *parent_id;
-
- theme_model = gtk_combo_box_get_model (GTK_COMBO_BOX (chooser->priv->combo_box));
- theme_id = NULL;
- parent_id = NULL;
- gtk_tree_model_get (theme_model, &theme_iter,
- THEME_IDENTIFIER_COL, &theme_id,
- THEME_PARENT_ID_COL, &parent_id, -1);
- if (theme_id && strcmp (theme_id, CUSTOM_THEME_NAME) == 0) {
- parent_theme = g_strdup (parent_id);
- }
- g_free (theme_id);
- g_free (parent_id);
- }
-
/* special case: for the default item on custom themes
* play the alert for the parent theme */
if (strcmp (id, DEFAULT_ALERT_ID) == 0) {
- if (parent_theme != NULL) {
+ if (chooser->priv->current_parent != NULL) {
ca_gtk_play_for_widget (GTK_WIDGET (chooser), 0,
CA_PROP_APPLICATION_NAME, _("Sound Preferences"),
CA_PROP_EVENT_ID, "bell-window-system",
- CA_PROP_CANBERRA_XDG_THEME_NAME, parent_theme,
+ CA_PROP_CANBERRA_XDG_THEME_NAME, chooser->priv->current_parent,
CA_PROP_EVENT_DESCRIPTION, _("Testing event sound"),
CA_PROP_CANBERRA_CACHE_CONTROL, "never",
CA_PROP_APPLICATION_ID, "org.gnome.VolumeControl",
@@ -725,7 +500,6 @@ play_preview_for_id (GvcSoundThemeChooser *chooser,
NULL);
}
- g_free (parent_theme);
}
static void
@@ -794,6 +568,7 @@ create_alert_treeview (GvcSoundThemeChooser *chooser)
GtkTreeSelection *selection;
treeview = gtk_tree_view_new ();
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
g_signal_connect (treeview,
"button-press-event",
G_CALLBACK (on_treeview_button_pressed),
@@ -836,13 +611,6 @@ create_alert_treeview (GvcSoundThemeChooser *chooser)
NULL);
gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
- renderer = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (_("Type"),
- renderer,
- "text", ALERT_SOUND_TYPE_COL,
- NULL);
- gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
-
return treeview;
}
@@ -903,10 +671,10 @@ update_alerts_from_theme_name (GvcSoundThemeChooser *chooser,
static void
update_theme (GvcSoundThemeChooser *chooser)
{
- char *theme_name;
gboolean events_enabled;
gboolean bell_enabled;
gboolean feedback_enabled;
+ char *last_theme;
bell_enabled = gconf_client_get_bool (chooser->priv->client, AUDIO_BELL_KEY, NULL);
//set_audible_bell_enabled (chooser, bell_enabled);
@@ -915,20 +683,25 @@ update_theme (GvcSoundThemeChooser *chooser)
set_input_feedback_enabled (chooser, feedback_enabled);
events_enabled = gconf_client_get_bool (chooser->priv->client, EVENT_SOUNDS_KEY, NULL);
+
+ last_theme = chooser->priv->current_theme;
if (events_enabled) {
- theme_name = gconf_client_get_string (chooser->priv->client, SOUND_THEME_KEY, NULL);
+ chooser->priv->current_theme = gconf_client_get_string (chooser->priv->client, SOUND_THEME_KEY, NULL);
} else {
- theme_name = g_strdup (NO_SOUNDS_THEME_NAME);
+ chooser->priv->current_theme = g_strdup (NO_SOUNDS_THEME_NAME);
+ }
+
+ if (g_strcmp0 (last_theme, chooser->priv->current_theme) != 0) {
+ g_free (chooser->priv->current_parent);
+ load_theme_name (chooser->priv->current_theme,
+ &chooser->priv->current_parent);
}
+ g_free (last_theme);
gtk_widget_set_sensitive (chooser->priv->selection_box, events_enabled);
gtk_widget_set_sensitive (chooser->priv->click_feedback_button, events_enabled);
- set_combox_for_theme_name (chooser, theme_name);
-
- update_alerts_from_theme_name (chooser, theme_name);
-
- g_free (theme_name);
+ update_alerts_from_theme_name (chooser, chooser->priv->current_theme);
}
static GObject *
@@ -943,8 +716,6 @@ gvc_sound_theme_chooser_constructor (GType type,
self = GVC_SOUND_THEME_CHOOSER (object);
- setup_theme_selector (self);
-
update_theme (self);
return object;
@@ -1027,16 +798,6 @@ gvc_sound_theme_chooser_init (GvcSoundThemeChooser *chooser)
chooser->priv = GVC_SOUND_THEME_CHOOSER_GET_PRIVATE (chooser);
- chooser->priv->theme_box = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (chooser),
- chooser->priv->theme_box, FALSE, FALSE, 0);
-
- label = gtk_label_new_with_mnemonic (_("Sound _theme:"));
- gtk_box_pack_start (GTK_BOX (chooser->priv->theme_box), label, FALSE, FALSE, 0);
- chooser->priv->combo_box = gtk_combo_box_new ();
- gtk_box_pack_start (GTK_BOX (chooser->priv->theme_box), chooser->priv->combo_box, FALSE, FALSE, 6);
- gtk_label_set_mnemonic_widget (GTK_LABEL (label), chooser->priv->combo_box);
-
chooser->priv->client = gconf_client_get_default ();
str = g_strdup_printf ("<b>%s</b>", _("C_hoose an alert sound:"));
@@ -1097,8 +858,6 @@ gvc_sound_theme_chooser_init (GvcSoundThemeChooser *chooser)
(GConfClientNotifyFunc)on_key_changed,
chooser, NULL, NULL);
- /* FIXME: should accept drag and drop themes. should also
- add an "Add Theme..." item to the theme combobox */
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]