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-spell.h>
38 #include <libempathy-gtk/empathy-contact-list-store.h>
39 #include <libempathy-gtk/empathy-gtk-enum-types.h>
41 #include "empathy-preferences.h"
48 GtkWidget
*checkbutton_show_avatars
;
49 GtkWidget
*checkbutton_compact_contact_list
;
50 GtkWidget
*checkbutton_show_smileys
;
51 GtkWidget
*combobox_chat_theme
;
52 GtkWidget
*checkbutton_separate_chat_windows
;
53 GtkWidget
*checkbutton_autoconnect
;
54 GtkWidget
*radiobutton_contact_list_sort_by_name
;
55 GtkWidget
*radiobutton_contact_list_sort_by_state
;
57 GtkWidget
*checkbutton_sounds_enabled
;
58 GtkWidget
*checkbutton_sounds_disabled_away
;
59 GtkWidget
*treeview_sounds
;
61 GtkWidget
*checkbutton_notifications_enabled
;
62 GtkWidget
*checkbutton_notifications_disabled_away
;
63 GtkWidget
*checkbutton_notifications_focus
;
65 GtkWidget
*treeview_spell_checker
;
67 GtkWidget
*checkbutton_location_publish
;
68 GtkWidget
*checkbutton_location_reduce_accuracy
;
69 GtkWidget
*checkbutton_location_resource_network
;
70 GtkWidget
*checkbutton_location_resource_cell
;
71 GtkWidget
*checkbutton_location_resource_gps
;
76 static void preferences_setup_widgets (EmpathyPreferences
*preferences
);
77 static void preferences_languages_setup (EmpathyPreferences
*preferences
);
78 static void preferences_languages_add (EmpathyPreferences
*preferences
);
79 static void preferences_languages_save (EmpathyPreferences
*preferences
);
80 static gboolean
preferences_languages_save_foreach (GtkTreeModel
*model
,
84 static void preferences_languages_load (EmpathyPreferences
*preferences
);
85 static gboolean
preferences_languages_load_foreach (GtkTreeModel
*model
,
89 static void preferences_languages_cell_toggled_cb (GtkCellRendererToggle
*cell
,
91 EmpathyPreferences
*preferences
);
92 static void preferences_themes_setup (EmpathyPreferences
*preferences
);
93 static void preferences_widget_sync_bool (const gchar
*key
,
95 static void preferences_widget_sync_string (const gchar
*key
,
97 static void preferences_widget_sync_string_combo (const gchar
*key
,
99 static void preferences_notify_string_cb (EmpathyConf
*conf
,
102 static void preferences_notify_string_combo_cb (EmpathyConf
*conf
,
105 static void preferences_notify_bool_cb (EmpathyConf
*conf
,
108 static void preferences_notify_sensitivity_cb (EmpathyConf
*conf
,
111 static void preferences_hookup_toggle_button (EmpathyPreferences
*preferences
,
114 static void preferences_hookup_radio_button (EmpathyPreferences
*preferences
,
117 static void preferences_hookup_string_combo (EmpathyPreferences
*preferences
,
120 static void preferences_hookup_sensitivity (EmpathyPreferences
*preferences
,
123 static void preferences_toggle_button_toggled_cb (GtkWidget
*button
,
125 static void preferences_radio_button_toggled_cb (GtkWidget
*button
,
127 static void preferences_string_combo_changed_cb (GtkWidget
*button
,
129 static void preferences_destroy_cb (GtkWidget
*widget
,
130 EmpathyPreferences
*preferences
);
131 static void preferences_response_cb (GtkWidget
*widget
,
133 EmpathyPreferences
*preferences
);
143 COL_COMBO_VISIBLE_NAME
,
160 /* TODO: add phone related sounds also? */
161 static SoundEventEntry sound_entries
[] = {
162 { N_("Message received"), EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE
},
163 { N_("Message sent"), EMPATHY_PREFS_SOUNDS_OUTGOING_MESSAGE
},
164 { N_("New conversation"), EMPATHY_PREFS_SOUNDS_NEW_CONVERSATION
},
165 { N_("Contact goes online"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN
},
166 { N_("Contact goes offline"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT
},
167 { N_("Account connected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN
},
168 { N_("Account disconnected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT
}
172 preferences_add_id (EmpathyPreferences
*preferences
, guint id
)
174 preferences
->notify_ids
= g_list_prepend (preferences
->notify_ids
,
175 GUINT_TO_POINTER (id
));
179 preferences_compact_contact_list_changed_cb (EmpathyConf
*conf
,
183 EmpathyPreferences
*preferences
= user_data
;
186 if (empathy_conf_get_bool (empathy_conf_get (), key
, &value
)) {
187 gtk_widget_set_sensitive (preferences
->checkbutton_show_avatars
,
193 preferences_setup_widgets (EmpathyPreferences
*preferences
)
197 preferences_hookup_toggle_button (preferences
,
198 EMPATHY_PREFS_NOTIFICATIONS_ENABLED
,
199 preferences
->checkbutton_notifications_enabled
);
200 preferences_hookup_toggle_button (preferences
,
201 EMPATHY_PREFS_NOTIFICATIONS_DISABLED_AWAY
,
202 preferences
->checkbutton_notifications_disabled_away
);
203 preferences_hookup_toggle_button (preferences
,
204 EMPATHY_PREFS_NOTIFICATIONS_FOCUS
,
205 preferences
->checkbutton_notifications_focus
);
207 preferences_hookup_sensitivity (preferences
,
208 EMPATHY_PREFS_NOTIFICATIONS_ENABLED
,
209 preferences
->checkbutton_notifications_disabled_away
);
210 preferences_hookup_sensitivity (preferences
,
211 EMPATHY_PREFS_NOTIFICATIONS_ENABLED
,
212 preferences
->checkbutton_notifications_focus
);
214 preferences_hookup_toggle_button (preferences
,
215 EMPATHY_PREFS_SOUNDS_ENABLED
,
216 preferences
->checkbutton_sounds_enabled
);
217 preferences_hookup_toggle_button (preferences
,
218 EMPATHY_PREFS_SOUNDS_DISABLED_AWAY
,
219 preferences
->checkbutton_sounds_disabled_away
);
221 preferences_hookup_sensitivity (preferences
,
222 EMPATHY_PREFS_SOUNDS_ENABLED
,
223 preferences
->checkbutton_sounds_disabled_away
);
224 preferences_hookup_sensitivity (preferences
,
225 EMPATHY_PREFS_SOUNDS_ENABLED
,
226 preferences
->treeview_sounds
);
228 preferences_hookup_toggle_button (preferences
,
229 EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS
,
230 preferences
->checkbutton_separate_chat_windows
);
232 preferences_hookup_toggle_button (preferences
,
233 EMPATHY_PREFS_UI_SHOW_AVATARS
,
234 preferences
->checkbutton_show_avatars
);
236 preferences_hookup_toggle_button (preferences
,
237 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST
,
238 preferences
->checkbutton_compact_contact_list
);
240 preferences_hookup_toggle_button (preferences
,
241 EMPATHY_PREFS_CHAT_SHOW_SMILEYS
,
242 preferences
->checkbutton_show_smileys
);
244 preferences_hookup_string_combo (preferences
,
245 EMPATHY_PREFS_CHAT_THEME
,
246 preferences
->combobox_chat_theme
);
248 preferences_hookup_radio_button (preferences
,
249 EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM
,
250 preferences
->radiobutton_contact_list_sort_by_name
);
252 preferences_hookup_toggle_button (preferences
,
253 EMPATHY_PREFS_AUTOCONNECT
,
254 preferences
->checkbutton_autoconnect
);
256 preferences_hookup_toggle_button (preferences
,
257 EMPATHY_PREFS_LOCATION_PUBLISH
,
258 preferences
->checkbutton_location_publish
);
260 preferences_hookup_toggle_button (preferences
,
261 EMPATHY_PREFS_LOCATION_RESOURCE_NETWORK
,
262 preferences
->checkbutton_location_resource_network
);
263 preferences_hookup_sensitivity (preferences
,
264 EMPATHY_PREFS_LOCATION_PUBLISH
,
265 preferences
->checkbutton_location_resource_network
);
267 preferences_hookup_toggle_button (preferences
,
268 EMPATHY_PREFS_LOCATION_RESOURCE_CELL
,
269 preferences
->checkbutton_location_resource_cell
);
270 preferences_hookup_sensitivity (preferences
,
271 EMPATHY_PREFS_LOCATION_PUBLISH
,
272 preferences
->checkbutton_location_resource_cell
);
274 preferences_hookup_toggle_button (preferences
,
275 EMPATHY_PREFS_LOCATION_RESOURCE_GPS
,
276 preferences
->checkbutton_location_resource_gps
);
277 preferences_hookup_sensitivity (preferences
,
278 EMPATHY_PREFS_LOCATION_PUBLISH
,
279 preferences
->checkbutton_location_resource_gps
);
281 preferences_hookup_toggle_button (preferences
,
282 EMPATHY_PREFS_LOCATION_REDUCE_ACCURACY
,
283 preferences
->checkbutton_location_reduce_accuracy
);
284 preferences_hookup_sensitivity (preferences
,
285 EMPATHY_PREFS_LOCATION_PUBLISH
,
286 preferences
->checkbutton_location_reduce_accuracy
);
288 id
= empathy_conf_notify_add (empathy_conf_get (),
289 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST
,
290 preferences_compact_contact_list_changed_cb
,
293 preferences_add_id (preferences
, id
);
295 preferences_compact_contact_list_changed_cb (empathy_conf_get (),
296 EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST
,
301 preferences_sound_cell_toggled_cb (GtkCellRendererToggle
*toggle
,
303 EmpathyPreferences
*preferences
)
306 gboolean toggled
, instore
;
312 view
= GTK_TREE_VIEW (preferences
->treeview_sounds
);
313 model
= gtk_tree_view_get_model (view
);
315 path
= gtk_tree_path_new_from_string (path_string
);
316 toggled
= gtk_cell_renderer_toggle_get_active (toggle
);
318 gtk_tree_model_get_iter (model
, &iter
, path
);
319 gtk_tree_model_get (model
, &iter
, COL_SOUND_KEY
, &key
,
320 COL_SOUND_ENABLED
, &instore
, -1);
324 gtk_list_store_set (GTK_LIST_STORE (model
), &iter
,
325 COL_SOUND_ENABLED
, instore
, -1);
327 empathy_conf_set_bool (empathy_conf_get (), key
, instore
);
330 gtk_tree_path_free (path
);
334 preferences_sound_load (EmpathyPreferences
*preferences
)
343 view
= GTK_TREE_VIEW (preferences
->treeview_sounds
);
344 store
= GTK_LIST_STORE (gtk_tree_view_get_model (view
));
345 conf
= empathy_conf_get ();
347 for (i
= 0; i
< G_N_ELEMENTS (sound_entries
); i
++) {
348 empathy_conf_get_bool (conf
, sound_entries
[i
].key
, &set
);
350 gtk_list_store_insert_with_values (store
, &iter
, i
,
351 COL_SOUND_NAME
, gettext (sound_entries
[i
].name
),
352 COL_SOUND_KEY
, sound_entries
[i
].key
,
353 COL_SOUND_ENABLED
, set
, -1);
358 preferences_sound_setup (EmpathyPreferences
*preferences
)
362 GtkCellRenderer
*renderer
;
363 GtkTreeViewColumn
*column
;
365 view
= GTK_TREE_VIEW (preferences
->treeview_sounds
);
367 store
= gtk_list_store_new (COL_SOUND_COUNT
,
368 G_TYPE_BOOLEAN
, /* enabled */
369 G_TYPE_STRING
, /* name */
370 G_TYPE_STRING
); /* key */
372 gtk_tree_view_set_model (view
, GTK_TREE_MODEL (store
));
374 renderer
= gtk_cell_renderer_toggle_new ();
375 g_signal_connect (renderer
, "toggled",
376 G_CALLBACK (preferences_sound_cell_toggled_cb
),
379 column
= gtk_tree_view_column_new ();
380 gtk_tree_view_column_pack_start (column
, renderer
, FALSE
);
381 gtk_tree_view_column_add_attribute (column
, renderer
,
382 "active", COL_SOUND_ENABLED
);
384 renderer
= gtk_cell_renderer_text_new ();
385 gtk_tree_view_column_pack_start (column
, renderer
, FALSE
);
386 gtk_tree_view_column_add_attribute (column
, renderer
,
387 "text", COL_SOUND_NAME
);
389 gtk_tree_view_append_column (view
, column
);
391 gtk_tree_view_column_set_resizable (column
, FALSE
);
392 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column
), TRUE
);
394 g_object_unref (store
);
398 preferences_languages_setup (EmpathyPreferences
*preferences
)
402 GtkTreeSelection
*selection
;
404 GtkTreeViewColumn
*column
;
405 GtkCellRenderer
*renderer
;
408 view
= GTK_TREE_VIEW (preferences
->treeview_spell_checker
);
410 store
= gtk_list_store_new (COL_LANG_COUNT
,
411 G_TYPE_BOOLEAN
, /* enabled */
412 G_TYPE_STRING
, /* code */
413 G_TYPE_STRING
); /* name */
415 gtk_tree_view_set_model (view
, GTK_TREE_MODEL (store
));
417 selection
= gtk_tree_view_get_selection (view
);
418 gtk_tree_selection_set_mode (selection
, GTK_SELECTION_SINGLE
);
420 model
= GTK_TREE_MODEL (store
);
422 renderer
= gtk_cell_renderer_toggle_new ();
423 g_signal_connect (renderer
, "toggled",
424 G_CALLBACK (preferences_languages_cell_toggled_cb
),
427 column
= gtk_tree_view_column_new_with_attributes (NULL
, renderer
,
428 "active", COL_LANG_ENABLED
,
431 gtk_tree_view_append_column (view
, column
);
433 renderer
= gtk_cell_renderer_text_new ();
434 col_offset
= gtk_tree_view_insert_column_with_attributes (view
,
437 "text", COL_LANG_NAME
,
440 g_object_set_data (G_OBJECT (renderer
),
441 "column", GINT_TO_POINTER (COL_LANG_NAME
));
443 column
= gtk_tree_view_get_column (view
, col_offset
- 1);
444 gtk_tree_view_column_set_sort_column_id (column
, COL_LANG_NAME
);
445 gtk_tree_view_column_set_resizable (column
, FALSE
);
446 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column
), TRUE
);
448 g_object_unref (store
);
452 preferences_languages_add (EmpathyPreferences
*preferences
)
458 view
= GTK_TREE_VIEW (preferences
->treeview_spell_checker
);
459 store
= GTK_LIST_STORE (gtk_tree_view_get_model (view
));
461 codes
= empathy_spell_get_language_codes ();
463 empathy_conf_set_bool (empathy_conf_get (),
464 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED
,
467 gtk_widget_set_sensitive (preferences
->treeview_spell_checker
, FALSE
);
470 for (l
= codes
; l
; l
= l
->next
) {
476 name
= empathy_spell_get_language_name (code
);
481 gtk_list_store_append (store
, &iter
);
482 gtk_list_store_set (store
, &iter
,
488 empathy_spell_free_language_codes (codes
);
492 preferences_languages_save (EmpathyPreferences
*preferences
)
497 gchar
*languages
= NULL
;
499 view
= GTK_TREE_VIEW (preferences
->treeview_spell_checker
);
500 model
= gtk_tree_view_get_model (view
);
502 gtk_tree_model_foreach (model
,
503 (GtkTreeModelForeachFunc
) preferences_languages_save_foreach
,
506 /* if user selects no languages, we don't want spell check */
507 empathy_conf_set_bool (empathy_conf_get (),
508 EMPATHY_PREFS_CHAT_SPELL_CHECKER_ENABLED
,
511 empathy_conf_set_string (empathy_conf_get (),
512 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES
,
513 languages
? languages
: "");
519 preferences_languages_save_foreach (GtkTreeModel
*model
,
531 gtk_tree_model_get (model
, iter
, COL_LANG_ENABLED
, &enabled
, -1);
536 gtk_tree_model_get (model
, iter
, COL_LANG_CODE
, &code
, -1);
542 *languages
= g_strdup (code
);
544 gchar
*str
= *languages
;
545 *languages
= g_strdup_printf ("%s,%s", str
, code
);
555 preferences_languages_load (EmpathyPreferences
*preferences
)
562 if (!empathy_conf_get_string (empathy_conf_get (),
563 EMPATHY_PREFS_CHAT_SPELL_CHECKER_LANGUAGES
,
568 vlanguages
= g_strsplit (value
, ",", -1);
571 view
= GTK_TREE_VIEW (preferences
->treeview_spell_checker
);
572 model
= gtk_tree_view_get_model (view
);
574 gtk_tree_model_foreach (model
,
575 (GtkTreeModelForeachFunc
) preferences_languages_load_foreach
,
578 g_strfreev (vlanguages
);
582 preferences_languages_load_foreach (GtkTreeModel
*model
,
590 gboolean found
= FALSE
;
596 gtk_tree_model_get (model
, iter
, COL_LANG_CODE
, &code
, -1);
601 for (i
= 0, lang
= languages
[i
]; lang
; lang
= languages
[++i
]) {
602 if (strcmp (lang
, code
) == 0) {
608 gtk_list_store_set (GTK_LIST_STORE (model
), iter
, COL_LANG_ENABLED
, found
, -1);
613 preferences_languages_cell_toggled_cb (GtkCellRendererToggle
*cell
,
615 EmpathyPreferences
*preferences
)
624 view
= GTK_TREE_VIEW (preferences
->treeview_spell_checker
);
625 model
= gtk_tree_view_get_model (view
);
626 store
= GTK_LIST_STORE (model
);
628 path
= gtk_tree_path_new_from_string (path_string
);
630 gtk_tree_model_get_iter (model
, &iter
, path
);
631 gtk_tree_model_get (model
, &iter
, COL_LANG_ENABLED
, &enabled
, -1);
635 gtk_list_store_set (store
, &iter
, COL_LANG_ENABLED
, enabled
, -1);
636 gtk_tree_path_free (path
);
638 preferences_languages_save (preferences
);
642 preferences_themes_setup (EmpathyPreferences
*preferences
)
645 GtkCellLayout
*cell_layout
;
646 GtkCellRenderer
*renderer
;
648 const gchar
**themes
;
651 combo
= GTK_COMBO_BOX (preferences
->combobox_chat_theme
);
652 cell_layout
= GTK_CELL_LAYOUT (combo
);
654 /* Create the model */
655 store
= gtk_list_store_new (COL_COMBO_COUNT
,
656 G_TYPE_STRING
, /* Display name */
657 G_TYPE_STRING
); /* Theme name */
660 themes
= empathy_theme_manager_get_themes ();
661 for (i
= 0; themes
[i
]; i
+= 2) {
662 gtk_list_store_insert_with_values (store
, NULL
, -1,
663 COL_COMBO_VISIBLE_NAME
, _(themes
[i
+ 1]),
664 COL_COMBO_NAME
, themes
[i
],
668 /* Add cell renderer */
669 renderer
= gtk_cell_renderer_text_new ();
670 gtk_cell_layout_pack_start (cell_layout
, renderer
, TRUE
);
671 gtk_cell_layout_set_attributes (cell_layout
, renderer
,
672 "text", COL_COMBO_VISIBLE_NAME
, NULL
);
674 gtk_combo_box_set_model (combo
, GTK_TREE_MODEL (store
));
675 g_object_unref (store
);
679 preferences_widget_sync_bool (const gchar
*key
, GtkWidget
*widget
)
683 if (empathy_conf_get_bool (empathy_conf_get (), key
, &value
)) {
684 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget
), value
);
689 preferences_widget_sync_string (const gchar
*key
, GtkWidget
*widget
)
693 if (empathy_conf_get_string (empathy_conf_get (), key
, &value
) && value
) {
694 if (GTK_IS_ENTRY (widget
)) {
695 gtk_entry_set_text (GTK_ENTRY (widget
), value
);
696 } else if (GTK_IS_RADIO_BUTTON (widget
)) {
697 if (strcmp (key
, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM
) == 0) {
699 GEnumClass
*enum_class
;
700 GEnumValue
*enum_value
;
702 GtkWidget
*toggle_widget
;
704 /* Get index from new string */
705 type
= empathy_contact_list_store_sort_get_type ();
706 enum_class
= G_ENUM_CLASS (g_type_class_peek (type
));
707 enum_value
= g_enum_get_value_by_nick (enum_class
, value
);
710 list
= gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget
));
711 toggle_widget
= g_slist_nth_data (list
, enum_value
->value
);
712 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle_widget
), TRUE
);
715 g_warning ("Unhandled key:'%s' just had string change", key
);
724 preferences_widget_sync_string_combo (const gchar
*key
, GtkWidget
*widget
)
731 if (!empathy_conf_get_string (empathy_conf_get (), key
, &value
)) {
735 model
= gtk_combo_box_get_model (GTK_COMBO_BOX (widget
));
738 if (value
&& gtk_tree_model_get_iter_first (model
, &iter
)) {
742 gtk_tree_model_get (model
, &iter
,
743 COL_COMBO_NAME
, &name
,
746 if (strcmp (name
, value
) == 0) {
748 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget
), &iter
);
752 } while (!found
&& gtk_tree_model_iter_next (model
, &iter
));
755 /* Fallback to the first one. */
757 if (gtk_tree_model_get_iter_first (model
, &iter
)) {
758 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget
), &iter
);
766 preferences_notify_string_cb (EmpathyConf
*conf
,
770 preferences_widget_sync_string (key
, user_data
);
774 preferences_notify_string_combo_cb (EmpathyConf
*conf
,
778 preferences_widget_sync_string_combo (key
, user_data
);
782 preferences_notify_bool_cb (EmpathyConf
*conf
,
786 preferences_widget_sync_bool (key
, user_data
);
790 preferences_notify_sensitivity_cb (EmpathyConf
*conf
,
796 if (empathy_conf_get_bool (conf
, key
, &value
)) {
797 gtk_widget_set_sensitive (GTK_WIDGET (user_data
), value
);
803 preferences_widget_sync_int (const gchar
*key
, GtkWidget
*widget
)
807 if (empathy_conf_get_int (empathy_conf_get (), key
, &value
)) {
808 if (GTK_IS_SPIN_BUTTON (widget
)) {
809 gtk_spin_button_set_value (GTK_SPIN_BUTTON (widget
), value
);
815 preferences_notify_int_cb (EmpathyConf
*conf
,
819 preferences_widget_sync_int (key
, user_data
);
823 preferences_hookup_spin_button (EmpathyPreferences
*preferences
,
829 preferences_widget_sync_int (key
, widget
);
831 g_object_set_data_full (G_OBJECT (widget
), "key",
832 g_strdup (key
), g_free
);
834 g_signal_connect (widget
,
836 G_CALLBACK (preferences_spin_button_value_changed_cb
),
839 id
= empathy_conf_notify_add (empathy_conf_get (),
841 preferences_notify_int_cb
,
844 preferences_add_id (preferences
, id
);
849 preferences_hookup_entry (EmpathyPreferences
*preferences
,
855 preferences_widget_sync_string (key
, widget
);
857 g_object_set_data_full (G_OBJECT (widget
), "key",
858 g_strdup (key
), g_free
);
860 g_signal_connect (widget
,
862 G_CALLBACK (preferences_entry_value_changed_cb
),
865 id
= empathy_conf_notify_add (empathy_conf_get (),
867 preferences_notify_string_cb
,
870 preferences_add_id (preferences
, id
);
875 preferences_spin_button_value_changed_cb (GtkWidget
*button
,
880 key
= g_object_get_data (G_OBJECT (button
), "key");
882 empathy_conf_set_int (empathy_conf_get (),
884 gtk_spin_button_get_value (GTK_SPIN_BUTTON (button
)));
888 preferences_entry_value_changed_cb (GtkWidget
*entry
,
893 key
= g_object_get_data (G_OBJECT (entry
), "key");
895 empathy_conf_set_string (empathy_conf_get (),
897 gtk_entry_get_text (GTK_ENTRY (entry
)));
902 preferences_hookup_toggle_button (EmpathyPreferences
*preferences
,
908 preferences_widget_sync_bool (key
, widget
);
910 g_object_set_data_full (G_OBJECT (widget
), "key",
911 g_strdup (key
), g_free
);
913 g_signal_connect (widget
,
915 G_CALLBACK (preferences_toggle_button_toggled_cb
),
918 id
= empathy_conf_notify_add (empathy_conf_get (),
920 preferences_notify_bool_cb
,
923 preferences_add_id (preferences
, id
);
928 preferences_hookup_radio_button (EmpathyPreferences
*preferences
,
935 preferences_widget_sync_string (key
, widget
);
937 group
= gtk_radio_button_get_group (GTK_RADIO_BUTTON (widget
));
938 for (l
= group
; l
; l
= l
->next
) {
939 g_signal_connect (l
->data
,
941 G_CALLBACK (preferences_radio_button_toggled_cb
),
944 g_object_set_data_full (G_OBJECT (l
->data
), "key",
945 g_strdup (key
), g_free
);
948 id
= empathy_conf_notify_add (empathy_conf_get (),
950 preferences_notify_string_cb
,
953 preferences_add_id (preferences
, id
);
958 preferences_hookup_string_combo (EmpathyPreferences
*preferences
,
964 preferences_widget_sync_string_combo (key
, widget
);
966 g_object_set_data_full (G_OBJECT (widget
), "key",
967 g_strdup (key
), g_free
);
969 g_signal_connect (widget
,
971 G_CALLBACK (preferences_string_combo_changed_cb
),
974 id
= empathy_conf_notify_add (empathy_conf_get (),
976 preferences_notify_string_combo_cb
,
979 preferences_add_id (preferences
, id
);
984 preferences_hookup_sensitivity (EmpathyPreferences
*preferences
,
991 if (empathy_conf_get_bool (empathy_conf_get (), key
, &value
)) {
992 gtk_widget_set_sensitive (widget
, value
);
995 id
= empathy_conf_notify_add (empathy_conf_get (),
997 preferences_notify_sensitivity_cb
,
1000 preferences_add_id (preferences
, id
);
1005 preferences_toggle_button_toggled_cb (GtkWidget
*button
,
1010 key
= g_object_get_data (G_OBJECT (button
), "key");
1012 empathy_conf_set_bool (empathy_conf_get (),
1014 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
)));
1018 preferences_radio_button_toggled_cb (GtkWidget
*button
,
1022 const gchar
*value
= NULL
;
1024 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button
))) {
1028 key
= g_object_get_data (G_OBJECT (button
), "key");
1030 if (key
&& strcmp (key
, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM
) == 0) {
1033 GEnumClass
*enum_class
;
1034 GEnumValue
*enum_value
;
1036 group
= gtk_radio_button_get_group (GTK_RADIO_BUTTON (button
));
1038 /* Get string from index */
1039 type
= empathy_contact_list_store_sort_get_type ();
1040 enum_class
= G_ENUM_CLASS (g_type_class_peek (type
));
1041 enum_value
= g_enum_get_value (enum_class
, g_slist_index (group
, button
));
1044 g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioButton index:%d",
1045 g_slist_index (group
, button
));
1049 value
= enum_value
->value_nick
;
1050 } else if (key
&& strcmp (key
, EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM
) == 0) {
1054 empathy_conf_set_string (empathy_conf_get (), key
, value
);
1058 preferences_string_combo_changed_cb (GtkWidget
*combo
,
1062 GtkTreeModel
*model
;
1066 key
= g_object_get_data (G_OBJECT (combo
), "key");
1068 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo
), &iter
)) {
1069 model
= gtk_combo_box_get_model (GTK_COMBO_BOX (combo
));
1071 gtk_tree_model_get (model
, &iter
,
1072 COL_COMBO_NAME
, &name
,
1074 empathy_conf_set_string (empathy_conf_get (), key
, name
);
1080 preferences_response_cb (GtkWidget
*widget
,
1082 EmpathyPreferences
*preferences
)
1084 gtk_widget_destroy (widget
);
1088 preferences_destroy_cb (GtkWidget
*widget
,
1089 EmpathyPreferences
*preferences
)
1093 for (l
= preferences
->notify_ids
; l
; l
= l
->next
) {
1096 id
= GPOINTER_TO_UINT (l
->data
);
1097 empathy_conf_notify_remove (empathy_conf_get (), id
);
1100 g_list_free (preferences
->notify_ids
);
1101 g_free (preferences
);
1105 empathy_preferences_show (GtkWindow
*parent
)
1107 static EmpathyPreferences
*preferences
;
1113 gtk_window_present (GTK_WINDOW (preferences
->dialog
));
1114 return preferences
->dialog
;
1117 preferences
= g_new0 (EmpathyPreferences
, 1);
1119 filename
= empathy_file_lookup ("empathy-preferences.ui", "src");
1120 gui
= empathy_builder_get_file (filename
,
1121 "preferences_dialog", &preferences
->dialog
,
1122 "notebook", &preferences
->notebook
,
1123 "checkbutton_show_avatars", &preferences
->checkbutton_show_avatars
,
1124 "checkbutton_compact_contact_list", &preferences
->checkbutton_compact_contact_list
,
1125 "checkbutton_show_smileys", &preferences
->checkbutton_show_smileys
,
1126 "combobox_chat_theme", &preferences
->combobox_chat_theme
,
1127 "checkbutton_separate_chat_windows", &preferences
->checkbutton_separate_chat_windows
,
1128 "checkbutton_autoconnect", &preferences
->checkbutton_autoconnect
,
1129 "radiobutton_contact_list_sort_by_name", &preferences
->radiobutton_contact_list_sort_by_name
,
1130 "radiobutton_contact_list_sort_by_state", &preferences
->radiobutton_contact_list_sort_by_state
,
1131 "checkbutton_notifications_enabled", &preferences
->checkbutton_notifications_enabled
,
1132 "checkbutton_notifications_disabled_away", &preferences
->checkbutton_notifications_disabled_away
,
1133 "checkbutton_notifications_focus", &preferences
->checkbutton_notifications_focus
,
1134 "checkbutton_sounds_enabled", &preferences
->checkbutton_sounds_enabled
,
1135 "checkbutton_sounds_disabled_away", &preferences
->checkbutton_sounds_disabled_away
,
1136 "treeview_sounds", &preferences
->treeview_sounds
,
1137 "treeview_spell_checker", &preferences
->treeview_spell_checker
,
1138 "checkbutton_location_publish", &preferences
->checkbutton_location_publish
,
1139 "checkbutton_location_reduce_accuracy", &preferences
->checkbutton_location_reduce_accuracy
,
1140 "checkbutton_location_resource_network", &preferences
->checkbutton_location_resource_network
,
1141 "checkbutton_location_resource_cell", &preferences
->checkbutton_location_resource_cell
,
1142 "checkbutton_location_resource_gps", &preferences
->checkbutton_location_resource_gps
,
1146 empathy_builder_connect (gui
, preferences
,
1147 "preferences_dialog", "destroy", preferences_destroy_cb
,
1148 "preferences_dialog", "response", preferences_response_cb
,
1151 g_object_unref (gui
);
1153 g_object_add_weak_pointer (G_OBJECT (preferences
->dialog
), (gpointer
) &preferences
);
1155 preferences_themes_setup (preferences
);
1157 preferences_setup_widgets (preferences
);
1159 preferences_languages_setup (preferences
);
1160 preferences_languages_add (preferences
);
1161 preferences_languages_load (preferences
);
1163 preferences_sound_setup (preferences
);
1164 preferences_sound_load (preferences
);
1166 if (empathy_spell_supported ()) {
1169 page
= gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences
->notebook
), 2);
1170 gtk_widget_show (page
);
1173 page
= gtk_notebook_get_nth_page (GTK_NOTEBOOK (preferences
->notebook
), 3);
1175 gtk_widget_show (page
);
1177 gtk_widget_hide (page
);
1182 gtk_window_set_transient_for (GTK_WINDOW (preferences
->dialog
),
1183 GTK_WINDOW (parent
));
1186 gtk_widget_show (preferences
->dialog
);
1188 return preferences
->dialog
;