aboutsummaryrefslogtreecommitdiffstats
path: root/src/empathy-main-window.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/empathy-main-window.c')
-rw-r--r--src/empathy-main-window.c230
1 files changed, 150 insertions, 80 deletions
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 05eb0774e..f8e22d91d 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -92,6 +92,12 @@ typedef struct {
GtkWidget *presence_chooser;
GtkWidget *errors_vbox;
+ GtkRadioAction *sort_by_name;
+ GtkRadioAction *sort_by_status;
+ GtkRadioAction *normal_with_avatars;
+ GtkRadioAction *normal_size;
+ GtkRadioAction *compact_size;
+
GtkUIManager *ui_manager;
GtkAction *view_history;
GtkAction *room_join_favorites;
@@ -602,7 +608,7 @@ main_window_accels_load (void)
{
gchar *filename;
- filename = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, ACCELS_FILENAME, NULL);
+ filename = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, ACCELS_FILENAME, NULL);
if (g_file_test (filename, G_FILE_TEST_EXISTS)) {
DEBUG ("Loading from:'%s'", filename);
gtk_accel_map_load (filename);
@@ -617,7 +623,7 @@ main_window_accels_save (void)
gchar *dir;
gchar *file_with_path;
- dir = g_build_filename (g_get_home_dir (), ".gnome2", PACKAGE_NAME, NULL);
+ dir = g_build_filename (g_get_user_config_dir (), PACKAGE_NAME, NULL);
g_mkdir_with_parents (dir, S_IRUSR | S_IWUSR | S_IXUSR);
file_with_path = g_build_filename (dir, ACCELS_FILENAME, NULL);
g_free (dir);
@@ -714,6 +720,120 @@ main_window_view_show_offline_cb (GtkToggleAction *action,
}
static void
+main_window_notify_sort_contact_cb (EmpathyConf *conf,
+ const gchar *key,
+ EmpathyMainWindow *window)
+{
+ gchar *str = NULL;
+
+ if (empathy_conf_get_string (conf, key, &str) && str) {
+ GType type;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ type = empathy_contact_list_store_sort_get_type ();
+ enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+ enum_value = g_enum_get_value_by_nick (enum_class, str);
+ if (enum_value) {
+ /* By changing the value of the GtkRadioAction,
+ it emits a signal that calls main_window_view_sort_contacts_cb
+ which updates the contacts list */
+ gtk_radio_action_set_current_value (window->sort_by_name,
+ enum_value->value);
+ } else {
+ g_warning ("Wrong value for sort_criterium configuration : %s", str);
+ }
+ g_free (str);
+ }
+}
+
+static void
+main_window_view_sort_contacts_cb (GtkRadioAction *action,
+ GtkRadioAction *current,
+ EmpathyMainWindow *window)
+{
+ EmpathyContactListStoreSort value;
+ GSList *group;
+ GType type;
+ GEnumClass *enum_class;
+ GEnumValue *enum_value;
+
+ value = gtk_radio_action_get_current_value (action);
+ group = gtk_radio_action_get_group (action);
+
+ /* Get string from index */
+ type = empathy_contact_list_store_sort_get_type ();
+ enum_class = G_ENUM_CLASS (g_type_class_peek (type));
+ enum_value = g_enum_get_value (enum_class, g_slist_index (group, current));
+
+ if (!enum_value) {
+ g_warning ("No GEnumValue for EmpathyContactListSort with GtkRadioAction index:%d",
+ g_slist_index (group, action));
+ } else {
+ empathy_conf_set_string (empathy_conf_get (),
+ EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+ enum_value->value_nick);
+ }
+ empathy_contact_list_store_set_sort_criterium (window->list_store, value);
+}
+
+/* Matches GtkRadioAction values set in empathy-main-window.ui */
+#define CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS 0
+#define CONTACT_LIST_NORMAL_SIZE 1
+#define CONTACT_LIST_COMPACT_SIZE 2
+
+static void
+main_window_view_contacts_list_size_cb (GtkRadioAction *action,
+ GtkRadioAction *current,
+ EmpathyMainWindow *window)
+{
+ gint value;
+
+ value = gtk_radio_action_get_current_value (action);
+
+ empathy_conf_set_bool (empathy_conf_get (),
+ EMPATHY_PREFS_UI_SHOW_AVATARS,
+ value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
+ empathy_conf_set_bool (empathy_conf_get (),
+ EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+ value == CONTACT_LIST_COMPACT_SIZE);
+
+ empathy_contact_list_store_set_show_avatars (window->list_store,
+ value == CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS);
+ empathy_contact_list_store_set_is_compact (window->list_store,
+ value == CONTACT_LIST_COMPACT_SIZE);
+}
+
+static void
+main_window_notify_contact_list_size_cb (EmpathyConf *conf,
+ const gchar *key,
+ EmpathyMainWindow *window)
+{
+ gboolean show_avatars;
+ gboolean compact_contact_list;
+ gint value = CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS;
+
+ if (empathy_conf_get_bool (conf,
+ EMPATHY_PREFS_UI_SHOW_AVATARS,
+ &show_avatars)
+ && empathy_conf_get_bool (conf,
+ EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+ &compact_contact_list)) {
+ if (compact_contact_list) {
+ value = CONTACT_LIST_COMPACT_SIZE;
+ } else if (show_avatars) {
+ value = CONTACT_LIST_NORMAL_SIZE_WITH_AVATARS;
+ } else {
+ value = CONTACT_LIST_NORMAL_SIZE;
+ }
+ }
+ /* By changing the value of the GtkRadioAction,
+ it emits a signal that calls main_window_view_contacts_list_size_cb
+ which updates the contacts list */
+ gtk_radio_action_set_current_value (window->normal_with_avatars, value);
+}
+
+static void
main_window_view_show_map_cb (GtkCheckMenuItem *item,
EmpathyMainWindow *window)
{
@@ -1022,56 +1142,6 @@ main_window_notify_show_offline_cb (EmpathyConf *conf,
}
static void
-main_window_notify_show_avatars_cb (EmpathyConf *conf,
- const gchar *key,
- EmpathyMainWindow *window)
-{
- gboolean show_avatars;
-
- if (empathy_conf_get_bool (conf, key, &show_avatars)) {
- empathy_contact_list_store_set_show_avatars (window->list_store,
- show_avatars);
- }
-}
-
-static void
-main_window_notify_compact_contact_list_cb (EmpathyConf *conf,
- const gchar *key,
- EmpathyMainWindow *window)
-{
- gboolean compact_contact_list;
-
- if (empathy_conf_get_bool (conf, key, &compact_contact_list)) {
- empathy_contact_list_store_set_is_compact (window->list_store,
- compact_contact_list);
- }
-}
-
-static void
-main_window_notify_sort_criterium_cb (EmpathyConf *conf,
- const gchar *key,
- EmpathyMainWindow *window)
-{
- gchar *str = NULL;
-
- if (empathy_conf_get_string (conf, key, &str) && str) {
- GType type;
- GEnumClass *enum_class;
- GEnumValue *enum_value;
-
- type = empathy_contact_list_store_sort_get_type ();
- enum_class = G_ENUM_CLASS (g_type_class_peek (type));
- enum_value = g_enum_get_value_by_nick (enum_class, str);
- g_free (str);
-
- if (enum_value) {
- empathy_contact_list_store_set_sort_criterium (window->list_store,
- enum_value->value);
- }
- }
-}
-
-static void
main_window_connection_items_setup (EmpathyMainWindow *window,
GtkBuilder *gui)
{
@@ -1112,8 +1182,6 @@ empathy_main_window_show (void)
GtkAction *show_map_widget;
GtkToolItem *item;
gboolean show_offline;
- gboolean show_avatars;
- gboolean compact_contact_list;
gint x, y, w, h;
gchar *filename;
GSList *l;
@@ -1133,6 +1201,11 @@ empathy_main_window_show (void)
"errors_vbox", &window->errors_vbox,
"ui_manager", &window->ui_manager,
"view_show_offline", &show_offline_widget,
+ "view_sort_by_name", &window->sort_by_name,
+ "view_sort_by_status", &window->sort_by_status,
+ "view_normal_size_with_avatars", &window->normal_with_avatars,
+ "view_normal_size", &window->normal_size,
+ "view_compact_size", &window->compact_size,
"view_history", &window->view_history,
"view_show_map", &show_map_widget,
"room_join_favorites", &window->room_join_favorites,
@@ -1153,6 +1226,8 @@ empathy_main_window_show (void)
"chat_add_contact", "activate", main_window_chat_add_contact_cb,
"view_show_ft_manager", "activate", main_window_view_show_ft_manager,
"view_show_offline", "toggled", main_window_view_show_offline_cb,
+ "view_sort_by_name", "changed", main_window_view_sort_contacts_cb,
+ "view_normal_size_with_avatars", "changed", main_window_view_contacts_list_size_cb,
"view_show_map", "activate", main_window_view_show_map_cb,
"edit", "activate", main_window_edit_cb,
"edit_accounts", "activate", main_window_edit_accounts_cb,
@@ -1179,8 +1254,8 @@ empathy_main_window_show (void)
"account-connection-changed",
G_CALLBACK (main_window_connection_changed_cb), window);
- window->errors = g_hash_table_new_full (empathy_account_hash,
- empathy_account_equal,
+ window->errors = g_hash_table_new_full (g_direct_hash,
+ g_direct_equal,
g_object_unref,
NULL);
@@ -1303,34 +1378,29 @@ empathy_main_window_show (void)
gtk_toggle_action_set_active (show_offline_widget, show_offline);
- /* Show avatars ? */
- empathy_conf_get_bool (conf,
- EMPATHY_PREFS_UI_SHOW_AVATARS,
- &show_avatars);
+ /* Sort by name / by status ? */
empathy_conf_notify_add (conf,
- EMPATHY_PREFS_UI_SHOW_AVATARS,
- (EmpathyConfNotifyFunc) main_window_notify_show_avatars_cb,
- window);
- empathy_contact_list_store_set_show_avatars (window->list_store, show_avatars);
+ EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+ (EmpathyConfNotifyFunc) main_window_notify_sort_contact_cb,
+ window);
- /* Is compact ? */
- empathy_conf_get_bool (conf,
- EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
- &compact_contact_list);
- empathy_conf_notify_add (conf,
- EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
- (EmpathyConfNotifyFunc) main_window_notify_compact_contact_list_cb,
- window);
- empathy_contact_list_store_set_is_compact (window->list_store, compact_contact_list);
+ main_window_notify_sort_contact_cb (conf,
+ EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
+ window);
- /* Sort criterium */
+ /* Contacts list size */
empathy_conf_notify_add (conf,
- EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
- (EmpathyConfNotifyFunc) main_window_notify_sort_criterium_cb,
- window);
- main_window_notify_sort_criterium_cb (conf,
- EMPATHY_PREFS_CONTACTS_SORT_CRITERIUM,
- window);
+ EMPATHY_PREFS_UI_COMPACT_CONTACT_LIST,
+ (EmpathyConfNotifyFunc) main_window_notify_contact_list_size_cb,
+ window);
+ empathy_conf_notify_add (conf,
+ EMPATHY_PREFS_UI_SHOW_AVATARS,
+ (EmpathyConfNotifyFunc) main_window_notify_contact_list_size_cb,
+ window);
+
+ main_window_notify_contact_list_size_cb (conf,
+ EMPATHY_PREFS_UI_SHOW_AVATARS,
+ window);
main_window_update_status (window, window->account_manager);