diff options
-rw-r--r-- | data/empathy.schemas.in | 108 | ||||
-rw-r--r-- | libempathy-gtk/empathy-conf.h | 12 | ||||
-rw-r--r-- | src/empathy-preferences.c | 158 | ||||
-rw-r--r-- | src/empathy-preferences.glade | 137 |
4 files changed, 298 insertions, 117 deletions
diff --git a/data/empathy.schemas.in b/data/empathy.schemas.in index ad090d086..2472238b3 100644 --- a/data/empathy.schemas.in +++ b/data/empathy.schemas.in @@ -89,43 +89,129 @@ </schema> <schema> - <key>/schemas/apps/empathy/notifications/play_sounds</key> - <applyto>/apps/empathy/notifications/play_sounds</applyto> + <key>/schemas/apps/empathy/sounds/sounds_enabled</key> + <applyto>/apps/empathy/sounds/sounds_enabled</applyto> <owner>empathy</owner> <type>bool</type> <default>true</default> <locale name="C"> <short>Use notification sounds</short> <long> - Whether or not to play a sound when messages arrive. + Whether or not to play a sound to notify for events. </long> </locale> </schema> <schema> - <key>/schemas/apps/empathy/notifications/sound_when_away</key> - <applyto>/apps/empathy/notifications/sound_when_away</applyto> + <key>/schemas/apps/empathy/sounds/sounds_disabled_away</key> + <applyto>/apps/empathy/sounds/sounds_disabled_away</applyto> + <owner>empathy</owner> + <type>bool</type> + <default>true</default> + <locale name="C"> + <short>Disable sounds when away</short> + <long> + Whether or not to play a sound notifications when away or busy. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_incoming_message</key> + <applyto>/apps/empathy/sounds/sounds_incoming_message</applyto> + <owner>empathy</owner> + <type>bool</type> + <default>true</default> + <locale name="C"> + <short>Play a sound for incoming messages</short> + <long> + Whether or not to play a sound to notify for incoming messages. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_outgoing_message</key> + <applyto>/apps/empathy/sounds/sounds_outgoing_message</applyto> <owner>empathy</owner> <type>bool</type> <default>false</default> <locale name="C"> - <short>Enable sound when away</short> + <short>Play a sound for outgoing messages</short> + <long> + Whether or not to play a sound to notify for outgoing messages. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_new_conversation</key> + <applyto>/apps/empathy/sounds/sounds_new_conversation</applyto> + <owner>empathy</owner> + <type>bool</type> + <default>true</default> + <locale name="C"> + <short>Play a sound for new conversations</short> <long> - Whether or not to play sounds when away. + Whether or not to play a sound to notify for new conversations. </long> </locale> </schema> <schema> - <key>/schemas/apps/empathy/notifications/sound_when_busy</key> - <applyto>/apps/empathy/notifications/sound_when_busy</applyto> + <key>/schemas/apps/empathy/sounds/sounds_contact_login</key> + <applyto>/apps/empathy/sounds/sounds_contact_login/applyto> <owner>empathy</owner> <type>bool</type> <default>true</default> <locale name="C"> - <short>Enable sound when busy</short> + <short>Play a sound when a contact logs in</short> + <long> + Whether or not to play a sound to notify for contacts logging in the + network. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_contact_logout</key> + <applyto>/apps/empathy/sounds/sounds_contact_logout/applyto> + <owner>empathy</owner> + <type>bool</type> + <default>true</default> + <locale name="C"> + <short>Play a sound when a contact logs out</short> + <long> + Whether or not to play a sound to notify for contacts logging off the + network. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_service_login</key> + <applyto>/apps/empathy/sounds/sounds_service_login/applyto> + <owner>empathy</owner> + <type>bool</type> + <default>false</default> + <locale name="C"> + <short>Play a sound when we log in</short> + <long> + Whether or not to play a sound when logging in a network. + </long> + </locale> + </schema> + + <schema> + <key>/schemas/apps/empathy/sounds/sounds_service_logout</key> + <applyto>/apps/empathy/sounds/sounds_service_logout/applyto> + <owner>empathy</owner> + <type>bool</type> + <default>false</default> + <locale name="C"> + <short>Play a sound when we log out</short> <long> - Whether or not to play sounds when busy. + Whether or not to play a sound when logging off a network. </long> </locale> </schema> diff --git a/libempathy-gtk/empathy-conf.h b/libempathy-gtk/empathy-conf.h index 91b43bbe8..2c361f468 100644 --- a/libempathy-gtk/empathy-conf.h +++ b/libempathy-gtk/empathy-conf.h @@ -45,9 +45,15 @@ struct _EmpathyConfClass { }; #define EMPATHY_PREFS_PATH "/apps/empathy" -#define EMPATHY_PREFS_SOUNDS_FOR_MESSAGES EMPATHY_PREFS_PATH "/notifications/sounds_for_messages" -#define EMPATHY_PREFS_SOUNDS_WHEN_AWAY EMPATHY_PREFS_PATH "/notifications/sounds_when_away" -#define EMPATHY_PREFS_SOUNDS_WHEN_BUSY EMPATHY_PREFS_PATH "/notifications/sounds_when_busy" +#define EMPATHY_PREFS_SOUNDS_ENABLED EMPATHY_PREFS_PATH "/sounds/sounds_enabled" +#define EMPATHY_PREFS_SOUNDS_DISABLED_AWAY EMPATHY_PREFS_PATH "/sounds/sounds_disabled_away" +#define EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE EMPATHY_PREFS_PATH "/sounds/sounds_incoming_message" +#define EMPATHY_PREFS_SOUNDS_OUTGOING_MESSAGE EMPATHY_PREFS_PATH "/sounds/sounds_outgoing_message" +#define EMPATHY_PREFS_SOUNDS_NEW_CONVERSATION EMPATHY_PREFS_PATH "/sounds/sounds_new_conversation" +#define EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN EMPATHY_PREFS_PATH "/sounds/sounds_service_login" +#define EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT EMPATHY_PREFS_PATH "/sounds/sounds_service_logout" +#define EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN EMPATHY_PREFS_PATH "/sounds/sounds_contact_login" +#define EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT EMPATHY_PREFS_PATH "/sounds/sounds_contact_logout" #define EMPATHY_PREFS_POPUPS_WHEN_AVAILABLE EMPATHY_PREFS_PATH "/notifications/popups_when_available" #define EMPATHY_PREFS_CHAT_SHOW_SMILEYS EMPATHY_PREFS_PATH "/conversation/graphical_smileys" #define EMPATHY_PREFS_CHAT_THEME EMPATHY_PREFS_PATH "/conversation/theme" diff --git a/src/empathy-preferences.c b/src/empathy-preferences.c index 865fdc82e..f3d0d10a5 100644 --- a/src/empathy-preferences.c +++ b/src/empathy-preferences.c @@ -55,10 +55,9 @@ typedef struct { GtkWidget *radiobutton_contact_list_sort_by_name; GtkWidget *radiobutton_contact_list_sort_by_state; - GtkWidget *checkbutton_sounds_for_messages; - GtkWidget *checkbutton_sounds_when_busy; - GtkWidget *checkbutton_sounds_when_away; - GtkWidget *checkbutton_popups_when_available; + GtkWidget *checkbutton_sounds_enabled; + GtkWidget *checkbutton_sounds_disabled_away; + GtkWidget *treeview_sounds; GtkWidget *treeview_spell_checker; @@ -137,6 +136,29 @@ enum { COL_COMBO_COUNT }; +enum { + COL_SOUND_ENABLED, + COL_SOUND_NAME, + COL_SOUND_KEY, + COL_SOUND_COUNT +}; + +typedef struct { + const char *name; + const char *key; +} SoundEventEntry; + +/* TODO: add phone related sounds also? */ +static SoundEventEntry sound_entries [] = { + { N_("Message received"), EMPATHY_PREFS_SOUNDS_INCOMING_MESSAGE }, + { N_("Message sent"), EMPATHY_PREFS_SOUNDS_OUTGOING_MESSAGE }, + { N_("New conversation"), EMPATHY_PREFS_SOUNDS_NEW_CONVERSATION }, + { N_("Contact logs in"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN }, + { N_("Contact logs out"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT }, + { N_("Logging in a network"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN }, + { N_("Logging off a network"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT } +}; + static void preferences_add_id (EmpathyPreferences *preferences, guint id) { @@ -164,24 +186,18 @@ preferences_setup_widgets (EmpathyPreferences *preferences) guint id; preferences_hookup_toggle_button (preferences, - EMPATHY_PREFS_SOUNDS_FOR_MESSAGES, - preferences->checkbutton_sounds_for_messages); - preferences_hookup_toggle_button (preferences, - EMPATHY_PREFS_SOUNDS_WHEN_AWAY, - preferences->checkbutton_sounds_when_away); - preferences_hookup_toggle_button (preferences, - EMPATHY_PREFS_SOUNDS_WHEN_BUSY, - preferences->checkbutton_sounds_when_busy); + EMPATHY_PREFS_SOUNDS_ENABLED, + preferences->checkbutton_sounds_enabled); preferences_hookup_toggle_button (preferences, - EMPATHY_PREFS_POPUPS_WHEN_AVAILABLE, - preferences->checkbutton_popups_when_available); + EMPATHY_PREFS_SOUNDS_DISABLED_AWAY, + preferences->checkbutton_sounds_disabled_away); preferences_hookup_sensitivity (preferences, - EMPATHY_PREFS_SOUNDS_FOR_MESSAGES, - preferences->checkbutton_sounds_when_away); + EMPATHY_PREFS_SOUNDS_ENABLED, + preferences->checkbutton_sounds_disabled_away); preferences_hookup_sensitivity (preferences, - EMPATHY_PREFS_SOUNDS_FOR_MESSAGES, - preferences->checkbutton_sounds_when_busy); + EMPATHY_PREFS_SOUNDS_ENABLED, + preferences->treeview_sounds); preferences_hookup_toggle_button (preferences, EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS, @@ -224,6 +240,102 @@ preferences_setup_widgets (EmpathyPreferences *preferences) } static void +preferences_sound_cell_toggled_cb (GtkCellRendererToggle *toggle, + char *path_string, + EmpathyPreferences *preferences) +{ + GtkTreePath *path; + gboolean toggled, instore; + GtkTreeIter iter; + GtkTreeView *view; + GtkTreeModel *model; + char *key; + + view = GTK_TREE_VIEW (preferences->treeview_sounds); + model = gtk_tree_view_get_model (view); + + path = gtk_tree_path_new_from_string (path_string); + toggled = gtk_cell_renderer_toggle_get_active (toggle); + + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, COL_SOUND_KEY, &key, + COL_SOUND_ENABLED, &instore, -1); + + instore ^= 1; + + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + COL_SOUND_ENABLED, instore, -1); + + empathy_conf_set_bool (empathy_conf_get (), key, instore); + + gtk_tree_path_free (path); +} + +static void +preferences_sound_load (EmpathyPreferences *preferences) +{ + int i; + GtkTreeView *view; + GtkListStore *store; + GtkTreeIter iter; + gboolean set; + EmpathyConf *conf; + + view = GTK_TREE_VIEW (preferences->treeview_sounds); + store = GTK_LIST_STORE (gtk_tree_view_get_model (view)); + conf = empathy_conf_get (); + + for (i = 0; i < G_N_ELEMENTS (sound_entries); i++) { + empathy_conf_get_bool (conf, sound_entries[i].key, &set); + + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, COL_SOUND_ENABLED, set, + COL_SOUND_NAME, sound_entries[i].name, + COL_SOUND_KEY, sound_entries[i].key, -1); + } +} + +static void +preferences_sound_setup (EmpathyPreferences *preferences) +{ + GtkTreeView *view; + GtkListStore *store; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + view = GTK_TREE_VIEW (preferences->treeview_sounds); + + store = gtk_list_store_new (COL_SOUND_COUNT, + G_TYPE_BOOLEAN, /* enabled */ + G_TYPE_STRING, /* name */ + G_TYPE_STRING); /* key */ + + gtk_tree_view_set_model (view, GTK_TREE_MODEL (store)); + + renderer = gtk_cell_renderer_toggle_new (); + g_signal_connect (renderer, "toggled", + G_CALLBACK (preferences_sound_cell_toggled_cb), + preferences); + + column = gtk_tree_view_column_new (); + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_add_attribute (column, renderer, + "active", COL_SOUND_ENABLED); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_add_attribute (column, renderer, + "text", COL_SOUND_NAME); + + gtk_tree_view_append_column (view, column); + + gtk_tree_view_column_set_resizable (column, FALSE); + gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE); + + g_object_unref (store); +} + +static void preferences_languages_setup (EmpathyPreferences *preferences) { GtkTreeView *view; @@ -949,10 +1061,9 @@ empathy_preferences_show (GtkWindow *parent) "checkbutton_autoconnect", &preferences->checkbutton_autoconnect, "radiobutton_contact_list_sort_by_name", &preferences->radiobutton_contact_list_sort_by_name, "radiobutton_contact_list_sort_by_state", &preferences->radiobutton_contact_list_sort_by_state, - "checkbutton_sounds_for_messages", &preferences->checkbutton_sounds_for_messages, - "checkbutton_sounds_when_busy", &preferences->checkbutton_sounds_when_busy, - "checkbutton_sounds_when_away", &preferences->checkbutton_sounds_when_away, - "checkbutton_popups_when_available", &preferences->checkbutton_popups_when_available, + "checkbutton_sounds_enabled", &preferences->checkbutton_sounds_enabled, + "checkbutton_sounds_disabled_away", &preferences->checkbutton_sounds_disabled_away, + "treeview_sounds", &preferences->treeview_sounds, "treeview_spell_checker", &preferences->treeview_spell_checker, NULL); g_free (filename); @@ -975,6 +1086,9 @@ empathy_preferences_show (GtkWindow *parent) preferences_languages_add (preferences); preferences_languages_load (preferences); + preferences_sound_setup (preferences); + preferences_sound_load (preferences); + if (empathy_spell_supported ()) { GtkWidget *page; diff --git a/src/empathy-preferences.glade b/src/empathy-preferences.glade index fc4e13cef..747604ee6 100644 --- a/src/empathy-preferences.glade +++ b/src/empathy-preferences.glade @@ -243,120 +243,94 @@ </child> <child> <widget class="GtkVBox" id="outer_vbox"> + <property name="visible">True</property> <property name="border_width">12</property> <property name="spacing">18</property> <child> - <widget class="GtkFrame" id="frame5"> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> + <widget class="GtkVBox" id="vbox219"> + <property name="visible">True</property> + <property name="spacing">6</property> <child> - <widget class="GtkAlignment" id="alignment13"> + <widget class="GtkCheckButton" id="checkbutton_sounds_enabled"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">_Enable sound notifications</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment32"> <property name="visible">True</property> - <property name="top_padding">6</property> <property name="left_padding">12</property> <child> - <widget class="GtkVBox" id="vbox106"> + <widget class="GtkCheckButton" id="checkbutton_sounds_disabled_away"> <property name="visible">True</property> - <property name="spacing">6</property> - <child> - <widget class="GtkCheckButton" id="checkbutton_sounds_for_messages"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">_Play sound when messages arrive</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkCheckButton" id="checkbutton_sounds_when_busy"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Enable sounds when _busy</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkCheckButton" id="checkbutton_sounds_when_away"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Enable sounds when _away</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Disable sounds when _away or busy</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> </widget> </child> </widget> - </child> - <child> - <widget class="GtkLabel" id="label613"> - <property name="visible">True</property> - <property name="label" translatable="yes" comments="To translators: Audio notifications preferences"><b>Audio</b></property> - <property name="use_markup">True</property> - </widget> <packing> - <property name="type">label_item</property> + <property name="position">1</property> </packing> </child> </widget> <packing> <property name="expand">False</property> - <property name="fill">False</property> </packing> </child> <child> - <widget class="GtkFrame" id="frame6"> - <property name="label_xalign">0</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> + <widget class="GtkVBox" id="vbox221"> + <property name="visible">True</property> + <property name="spacing">6</property> <child> - <widget class="GtkAlignment" id="alignment14"> + <widget class="GtkLabel" id="label645"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Play sound for events</b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkAlignment" id="alignment33"> <property name="visible">True</property> - <property name="top_padding">6</property> <property name="left_padding">12</property> <child> - <widget class="GtkCheckButton" id="checkbutton_popups_when_available"> + <widget class="GtkScrolledWindow" id="scrolledwindow19"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Display notifications when contacts come _online</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> + <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <property name="shadow_type">GTK_SHADOW_IN</property> + <child> + <widget class="GtkTreeView" id="treeview_sounds"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="headers_visible">False</property> + </widget> + </child> </widget> </child> </widget> - </child> - <child> - <widget class="GtkLabel" id="label614"> - <property name="visible">True</property> - <property name="label" translatable="yes" comments="To translators: Visual notifications preferences, like notify bubbles, etc."><b>Visual</b></property> - <property name="use_markup">True</property> - </widget> <packing> - <property name="type">label_item</property> + <property name="position">1</property> </packing> </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">1</property> </packing> </child> @@ -368,7 +342,7 @@ <child> <widget class="GtkLabel" id="label607"> <property name="visible">True</property> - <property name="label" translatable="yes">Notifications</property> + <property name="label" translatable="yes">Sounds</property> </widget> <packing> <property name="type">tab</property> @@ -378,6 +352,7 @@ </child> <child> <widget class="GtkVBox" id="vbox168"> + <property name="visible">True</property> <property name="border_width">12</property> <property name="spacing">18</property> <child> |