1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 * Copyright (C) 2003-2007 Imendio AB
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public
16 * License along with this program; if not, write to the
17 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
18 * Boston, MA 02110-1301 USA
20 * Authors: Mikael Hallendal <micke@imendio.com>
21 * Richard Hult <richard@imendio.com>
22 * Martyn Russell <martyn@imendio.com>
30 #include <glib/gi18n.h>
32 #include <libempathy/empathy-utils.h>
34 #include <libempathy-gtk/empathy-conf.h>
35 #include <libempathy-gtk/empathy-ui-utils.h>
36 #include <libempathy-gtk/empathy-theme-manager.h>
37 #include <libempathy-gtk/empathy-theme-adium.h>
38 #include <libempathy-gtk/empathy-spell.h>
39 #include <libempathy-gtk/empathy-contact-list-store.h>
40 #include <libempathy-gtk/empathy-gtk-enum-types.h>
42 #include "empathy-preferences.h"
49 GtkWidget *checkbutton_show_avatars;
50 GtkWidget *checkbutton_compact_contact_list;
51 GtkWidget *checkbutton_show_smileys;
52 GtkWidget *combobox_chat_theme;
53 GtkWidget *hbox_adium_theme;
54 GtkWidget *filechooserbutton_adium_theme;
55 GtkWidget *label_invalid_adium_theme;
56 GtkWidget *checkbutton_separate_chat_windows;
57 GtkWidget *checkbutton_autoconnect;
58 GtkWidget *radiobutton_contact_list_sort_by_name;
59 GtkWidget *radiobutton_contact_list_sort_by_state;
61 GtkWidget *checkbutton_sounds_enabled;
62 GtkWidget *checkbutton_sounds_disabled_away;
63 GtkWidget *treeview_sounds;
65 GtkWidget *checkbutton_notifications_enabled;
66 GtkWidget *checkbutton_notifications_disabled_away;
67 GtkWidget *checkbutton_notifications_focus;
69 GtkWidget *treeview_spell_checker;
71 GtkWidget *checkbutton_location_publish;
72 GtkWidget *checkbutton_location_reduce_accuracy;
73 GtkWidget *checkbutton_location_resource_network;
74 GtkWidget *checkbutton_location_resource_cell;
75 GtkWidget *checkbutton_location_resource_gps;
80 static void preferences_setup_widgets (EmpathyPreferences *preferences);
81 static void preferences_languages_setup (EmpathyPreferences *preferences);
82 static void preferences_languages_add (EmpathyPreferences *preferences);
83 static void preferences_languages_save (EmpathyPreferences *preferences);
84 static gboolean preferences_languages_save_foreach (GtkTreeModel *model,
88 static void preferences_languages_load (EmpathyPreferences *preferences);
89 static gboolean preferences_languages_load_foreach (GtkTreeModel *model,
93 static void preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
95 EmpathyPreferences *preferences);
96 static void preferences_widget_sync_bool (const gchar *key,
98 static void preferences_widget_sync_string (const gchar *key,
100 static void preferences_notify_string_cb (EmpathyConf *conf,
103 static void preferences_notify_bool_cb (EmpathyConf *conf,
106 static void preferences_notify_sensitivity_cb (EmpathyConf *conf,
109 static void preferences_hookup_toggle_button (EmpathyPreferences *preferences,
112 static void preferences_hookup_radio_button (EmpathyPreferences *preferences,
115 static void preferences_hookup_sensitivity (EmpathyPreferences *preferences,
118 static void preferences_toggle_button_toggled_cb (GtkWidget *button,
120 static void preferences_radio_button_toggled_cb (GtkWidget *button,
122 static void preferences_destroy_cb (GtkWidget *widget,
123 EmpathyPreferences *preferences);
124 static void preferences_response_cb (GtkWidget *widget,
126 EmpathyPreferences *preferences);
136 COL_COMBO_VISIBLE_NAME,
153 /* TODO: add phone related sounds also? */
154 static SoundEventEntry sound_entries [] = {
155 { N_("Message received"), EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE },
156 { N_("Message sent"), EMPATHY_PREFS_SOUNDS_OUTGOING_MESSAGE },
157 { N_("New conversation"), EMPATHY_PREFS_SOUNDS_NEW_CONVERSATION },
158 { N_("Contact goes online"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN },
159 { N_("Contact goes offline"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT },
160 { N_("Account connected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN },
161 { N_("Account disconnected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT }
165 preferences_add_id (EmpathyPreferences *preferences, guint id)
167 preferences->notify_ids = g_list_prepend (preferences->notify_ids,
168 GUINT_TO_POINTER (id));
172 preferences_compact_contact_list_changed_cb (EmpathyConf *conf,
176 EmpathyPreferences *preferences = user_data;
179 if (empathy_conf_get_bool (empathy_conf_get (), key, &value)) {
180 gtk_widget_set_sensitive (preferences->checkbutton_show_avatars,
186 preferences_setup_widgets (EmpathyPreferences *preferences)
190 preferences_hookup_toggle_button (preferences,
191 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
192 preferences->checkbutton_notifications_enabled);
193 preferences_hookup_toggle_button (preferences,
194 EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY,
195 preferences->checkbutton_notifications_disabled_away);
196 preferences_hookup_toggle_button (preferences,
197 EMPATHY_PREFS_NOTIFICATIONS_FOCUS,
198 preferences->checkbutton_notifications_focus);
200 preferences_hookup_sensitivity (preferences,
201 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
202 preferences->checkbutton_notifications_disabled_away);
203 preferences_hookup_sensitivity (preferences,
204 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
205 preferences->checkbutton_notifications_focus);
207 preferences_hookup_toggle_button (preferences,
208 EMPATHY_PREFS_SOUNDS_ENABLED,
209 preferences->checkbutton_sounds_enabled);
210 preferences_hookup_toggle_button (preferences,
211 EMPATHY_PREFS_SOUNDS_DISABLED_AWAY,
212 preferences->checkbutton_sounds_disabled_away);
214 preferences_hookup_sensitivity (preferences,
215 EMPATHY_PREFS_SOUNDS_ENABLED,
216 preferences->checkbutton_sounds_disabled_away);
217 preferences_hookup_sensitivity (preferences,
218 EMPATHY_PREFS_SOUNDS_ENABLED,
219 preferences->treeview_sounds);
221 preferences_hookup_toggle_button (preferences,
222 EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS,
223 preferences->checkbutton_separate_chat_windows);
225 preferences_hookup_toggle_button (preferences,
226 EMPATHY_PREFS_UI_SHOW_AVATARS,
227 preferences->checkbutton_show_avatars);
229 preferences_hookup_toggle_button (preferences,
230 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
231 preferences->checkbutton_compact_contact_list);
233 preferences_hookup_toggle_button (preferences,
234 EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
235 preferences->checkbutton_show_smileys);
237 preferences_hookup_radio_button (preferences,
238 EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
239 preferences->radiobutton_contact_list_sort_by_name);
241 preferences_hookup_toggle_button (preferences,
242 EMPATHY_PREFS_AUTOCONNECT,
243 preferences->checkbutton_autoconnect);
245 preferences_hookup_toggle_button (preferences,
246 EMPATHY_PREFS_LOCATION_PUBLISH,
247 preferences->checkbutton_location_publish);
249 preferences_hookup_toggle_button (preferences,
250 EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK,
251 preferences->checkbutton_location_resource_network);
252 preferences_hookup_sensitivity (preferences,
253 EMPATHY_PREFS_LOCATION_PUBLISH,
254 preferences->checkbutton_location_resource_network);
256 preferences_hookup_toggle_button (preferences,
257 EMPATHY_PREFS_LOCATION_RESOURCE_CELL,
258 preferences->checkbutton_location_resource_cell);
259 preferences_hookup_sensitivity (preferences,
260 EMPATHY_PREFS_LOCATION_PUBLISH,
261 preferences->checkbutton_location_resource_cell);
263 preferences_hookup_toggle_button (preferences,
264 EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
265 preferences->checkbutton_location_resource_gps);
266 preferences_hookup_sensitivity (preferences,
267 EMPATHY_PREFS_LOCATION_PUBLISH,
268 preferences->checkbutton_location_resource_gps);
270 preferences_hookup_toggle_button (preferences,
271 EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY,
272 preferences->checkbutton_location_reduce_accuracy);
273 preferences_hookup_sensitivity (preferences,
274 EMPATHY_PREFS_LOCATION_PUBLISH,
275 preferences->checkbutton_location_reduce_accuracy);
277 id = empathy_conf_notify_add (empathy_conf_get (),
278 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
279 preferences_compact_contact_list_changed_cb,
282 preferences_add_id (preferences, id);
284 preferences_compact_contact_list_changed_cb (empathy_conf_get (),
285 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
290 preferences_sound_cell_toggled_cb (GtkCellRendererToggle *toggle,
292 EmpathyPreferences *preferences)
295 gboolean toggled, instore;
301 view = GTK_TREE_VIEW (preferences->treeview_sounds);
302 model = gtk_tree_view_get_model (view);
304 path = gtk_tree_path_new_from_string (path_string);
305 toggled = gtk_cell_renderer_toggle_get_active (toggle);
307 gtk_tree_model_get_iter (model, &iter, path);
308 gtk_tree_model_get (model, &iter, COL_SOUND_KEY, &key,
309 COL_SOUND_ENABLED, &instore, -1);
313 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
314 COL_SOUND_ENABLED, instore, -1);
316 empathy_conf_set_bool (empathy_conf_get (), key, instore);
319 gtk_tree_path_free (path);
323 preferences_sound_load (EmpathyPreferences *preferences)
332 view = GTK_TREE_VIEW (preferences->treeview_sounds);
333 store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
334 conf = empathy_conf_get ();
336 for (i = 0; i < G_N_ELEMENTS (sound_entries); i++) {
337 empathy_conf_get_bool (conf, sound_entries[i].key, &set);
339 gtk_list_store_insert_with_values (store, &iter, i,
340 COL_SOUND_NAME, gettext (sound_entries[i].name),
341 COL_SOUND_KEY, sound_entries[i].key,
342 COL_SOUND_ENABLED, set, -1);
347 preferences_sound_setup (EmpathyPreferences *preferences)
351 GtkCellRenderer *renderer;
352 GtkTreeViewColumn *column;
354 view = GTK_TREE_VIEW (preferences->treeview_sounds);
356 store = gtk_list_store_new (COL_SOUND_COUNT,
357 G_TYPE_BOOLEAN, /* enabled */
358 G_TYPE_STRING, /* name */
359 G_TYPE_STRING); /* key */
361 gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
363 renderer = gtk_cell_renderer_toggle_new ();
364 g_signal_connect (renderer, "toggled",
365 G_CALLBACK (preferences_sound_cell_toggled_cb),
368 column = gtk_tree_view_column_new ();
369 gtk_tree_view_column_pack_start (column, renderer, FALSE);
370 gtk_tree_view_column_add_attribute (column, renderer,
371 "active", COL_SOUND_ENABLED);
373 renderer = gtk_cell_renderer_text_new ();
374 gtk_tree_view_column_pack_start (column, renderer, FALSE);
375 gtk_tree_view_column_add_attribute (column, renderer,
376 "text", COL_SOUND_NAME);
378 gtk_tree_view_append_column (view, column);
380 gtk_tree_view_column_set_resizable (column, FALSE);
381 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
383 g_object_unref (store);
387 preferences_languages_setup (EmpathyPreferences *preferences)
391 GtkTreeSelection *selection;
393 GtkTreeViewColumn *column;
394 GtkCellRenderer *renderer;
397 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
399 store = gtk_list_store_new (COL_LANG_COUNT,
400 G_TYPE_BOOLEAN, /* enabled */
401 G_TYPE_STRING, /* code */
402 G_TYPE_STRING); /* name */
404 gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
406 selection = gtk_tree_view_get_selection (view);
407 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
409 model = GTK_TREE_MODEL (store);
411 renderer = gtk_cell_renderer_toggle_new ();
412 g_signal_connect (renderer, "toggled",
413 G_CALLBACK (preferences_languages_cell_toggled_cb),
416 column = gtk_tree_view_column_new_with_attributes (NULL, renderer,
417 "active", COL_LANG_ENABLED,
420 gtk_tree_view_append_column (view, column);
422 renderer = gtk_cell_renderer_text_new ();
423 col_offset = gtk_tree_view_insert_column_with_attributes (view,
426 "text", COL_LANG_NAME,
429 g_object_set_data (G_OBJECT (renderer),
430 "column", GINT_TO_POINTER (COL_LANG_NAME));
432 column = gtk_tree_view_get_column (view, col_offset - 1);
433 gtk_tree_view_column_set_sort_column_id (column, COL_LANG_NAME);
434 gtk_tree_view_column_set_resizable (column, FALSE);
435 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
437 g_object_unref (store);
441 preferences_languages_add (EmpathyPreferences *preferences)
447 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
448 store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
450 codes = empathy_spell_get_language_codes ();
452 empathy_conf_set_bool (empathy_conf_get (),
453 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
456 gtk_widget_set_sensitive (preferences->treeview_spell_checker, FALSE);
459 for (l = codes; l; l = l->next) {
465 name = empathy_spell_get_language_name (code);
470 gtk_list_store_append (store, &iter);
471 gtk_list_store_set (store, &iter,
477 empathy_spell_free_language_codes (codes);
481 preferences_languages_save (EmpathyPreferences *preferences)
486 gchar *languages = NULL;
488 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
489 model = gtk_tree_view_get_model (view);
491 gtk_tree_model_foreach (model,
492 (GtkTreeModelForeachFunc) preferences_languages_save_foreach,
495 /* if user selects no languages, we don't want spell check */
496 empathy_conf_set_bool (empathy_conf_get (),
497 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
500 empathy_conf_set_string (empathy_conf_get (),
501 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES,
502 languages ? languages : "");
508 preferences_languages_save_foreach (GtkTreeModel *model,
520 gtk_tree_model_get (model, iter, COL_LANG_ENABLED, &enabled, -1);
525 gtk_tree_model_get (model, iter, COL_LANG_CODE, &code, -1);
531 *languages = g_strdup (code);
533 gchar *str = *languages;
534 *languages = g_strdup_printf ("%s,%s", str, code);
544 preferences_languages_load (EmpathyPreferences *preferences)
551 if (!empathy_conf_get_string (empathy_conf_get (),
552 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES,
557 vlanguages = g_strsplit (value, ",", -1);
560 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
561 model = gtk_tree_view_get_model (view);
563 gtk_tree_model_foreach (model,
564 (GtkTreeModelForeachFunc) preferences_languages_load_foreach,
567 g_strfreev (vlanguages);
571 preferences_languages_load_foreach (GtkTreeModel *model,
579 gboolean found = FALSE;
585 gtk_tree_model_get (model, iter, COL_LANG_CODE, &code, -1);
590 for (i = 0, lang = languages[i]; lang; lang = languages[++i]) {
591 if (strcmp (lang, code) == 0) {
597 gtk_list_store_set (GTK_LIST_STORE (model), iter, COL_LANG_ENABLED, found, -1);
602 preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
604 EmpathyPreferences *preferences)
613 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
614 model = gtk_tree_view_get_model (view);
615 store = GTK_LIST_STORE (model);
617 path = gtk_tree_path_new_from_string (path_string);
619 gtk_tree_model_get_iter (model, &iter, path);
620 gtk_tree_model_get (model, &iter, COL_LANG_ENABLED, &enabled, -1);
624 gtk_list_store_set (store, &iter, COL_LANG_ENABLED, enabled, -1);
625 gtk_tree_path_free (path);
627 preferences_languages_save (preferences);
631 preferences_widget_sync_bool (const gchar *key, GtkWidget *widget)
635 if (empathy_conf_get_bool (empathy_conf_get (), key, &value)) {
636 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
641 preferences_widget_sync_string (const gchar *key, GtkWidget *widget)
645 if (empathy_conf_get_string (empathy_conf_get (), key, &value) && value) {
646 if (GTK_IS_ENTRY (widget)) {
647 gtk_entry_set_text (GTK_ENTRY (widget), value);
648 } else if (GTK_IS_RADIO_BUTTON (widget)) {
649 if (strcmp (key, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
651 GEnumClass *enum_class;
652 GEnumValue *enum_value;
654 GtkWidget *toggle_widget;
656 /* Get index from new string */
657 type = empathy_contact_list_store_sort_get_type ();
658 enum_class = G_ENUM_CLASS (g_type_class_peek (type));
659 enum_value = g_enum_get_value_by_nick (enum_class, value);
662 list = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
663 toggle_widget = g_slist_nth_data (list, enum_value->value);
664 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle_widget), TRUE);
667 g_warning ("Unhandled key:'%s' just had string change", key);
676 preferences_notify_string_cb (EmpathyConf *conf,
680 preferences_widget_sync_string (key, user_data);
685 preferences_notify_bool_cb (EmpathyConf *conf,
689 preferences_widget_sync_bool (key, user_data);
693 preferences_notify_sensitivity_cb (EmpathyConf *conf,
699 if (empathy_conf_get_bool (conf, key, &value)) {
700 gtk_widget_set_sensitive (GTK_WIDGET (user_data), value);
706 preferences_widget_sync_int (const gchar *key, GtkWidget *widget)
710 if (empathy_conf_get_int (empathy_conf_get (), key, &value)) {
711 if (GTK_IS_SPIN_BUTTON (widget)) {
712 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget), value);
718 preferences_notify_int_cb (EmpathyConf *conf,
722 preferences_widget_sync_int (key, user_data);
726 preferences_hookup_spin_button (EmpathyPreferences *preferences,
732 preferences_widget_sync_int (key, widget);
734 g_object_set_data_full (G_OBJECT (widget), "key",
735 g_strdup (key), g_free);
737 g_signal_connect (widget,
739 G_CALLBACK (preferences_spin_button_value_changed_cb),
742 id = empathy_conf_notify_add (empathy_conf_get (),
744 preferences_notify_int_cb,
747 preferences_add_id (preferences, id);
752 preferences_hookup_entry (EmpathyPreferences *preferences,
758 preferences_widget_sync_string (key, widget);
760 g_object_set_data_full (G_OBJECT (widget), "key",
761 g_strdup (key), g_free);
763 g_signal_connect (widget,
765 G_CALLBACK (preferences_entry_value_changed_cb),
768 id = empathy_conf_notify_add (empathy_conf_get (),
770 preferences_notify_string_cb,
773 preferences_add_id (preferences, id);
778 preferences_spin_button_value_changed_cb (GtkWidget *button,
783 key = g_object_get_data (G_OBJECT (button), "key");
785 empathy_conf_set_int (empathy_conf_get (),
787 gtk_spin_button_get_value (GTK_SPIN_BUTTON (button)));
791 preferences_entry_value_changed_cb (GtkWidget *entry,
796 key = g_object_get_data (G_OBJECT (entry), "key");
798 empathy_conf_set_string (empathy_conf_get (),
800 gtk_entry_get_text (GTK_ENTRY (entry)));
805 preferences_hookup_toggle_button (EmpathyPreferences *preferences,
811 preferences_widget_sync_bool (key, widget);
813 g_object_set_data_full (G_OBJECT (widget), "key",
814 g_strdup (key), g_free);
816 g_signal_connect (widget,
818 G_CALLBACK (preferences_toggle_button_toggled_cb),
821 id = empathy_conf_notify_add (empathy_conf_get (),
823 preferences_notify_bool_cb,
826 preferences_add_id (preferences, id);
831 preferences_hookup_radio_button (EmpathyPreferences *preferences,
838 preferences_widget_sync_string (key, widget);
840 group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget));
841 for (l = group; l; l = l->next) {
842 g_signal_connect (l->data,
844 G_CALLBACK (preferences_radio_button_toggled_cb),
847 g_object_set_data_full (G_OBJECT (l->data), "key",
848 g_strdup (key), g_free);
851 id = empathy_conf_notify_add (empathy_conf_get (),
853 preferences_notify_string_cb,
856 preferences_add_id (preferences, id);
861 preferences_hookup_sensitivity (EmpathyPreferences *preferences,
868 if (empathy_conf_get_bool (empathy_conf_get (), key, &value)) {
869 gtk_widget_set_sensitive (widget, value);
872 id = empathy_conf_notify_add (empathy_conf_get (),
874 preferences_notify_sensitivity_cb,
877 preferences_add_id (preferences, id);
882 preferences_toggle_button_toggled_cb (GtkWidget *button,
887 key = g_object_get_data (G_OBJECT (button), "key");
889 empathy_conf_set_bool (empathy_conf_get (),
891 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
895 preferences_radio_button_toggled_cb (GtkWidget *button,
899 const gchar *value = NULL;
901 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
905 key = g_object_get_data (G_OBJECT (button), "key");
907 if (key && strcmp (key, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
910 GEnumClass *enum_class;
911 GEnumValue *enum_value;
913 group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
915 /* Get string from index */
916 type = empathy_contact_list_store_sort_get_type ();
917 enum_class = G_ENUM_CLASS (g_type_class_peek (type));
918 enum_value = g_enum_get_value (enum_class, g_slist_index (group, button));
921 g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioButton index:%d",
922 g_slist_index (group, button));
926 value = enum_value->value_nick;
927 } else if (key && strcmp (key, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM) == 0) {
931 empathy_conf_set_string (empathy_conf_get (), key, value);
936 preferences_theme_adium_update_visibility (EmpathyPreferences *preferences,
939 if (name && strcmp (name, "adium") == 0) {
940 gtk_widget_show (preferences->hbox_adium_theme);
942 gtk_widget_hide (preferences->hbox_adium_theme);
943 gtk_widget_hide (preferences->label_invalid_adium_theme);
948 preferences_theme_adium_update_validity (EmpathyPreferences *preferences,
951 if (empathy_theme_adium_is_valid (path)) {
952 gtk_widget_hide (preferences->label_invalid_adium_theme);
954 gtk_widget_show (preferences->label_invalid_adium_theme);
959 preferences_theme_adium_path_notify_cb (EmpathyConf *conf,
963 EmpathyPreferences *preferences = user_data;
964 GtkFileChooser *chooser;
967 if (!empathy_conf_get_string (conf, key, &value)) {
971 chooser = GTK_FILE_CHOOSER (preferences->filechooserbutton_adium_theme);
972 gtk_file_chooser_set_current_folder (chooser, value);
973 preferences_theme_adium_update_validity (preferences, value);
978 preferences_theme_adium_file_set_cb (GtkFileChooser *chooser,
979 EmpathyPreferences *preferences)
983 path = gtk_file_chooser_get_current_folder (chooser);
984 empathy_conf_set_string (empathy_conf_get (),
985 EMPATHY_PREFS_CHAT_ADIUM_PATH,
987 preferences_theme_adium_update_validity (preferences, path);
993 preferences_theme_notify_cb (EmpathyConf *conf,
997 EmpathyPreferences *preferences = user_data;
1000 GtkTreeModel *model;
1002 gboolean found = FALSE;
1004 if (!empathy_conf_get_string (conf, key, &value)) {
1008 preferences_theme_adium_update_visibility (preferences, value);
1010 combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
1011 model = gtk_combo_box_get_model (combo);
1012 if (value && gtk_tree_model_get_iter_first (model, &iter)) {
1016 gtk_tree_model_get (model, &iter,
1017 COL_COMBO_NAME, &name,
1020 if (strcmp (name, value) == 0) {
1022 gtk_combo_box_set_active_iter (combo, &iter);
1027 } while (gtk_tree_model_iter_next (model, &iter));
1030 /* Fallback to the first one. */
1032 if (gtk_tree_model_get_iter_first (model, &iter)) {
1033 gtk_combo_box_set_active_iter (combo, &iter);
1041 preferences_theme_changed_cb (GtkComboBox *combo,
1042 EmpathyPreferences *preferences)
1044 GtkTreeModel *model;
1048 if (gtk_combo_box_get_active_iter (combo, &iter)) {
1049 model = gtk_combo_box_get_model (combo);
1051 gtk_tree_model_get (model, &iter,
1052 COL_COMBO_NAME, &name,
1055 preferences_theme_adium_update_visibility (preferences, name);
1057 empathy_conf_set_string (empathy_conf_get (),
1058 EMPATHY_PREFS_CHAT_THEME,
1065 preferences_themes_setup (EmpathyPreferences *preferences)
1068 GtkCellLayout *cell_layout;
1069 GtkCellRenderer *renderer;
1070 GtkListStore *store;
1071 const gchar **themes;
1075 combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
1076 cell_layout = GTK_CELL_LAYOUT (combo);
1078 /* Create the model */
1079 store = gtk_list_store_new (COL_COMBO_COUNT,
1080 G_TYPE_STRING, /* Display name */
1081 G_TYPE_STRING); /* Theme name */
1083 /* Fill the model */
1084 themes = empathy_theme_manager_get_themes ();
1085 for (i = 0; themes[i]; i += 2) {
1086 gtk_list_store_insert_with_values (store, NULL, -1,
1087 COL_COMBO_VISIBLE_NAME, _(themes[i + 1]),
1088 COL_COMBO_NAME, themes[i],
1092 /* Add cell renderer */
1093 renderer = gtk_cell_renderer_text_new ();
1094 gtk_cell_layout_pack_start (cell_layout, renderer, TRUE);
1095 gtk_cell_layout_set_attributes (cell_layout, renderer,
1096 "text", COL_COMBO_VISIBLE_NAME, NULL);
1098 gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store));
1099 g_object_unref (store);
1101 g_signal_connect (combo, "changed",
1102 G_CALLBACK (preferences_theme_changed_cb),
1105 /* Select the theme from the gconf key and track changes */
1106 preferences_theme_notify_cb (empathy_conf_get (),
1107 EMPATHY_PREFS_CHAT_THEME,
1109 id = empathy_conf_notify_add (empathy_conf_get (),
1110 EMPATHY_PREFS_CHAT_THEME,
1111 preferences_theme_notify_cb,
1114 preferences_add_id (preferences, id);
1117 g_signal_connect (preferences->filechooserbutton_adium_theme,
1119 G_CALLBACK (preferences_theme_adium_file_set_cb),
1121 /* Select the adium path from the gconf key and track changes */
1122 preferences_theme_adium_path_notify_cb (empathy_conf_get (),
1123 EMPATHY_PREFS_CHAT_ADIUM_PATH,
1125 id = empathy_conf_notify_add (empathy_conf_get (),
1126 EMPATHY_PREFS_CHAT_ADIUM_PATH,
1127 preferences_theme_adium_path_notify_cb,
1130 preferences_add_id (preferences, id);
1135 preferences_response_cb (GtkWidget *widget,
1137 EmpathyPreferences *preferences)
1139 gtk_widget_destroy (widget);
1143 preferences_destroy_cb (GtkWidget *widget,
1144 EmpathyPreferences *preferences)
1148 for (l = preferences->notify_ids; l; l = l->next) {
1151 id = GPOINTER_TO_UINT (l->data);
1152 empathy_conf_notify_remove (empathy_conf_get (), id);
1155 g_list_free (preferences->notify_ids);
1156 g_free (preferences);
1160 empathy_preferences_show (GtkWindow *parent)
1162 static EmpathyPreferences *preferences;
1168 gtk_window_present (GTK_WINDOW (preferences->dialog));
1169 return preferences->dialog;
1172 preferences = g_new0 (EmpathyPreferences, 1);
1174 filename = empathy_file_lookup ("empathy-preferences.ui", "src");
1175 gui = empathy_builder_get_file (filename,
1176 "preferences_dialog", &preferences->dialog,
1177 "notebook", &preferences->notebook,
1178 "checkbutton_show_avatars", &preferences->checkbutton_show_avatars,
1179 "checkbutton_compact_contact_list", &preferences->checkbutton_compact_contact_list,
1180 "checkbutton_show_smileys", &preferences->checkbutton_show_smileys,
1181 "combobox_chat_theme", &preferences->combobox_chat_theme,
1182 "hbox_adium_theme", &preferences->hbox_adium_theme,
1183 "filechooserbutton_adium_theme", &preferences->filechooserbutton_adium_theme,
1184 "label_invalid_adium_theme", &preferences->label_invalid_adium_theme,
1185 "checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
1186 "checkbutton_autoconnect", &preferences->checkbutton_autoconnect,
1187 "radiobutton_contact_list_sort_by_name", &preferences->radiobutton_contact_list_sort_by_name,
1188 "radiobutton_contact_list_sort_by_state", &preferences->radiobutton_contact_list_sort_by_state,
1189 "checkbutton_notifications_enabled", &preferences->checkbutton_notifications_enabled,
1190 "checkbutton_notifications_disabled_away", &preferences->checkbutton_notifications_disabled_away,
1191 "checkbutton_notifications_focus", &preferences->checkbutton_notifications_focus,
1192 "checkbutton_sounds_enabled", &preferences->checkbutton_sounds_enabled,
1193 "checkbutton_sounds_disabled_away", &preferences->checkbutton_sounds_disabled_away,
1194 "treeview_sounds", &preferences->treeview_sounds,
1195 "treeview_spell_checker", &preferences->treeview_spell_checker,
1196 "checkbutton_location_publish", &preferences->checkbutton_location_publish,
1197 "checkbutton_location_reduce_accuracy", &preferences->checkbutton_location_reduce_accuracy,
1198 "checkbutton_location_resource_network", &preferences->checkbutton_location_resource_network,
1199 "checkbutton_location_resource_cell", &preferences->checkbutton_location_resource_cell,
1200 "checkbutton_location_resource_gps", &preferences->checkbutton_location_resource_gps,
1204 empathy_builder_connect (gui, preferences,
1205 "preferences_dialog", "destroy", preferences_destroy_cb,
1206 "preferences_dialog", "response", preferences_response_cb,
1209 g_object_unref (gui);
1211 g_object_add_weak_pointer (G_OBJECT (preferences->dialog), (gpointer) &preferences);
1213 preferences_themes_setup (preferences);
1215 preferences_setup_widgets (preferences);
1217 preferences_languages_setup (preferences);
1218 preferences_languages_add (preferences);
1219 preferences_languages_load (preferences);
1221 preferences_sound_setup (preferences);
1222 preferences_sound_load (preferences);
1224 if (empathy_spell_supported ()) {
1227 page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences->notebook), 2);
1228 gtk_widget_show (page);
1231 page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences->notebook), 3);
1233 gtk_widget_show (page);
1235 gtk_widget_hide (page);
1240 gtk_window_set_transient_for (GTK_WINDOW (preferences->dialog),
1241 GTK_WINDOW (parent));
1244 gtk_widget_show (preferences->dialog);
1246 return preferences->dialog;