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>
31 #include <telepathy-glib/dbus.h>
32 #include <telepathy-glib/util.h>
34 #include <libempathy/empathy-gsettings.h>
35 #include <libempathy/empathy-utils.h>
37 #include <libempathy-gtk/empathy-ui-utils.h>
38 #include <libempathy-gtk/empathy-theme-manager.h>
39 #include <libempathy-gtk/empathy-spell.h>
40 #include <libempathy-gtk/empathy-contact-list-store.h>
41 #include <libempathy-gtk/empathy-gtk-enum-types.h>
44 #include <libempathy-gtk/empathy-theme-adium.h>
47 #include "empathy-preferences.h"
54 GtkWidget *checkbutton_show_smileys;
55 GtkWidget *checkbutton_show_contacts_in_rooms;
56 GtkWidget *combobox_chat_theme;
57 GtkWidget *checkbutton_separate_chat_windows;
58 GtkWidget *checkbutton_autoconnect;
60 GtkWidget *checkbutton_sounds_enabled;
61 GtkWidget *checkbutton_sounds_disabled_away;
62 GtkWidget *treeview_sounds;
64 GtkWidget *checkbutton_notifications_enabled;
65 GtkWidget *checkbutton_notifications_disabled_away;
66 GtkWidget *checkbutton_notifications_focus;
67 GtkWidget *checkbutton_notifications_contact_signin;
68 GtkWidget *checkbutton_notifications_contact_signout;
70 GtkWidget *treeview_spell_checker;
72 GtkWidget *checkbutton_location_publish;
73 GtkWidget *checkbutton_location_reduce_accuracy;
74 GtkWidget *checkbutton_location_resource_network;
75 GtkWidget *checkbutton_location_resource_cell;
76 GtkWidget *checkbutton_location_resource_gps;
79 GSettings *gsettings_chat;
80 GSettings *gsettings_loc;
81 GSettings *gsettings_notify;
82 GSettings *gsettings_sound;
83 GSettings *gsettings_ui;
86 static void preferences_setup_widgets (EmpathyPreferences *preferences);
87 static void preferences_languages_setup (EmpathyPreferences *preferences);
88 static void preferences_languages_add (EmpathyPreferences *preferences);
89 static void preferences_languages_save (EmpathyPreferences *preferences);
90 static gboolean preferences_languages_save_foreach (GtkTreeModel *model,
94 static void preferences_languages_load (EmpathyPreferences *preferences);
95 static gboolean preferences_languages_load_foreach (GtkTreeModel *model,
99 static void preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
101 EmpathyPreferences *preferences);
102 static void preferences_destroy_cb (GtkWidget *widget,
103 EmpathyPreferences *preferences);
104 static void preferences_response_cb (GtkWidget *widget,
106 EmpathyPreferences *preferences);
117 COL_COMBO_VISIBLE_NAME,
135 /* TODO: add phone related sounds also? */
136 static SoundEventEntry sound_entries [] = {
137 { N_("Message received"), EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE },
138 { N_("Message sent"), EMPATHY_PREFS_SOUNDS_OUTGOING_MESSAGE },
139 { N_("New conversation"), EMPATHY_PREFS_SOUNDS_NEW_CONVERSATION },
140 { N_("Contact goes online"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN },
141 { N_("Contact goes offline"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT },
142 { N_("Account connected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN },
143 { N_("Account disconnected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT }
147 preferences_setup_widgets (EmpathyPreferences *preferences)
149 g_settings_bind (preferences->gsettings_notify,
150 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
151 preferences->checkbutton_notifications_enabled,
153 G_SETTINGS_BIND_DEFAULT);
154 g_settings_bind (preferences->gsettings_notify,
155 EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY,
156 preferences->checkbutton_notifications_disabled_away,
158 G_SETTINGS_BIND_DEFAULT);
159 g_settings_bind (preferences->gsettings_notify,
160 EMPATHY_PREFS_NOTIFICATIONS_FOCUS,
161 preferences->checkbutton_notifications_focus,
163 G_SETTINGS_BIND_DEFAULT);
164 g_settings_bind (preferences->gsettings_notify,
165 EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNIN,
166 preferences->checkbutton_notifications_contact_signin,
168 G_SETTINGS_BIND_DEFAULT);
169 g_settings_bind (preferences->gsettings_notify,
170 EMPATHY_PREFS_NOTIFICATIONS_CONTACT_SIGNOUT,
171 preferences->checkbutton_notifications_contact_signout,
173 G_SETTINGS_BIND_DEFAULT);
175 g_settings_bind (preferences->gsettings_notify,
176 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
177 preferences->checkbutton_notifications_disabled_away,
179 G_SETTINGS_BIND_GET);
180 g_settings_bind (preferences->gsettings_notify,
181 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
182 preferences->checkbutton_notifications_focus,
184 G_SETTINGS_BIND_GET);
185 g_settings_bind (preferences->gsettings_notify,
186 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
187 preferences->checkbutton_notifications_contact_signin,
189 G_SETTINGS_BIND_GET);
190 g_settings_bind (preferences->gsettings_notify,
191 EMPATHY_PREFS_NOTIFICATIONS_ENABLED,
192 preferences->checkbutton_notifications_contact_signout,
194 G_SETTINGS_BIND_GET);
196 g_settings_bind (preferences->gsettings_sound,
197 EMPATHY_PREFS_SOUNDS_ENABLED,
198 preferences->checkbutton_sounds_enabled,
200 G_SETTINGS_BIND_DEFAULT);
201 g_settings_bind (preferences->gsettings_sound,
202 EMPATHY_PREFS_SOUNDS_DISABLED_AWAY,
203 preferences->checkbutton_sounds_disabled_away,
205 G_SETTINGS_BIND_DEFAULT);
207 g_settings_bind (preferences->gsettings_sound,
208 EMPATHY_PREFS_SOUNDS_ENABLED,
209 preferences->checkbutton_sounds_disabled_away,
211 G_SETTINGS_BIND_GET);
212 g_settings_bind (preferences->gsettings_sound,
213 EMPATHY_PREFS_SOUNDS_ENABLED,
214 preferences->treeview_sounds,
216 G_SETTINGS_BIND_GET);
218 g_settings_bind (preferences->gsettings_ui,
219 EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS,
220 preferences->checkbutton_separate_chat_windows,
222 G_SETTINGS_BIND_DEFAULT);
224 g_settings_bind (preferences->gsettings_chat,
225 EMPATHY_PREFS_CHAT_SHOW_SMILEYS,
226 preferences->checkbutton_show_smileys,
228 G_SETTINGS_BIND_DEFAULT);
229 g_settings_bind (preferences->gsettings_chat,
230 EMPATHY_PREFS_CHAT_SHOW_CONTACTS_IN_ROOMS,
231 preferences->checkbutton_show_contacts_in_rooms,
233 G_SETTINGS_BIND_DEFAULT);
235 g_settings_bind (preferences->gsettings,
236 EMPATHY_PREFS_AUTOCONNECT,
237 preferences->checkbutton_autoconnect,
239 G_SETTINGS_BIND_DEFAULT);
241 g_settings_bind (preferences->gsettings_loc,
242 EMPATHY_PREFS_LOCATION_PUBLISH,
243 preferences->checkbutton_location_publish,
245 G_SETTINGS_BIND_DEFAULT);
247 g_settings_bind (preferences->gsettings_loc,
248 EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK,
249 preferences->checkbutton_location_resource_network,
251 G_SETTINGS_BIND_DEFAULT);
252 g_settings_bind (preferences->gsettings_loc,
253 EMPATHY_PREFS_LOCATION_PUBLISH,
254 preferences->checkbutton_location_resource_network,
256 G_SETTINGS_BIND_GET);
258 g_settings_bind (preferences->gsettings_loc,
259 EMPATHY_PREFS_LOCATION_RESOURCE_CELL,
260 preferences->checkbutton_location_resource_cell,
262 G_SETTINGS_BIND_DEFAULT);
263 g_settings_bind (preferences->gsettings_loc,
264 EMPATHY_PREFS_LOCATION_PUBLISH,
265 preferences->checkbutton_location_resource_cell,
267 G_SETTINGS_BIND_GET);
269 g_settings_bind (preferences->gsettings_loc,
270 EMPATHY_PREFS_LOCATION_RESOURCE_GPS,
271 preferences->checkbutton_location_resource_gps,
273 G_SETTINGS_BIND_DEFAULT);
274 g_settings_bind (preferences->gsettings_loc,
275 EMPATHY_PREFS_LOCATION_PUBLISH,
276 preferences->checkbutton_location_resource_gps,
278 G_SETTINGS_BIND_GET);
280 g_settings_bind (preferences->gsettings_loc,
281 EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY,
282 preferences->checkbutton_location_reduce_accuracy,
284 G_SETTINGS_BIND_DEFAULT);
285 g_settings_bind (preferences->gsettings_loc,
286 EMPATHY_PREFS_LOCATION_PUBLISH,
287 preferences->checkbutton_location_reduce_accuracy,
289 G_SETTINGS_BIND_GET);
293 preferences_sound_cell_toggled_cb (GtkCellRendererToggle *toggle,
295 EmpathyPreferences *preferences)
298 gboolean toggled, instore;
304 view = GTK_TREE_VIEW (preferences->treeview_sounds);
305 model = gtk_tree_view_get_model (view);
307 path = gtk_tree_path_new_from_string (path_string);
308 toggled = gtk_cell_renderer_toggle_get_active (toggle);
310 gtk_tree_model_get_iter (model, &iter, path);
311 gtk_tree_model_get (model, &iter, COL_SOUND_KEY, &key,
312 COL_SOUND_ENABLED, &instore, -1);
316 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
317 COL_SOUND_ENABLED, instore, -1);
319 g_settings_set_boolean (preferences->gsettings_sound, key, instore);
322 gtk_tree_path_free (path);
326 preferences_sound_load (EmpathyPreferences *preferences)
334 view = GTK_TREE_VIEW (preferences->treeview_sounds);
335 store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
337 for (i = 0; i < G_N_ELEMENTS (sound_entries); i++) {
338 set = g_settings_get_boolean (preferences->gsettings_sound,
339 sound_entries[i].key);
341 gtk_list_store_insert_with_values (store, &iter, i,
342 COL_SOUND_NAME, gettext (sound_entries[i].name),
343 COL_SOUND_KEY, sound_entries[i].key,
344 COL_SOUND_ENABLED, set, -1);
349 preferences_sound_setup (EmpathyPreferences *preferences)
353 GtkCellRenderer *renderer;
354 GtkTreeViewColumn *column;
356 view = GTK_TREE_VIEW (preferences->treeview_sounds);
358 store = gtk_list_store_new (COL_SOUND_COUNT,
359 G_TYPE_BOOLEAN, /* enabled */
360 G_TYPE_STRING, /* name */
361 G_TYPE_STRING); /* key */
363 gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
365 renderer = gtk_cell_renderer_toggle_new ();
366 g_signal_connect (renderer, "toggled",
367 G_CALLBACK (preferences_sound_cell_toggled_cb),
370 column = gtk_tree_view_column_new ();
371 gtk_tree_view_column_pack_start (column, renderer, FALSE);
372 gtk_tree_view_column_add_attribute (column, renderer,
373 "active", COL_SOUND_ENABLED);
375 renderer = gtk_cell_renderer_text_new ();
376 gtk_tree_view_column_pack_start (column, renderer, FALSE);
377 gtk_tree_view_column_add_attribute (column, renderer,
378 "text", COL_SOUND_NAME);
380 gtk_tree_view_append_column (view, column);
382 gtk_tree_view_column_set_resizable (column, FALSE);
383 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
385 g_object_unref (store);
389 preferences_languages_setup (EmpathyPreferences *preferences)
393 GtkTreeSelection *selection;
395 GtkTreeViewColumn *column;
396 GtkCellRenderer *renderer;
399 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
401 store = gtk_list_store_new (COL_LANG_COUNT,
402 G_TYPE_BOOLEAN, /* enabled */
403 G_TYPE_STRING, /* code */
404 G_TYPE_STRING); /* name */
406 gtk_tree_view_set_model (view, GTK_TREE_MODEL (store));
408 selection = gtk_tree_view_get_selection (view);
409 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
411 model = GTK_TREE_MODEL (store);
413 renderer = gtk_cell_renderer_toggle_new ();
414 g_signal_connect (renderer, "toggled",
415 G_CALLBACK (preferences_languages_cell_toggled_cb),
418 column = gtk_tree_view_column_new_with_attributes (NULL, renderer,
419 "active", COL_LANG_ENABLED,
422 gtk_tree_view_append_column (view, column);
424 renderer = gtk_cell_renderer_text_new ();
425 col_offset = gtk_tree_view_insert_column_with_attributes (view,
428 "text", COL_LANG_NAME,
431 g_object_set_data (G_OBJECT (renderer),
432 "column", GINT_TO_POINTER (COL_LANG_NAME));
434 column = gtk_tree_view_get_column (view, col_offset - 1);
435 gtk_tree_view_column_set_sort_column_id (column, COL_LANG_NAME);
436 gtk_tree_view_column_set_resizable (column, FALSE);
437 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
439 g_object_unref (store);
443 preferences_languages_add (EmpathyPreferences *preferences)
449 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
450 store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
452 codes = empathy_spell_get_language_codes ();
454 g_settings_set_boolean (preferences->gsettings_chat,
455 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
458 gtk_widget_set_sensitive (preferences->treeview_spell_checker, FALSE);
461 for (l = codes; l; l = l->next) {
467 name = empathy_spell_get_language_name (code);
472 gtk_list_store_append (store, &iter);
473 gtk_list_store_set (store, &iter,
479 empathy_spell_free_language_codes (codes);
483 preferences_languages_save (EmpathyPreferences *preferences)
488 gchar *languages = NULL;
490 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
491 model = gtk_tree_view_get_model (view);
493 gtk_tree_model_foreach (model,
494 (GtkTreeModelForeachFunc) preferences_languages_save_foreach,
497 /* if user selects no languages, we don't want spell check */
498 g_settings_set_boolean (preferences->gsettings_chat,
499 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED,
502 g_settings_set_string (preferences->gsettings_chat,
503 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES,
504 languages != NULL ? languages : "");
510 preferences_languages_save_foreach (GtkTreeModel *model,
522 gtk_tree_model_get (model, iter, COL_LANG_ENABLED, &enabled, -1);
527 gtk_tree_model_get (model, iter, COL_LANG_CODE, &code, -1);
533 *languages = g_strdup (code);
535 gchar *str = *languages;
536 *languages = g_strdup_printf ("%s,%s", str, code);
546 preferences_languages_load (EmpathyPreferences *preferences)
553 value = g_settings_get_string (preferences->gsettings_chat,
554 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES);
559 vlanguages = g_strsplit (value, ",", -1);
562 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
563 model = gtk_tree_view_get_model (view);
565 gtk_tree_model_foreach (model,
566 (GtkTreeModelForeachFunc) preferences_languages_load_foreach,
569 g_strfreev (vlanguages);
573 preferences_languages_load_foreach (GtkTreeModel *model,
581 gboolean found = FALSE;
587 gtk_tree_model_get (model, iter, COL_LANG_CODE, &code, -1);
592 for (i = 0, lang = languages[i]; lang; lang = languages[++i]) {
593 if (!tp_strdiff (lang, code)) {
599 gtk_list_store_set (GTK_LIST_STORE (model), iter, COL_LANG_ENABLED, found, -1);
604 preferences_languages_cell_toggled_cb (GtkCellRendererToggle *cell,
606 EmpathyPreferences *preferences)
615 view = GTK_TREE_VIEW (preferences->treeview_spell_checker);
616 model = gtk_tree_view_get_model (view);
617 store = GTK_LIST_STORE (model);
619 path = gtk_tree_path_new_from_string (path_string);
621 gtk_tree_model_get_iter (model, &iter, path);
622 gtk_tree_model_get (model, &iter, COL_LANG_ENABLED, &enabled, -1);
626 gtk_list_store_set (store, &iter, COL_LANG_ENABLED, enabled, -1);
627 gtk_tree_path_free (path);
629 preferences_languages_save (preferences);
633 preferences_theme_notify_cb (GSettings *gsettings,
637 EmpathyPreferences *preferences = user_data;
643 gboolean found = FALSE;
645 conf_name = g_settings_get_string (gsettings, EMPATHY_PREFS_CHAT_THEME);
646 conf_path = g_settings_get_string (gsettings, EMPATHY_PREFS_CHAT_ADIUM_PATH);
648 combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
649 model = gtk_combo_box_get_model (combo);
650 if (gtk_tree_model_get_iter_first (model, &iter)) {
656 gtk_tree_model_get (model, &iter,
657 COL_COMBO_IS_ADIUM, &is_adium,
658 COL_COMBO_NAME, &name,
659 COL_COMBO_PATH, &path,
662 if (!tp_strdiff (name, conf_name)) {
663 if (tp_strdiff (name, "adium") ||
664 !tp_strdiff (path, conf_path)) {
666 gtk_combo_box_set_active_iter (combo, &iter);
675 } while (gtk_tree_model_iter_next (model, &iter));
678 /* Fallback to the first one. */
680 if (gtk_tree_model_get_iter_first (model, &iter)) {
681 gtk_combo_box_set_active_iter (combo, &iter);
690 preferences_theme_changed_cb (GtkComboBox *combo,
691 EmpathyPreferences *preferences)
699 if (gtk_combo_box_get_active_iter (combo, &iter)) {
700 model = gtk_combo_box_get_model (combo);
702 gtk_tree_model_get (model, &iter,
703 COL_COMBO_IS_ADIUM, &is_adium,
704 COL_COMBO_NAME, &name,
705 COL_COMBO_PATH, &path,
708 g_settings_set_string (preferences->gsettings_chat,
709 EMPATHY_PREFS_CHAT_THEME,
711 if (is_adium == TRUE)
712 g_settings_set_string (preferences->gsettings_chat,
713 EMPATHY_PREFS_CHAT_ADIUM_PATH,
721 preferences_themes_setup (EmpathyPreferences *preferences)
724 GtkCellLayout *cell_layout;
725 GtkCellRenderer *renderer;
727 const gchar **themes;
731 combo = GTK_COMBO_BOX (preferences->combobox_chat_theme);
732 cell_layout = GTK_CELL_LAYOUT (combo);
734 /* Create the model */
735 store = gtk_list_store_new (COL_COMBO_COUNT,
736 G_TYPE_BOOLEAN, /* Is an Adium theme */
737 G_TYPE_STRING, /* Display name */
738 G_TYPE_STRING, /* Theme name */
739 G_TYPE_STRING); /* Theme path */
740 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
741 COL_COMBO_VISIBLE_NAME, GTK_SORT_ASCENDING);
744 themes = empathy_theme_manager_get_themes ();
745 for (i = 0; themes[i]; i += 2) {
746 gtk_list_store_insert_with_values (store, NULL, -1,
747 COL_COMBO_IS_ADIUM, FALSE,
748 COL_COMBO_VISIBLE_NAME, _(themes[i + 1]),
749 COL_COMBO_NAME, themes[i],
750 COL_COMBO_PATH, NULL,
754 adium_themes = empathy_theme_manager_get_adium_themes ();
755 while (adium_themes != NULL) {
760 info = adium_themes->data;
761 name = tp_asv_get_string (info, "CFBundleName");
762 path = tp_asv_get_string (info, "path");
764 if (name != NULL && path != NULL) {
765 gtk_list_store_insert_with_values (store, NULL, -1,
766 COL_COMBO_IS_ADIUM, TRUE,
767 COL_COMBO_VISIBLE_NAME, name,
768 COL_COMBO_NAME, "adium",
769 COL_COMBO_PATH, path,
772 g_hash_table_unref (info);
773 adium_themes = g_list_delete_link (adium_themes, adium_themes);
776 /* Add cell renderer */
777 renderer = gtk_cell_renderer_text_new ();
778 gtk_cell_layout_pack_start (cell_layout, renderer, TRUE);
779 gtk_cell_layout_set_attributes (cell_layout, renderer,
780 "text", COL_COMBO_VISIBLE_NAME, NULL);
782 gtk_combo_box_set_model (combo, GTK_TREE_MODEL (store));
783 g_object_unref (store);
785 g_signal_connect (combo, "changed",
786 G_CALLBACK (preferences_theme_changed_cb),
789 /* Select the theme from the gconf key and track changes */
790 preferences_theme_notify_cb (preferences->gsettings_chat,
791 EMPATHY_PREFS_CHAT_THEME,
793 g_signal_connect (preferences->gsettings_chat,
794 "changed::" EMPATHY_PREFS_CHAT_THEME,
795 G_CALLBACK (preferences_theme_notify_cb),
798 g_signal_connect (preferences->gsettings_chat,
799 "changed::" EMPATHY_PREFS_CHAT_ADIUM_PATH,
800 G_CALLBACK (preferences_theme_notify_cb),
805 preferences_response_cb (GtkWidget *widget,
807 EmpathyPreferences *preferences)
809 gtk_widget_destroy (widget);
813 preferences_destroy_cb (GtkWidget *widget,
814 EmpathyPreferences *preferences)
816 g_object_unref (preferences->gsettings);
817 g_object_unref (preferences->gsettings_chat);
818 g_object_unref (preferences->gsettings_loc);
819 g_object_unref (preferences->gsettings_notify);
820 g_object_unref (preferences->gsettings_sound);
821 g_object_unref (preferences->gsettings_ui);
823 g_free (preferences);
827 empathy_preferences_show (GtkWindow *parent)
829 static EmpathyPreferences *preferences;
835 gtk_window_present (GTK_WINDOW (preferences->dialog));
836 return preferences->dialog;
839 preferences = g_new0 (EmpathyPreferences, 1);
841 filename = empathy_file_lookup ("empathy-preferences.ui", "src");
842 gui = empathy_builder_get_file (filename,
843 "preferences_dialog", &preferences->dialog,
844 "notebook", &preferences->notebook,
845 "checkbutton_show_smileys", &preferences->checkbutton_show_smileys,
846 "checkbutton_show_contacts_in_rooms", &preferences->checkbutton_show_contacts_in_rooms,
847 "combobox_chat_theme", &preferences->combobox_chat_theme,
848 "checkbutton_separate_chat_windows", &preferences->checkbutton_separate_chat_windows,
849 "checkbutton_autoconnect", &preferences->checkbutton_autoconnect,
850 "checkbutton_notifications_enabled", &preferences->checkbutton_notifications_enabled,
851 "checkbutton_notifications_disabled_away", &preferences->checkbutton_notifications_disabled_away,
852 "checkbutton_notifications_focus", &preferences->checkbutton_notifications_focus,
853 "checkbutton_notifications_contact_signin", &preferences->checkbutton_notifications_contact_signin,
854 "checkbutton_notifications_contact_signout", &preferences->checkbutton_notifications_contact_signout,
855 "checkbutton_sounds_enabled", &preferences->checkbutton_sounds_enabled,
856 "checkbutton_sounds_disabled_away", &preferences->checkbutton_sounds_disabled_away,
857 "treeview_sounds", &preferences->treeview_sounds,
858 "treeview_spell_checker", &preferences->treeview_spell_checker,
859 "checkbutton_location_publish", &preferences->checkbutton_location_publish,
860 "checkbutton_location_reduce_accuracy", &preferences->checkbutton_location_reduce_accuracy,
861 "checkbutton_location_resource_network", &preferences->checkbutton_location_resource_network,
862 "checkbutton_location_resource_cell", &preferences->checkbutton_location_resource_cell,
863 "checkbutton_location_resource_gps", &preferences->checkbutton_location_resource_gps,
867 empathy_builder_connect (gui, preferences,
868 "preferences_dialog", "destroy", preferences_destroy_cb,
869 "preferences_dialog", "response", preferences_response_cb,
872 g_object_unref (gui);
874 g_object_add_weak_pointer (G_OBJECT (preferences->dialog), (gpointer) &preferences);
876 preferences->gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA);
877 preferences->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
878 preferences->gsettings_loc = g_settings_new (EMPATHY_PREFS_LOCATION_SCHEMA);
879 preferences->gsettings_notify = g_settings_new (EMPATHY_PREFS_NOTIFICATIONS_SCHEMA);
880 preferences->gsettings_sound = g_settings_new (EMPATHY_PREFS_SOUNDS_SCHEMA);
881 preferences->gsettings_ui = g_settings_new (EMPATHY_PREFS_UI_SCHEMA);
883 preferences_themes_setup (preferences);
885 preferences_setup_widgets (preferences);
887 preferences_languages_setup (preferences);
888 preferences_languages_add (preferences);
889 preferences_languages_load (preferences);
891 preferences_sound_setup (preferences);
892 preferences_sound_load (preferences);
894 if (empathy_spell_supported ()) {
895 page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences->notebook), 2);
896 gtk_widget_show (page);
899 page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences->notebook), 3);
901 gtk_widget_show (page);
903 gtk_widget_hide (page);
908 gtk_window_set_transient_for (GTK_WINDOW (preferences->dialog),
909 GTK_WINDOW (parent));
912 gtk_widget_show (preferences->dialog);
914 return preferences->dialog;