#include <libempathy-gtk/empathy-ui-utils.h>
#include <libempathy-gtk/empathy-theme-manager.h>
#include <libempathy-gtk/empathy-spell.h>
-#include <libempathy-gtk/empathy-contact-list-store.h>
#include <libempathy-gtk/empathy-gtk-enum-types.h>
-
-#ifdef HAVE_WEBKIT
#include <libempathy-gtk/empathy-theme-adium.h>
-#endif
#include "empathy-preferences.h"
#define GET_PRIV(self) ((EmpathyPreferencesPriv *)((EmpathyPreferences *) self)->priv)
+static const gchar * empathy_preferences_tabs[] =
+{
+ "general",
+ "notifications",
+ "sounds",
+ "calls",
+ "location",
+ "spell",
+ "themes",
+};
+
struct _EmpathyPreferencesPriv {
GtkWidget *notebook;
GtkWidget *checkbutton_show_smileys;
GtkWidget *checkbutton_show_contacts_in_rooms;
- GtkWidget *checkbutton_separate_chat_windows;
+ GtkWidget *radiobutton_chats_new_windows;
GtkWidget *checkbutton_events_notif_area;
GtkWidget *checkbutton_autoconnect;
GtkWidget *checkbutton_logging;
GtkWidget *checkbutton_notifications_contact_signin;
GtkWidget *checkbutton_notifications_contact_signout;
+ GtkWidget *echo_cancellation;
+
GtkWidget *treeview_spell_checker;
GtkWidget *checkbutton_location_publish;
GSettings *gsettings;
GSettings *gsettings_chat;
+ GSettings *gsettings_call;
GSettings *gsettings_loc;
GSettings *gsettings_notify;
GSettings *gsettings_sound;
{ 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 goes online"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN },
+ { N_("Contact comes online"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGIN },
{ N_("Contact goes offline"), EMPATHY_PREFS_SOUNDS_CONTACT_LOGOUT },
{ N_("Account connected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGIN },
{ N_("Account disconnected"), EMPATHY_PREFS_SOUNDS_SERVICE_LOGOUT }
g_settings_bind (priv->gsettings_ui,
EMPATHY_PREFS_UI_SEPARATE_CHAT_WINDOWS,
- priv->checkbutton_separate_chat_windows,
+ priv->radiobutton_chats_new_windows,
"active",
G_SETTINGS_BIND_DEFAULT);
"active",
G_SETTINGS_BIND_DEFAULT);
+ g_settings_bind (priv->gsettings_call,
+ EMPATHY_PREFS_CALL_ECHO_CANCELLATION,
+ priv->echo_cancellation,
+ "active",
+ G_SETTINGS_BIND_DEFAULT);
+
g_settings_bind (priv->gsettings,
EMPATHY_PREFS_AUTOCONNECT,
priv->checkbutton_autoconnect,
preferences_preview_theme_append_message (EmpathyChatView *view,
EmpathyContact *sender,
EmpathyContact *receiver,
- const gchar *text)
+ const gchar *text,
+ gboolean should_highlight)
{
EmpathyMessage *message;
"body", text,
NULL);
- empathy_chat_view_append_message (view, message);
+ empathy_chat_view_append_message (view, message, should_highlight);
g_object_unref (message);
}
preferences_preview_theme_append_message (priv->chat_theme_preview,
/* translators: Quote from Romeo & Julier, for chat theme preview */
- juliet, romeo, _("O Romeo, Romeo, wherefore art thou Romeo?"));
+ juliet, romeo, _("O Romeo, Romeo, wherefore art thou Romeo?"),
+ TRUE /* this message mentions Romeo */);
preferences_preview_theme_append_message (priv->chat_theme_preview,
/* translators: Quote from Romeo & Julier, for chat theme preview */
- juliet, romeo, _("Deny thy father and refuse thy name;"));
+ juliet, romeo, _("Deny thy father and refuse thy name;"), FALSE);
preferences_preview_theme_append_message (priv->chat_theme_preview,
/* translators: Quote from Romeo & Julier, for chat theme preview */
- juliet, romeo, _("Or if thou wilt not, be but sworn my love"));
+ juliet, romeo, _("Or if thou wilt not, be but sworn my love"), FALSE);
preferences_preview_theme_append_message (priv->chat_theme_preview,
/* translators: Quote from Romeo & Julier, for chat theme preview */
- juliet, romeo, _("And I'll no longer be a Capulet."));
+ juliet, romeo, _("And I'll no longer be a Capulet."), FALSE);
preferences_preview_theme_append_message (priv->chat_theme_preview,
/* translators: Quote from Romeo & Julier, for chat theme preview */
- romeo, juliet, _("Shall I hear more, or shall I speak at this?"));
+ romeo, juliet, _("Shall I hear more, or shall I speak at this?"), FALSE);
/* translators: Quote from Romeo & Julier, for chat theme preview */
empathy_chat_view_append_event (priv->chat_theme_preview, _("Juliet has disconnected"));
g_free (conf_name);
}
-static void
+/* return TRUE if we added at least one variant */
+static gboolean
preferences_theme_variants_fill (EmpathyPreferences *preferences,
GHashTable *info)
{
GPtrArray *variants;
const gchar *default_variant;
guint i;
+ gboolean result = FALSE;
model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->combobox_chat_theme_variant));
store = GTK_LIST_STORE (model);
COL_VARIANT_NAME, name,
COL_VARIANT_DEFAULT, !tp_strdiff (name, default_variant),
-1);
+
+ result = TRUE;
}
/* Select the variant from the GSetting key */
preferences_theme_variant_notify_cb (priv->gsettings_chat,
EMPATHY_PREFS_CHAT_THEME_VARIANT,
preferences);
+
+ return result;
}
static void
EMPATHY_PREFS_CHAT_THEME,
name);
if (is_adium) {
+ gboolean variant;
+
g_settings_set_string (priv->gsettings_chat,
EMPATHY_PREFS_CHAT_ADIUM_PATH,
path);
- preferences_theme_variants_fill (preferences, info);
- gtk_widget_show (priv->hbox_chat_theme_variant);
+
+ variant = preferences_theme_variants_fill (preferences, info);
+ gtk_widget_set_visible (priv->hbox_chat_theme_variant, variant);
} else {
gtk_widget_hide (priv->hbox_chat_theme_variant);
}
g_object_unref (priv->gsettings);
g_object_unref (priv->gsettings_chat);
+ g_object_unref (priv->gsettings_call);
g_object_unref (priv->gsettings_loc);
g_object_unref (priv->gsettings_notify);
g_object_unref (priv->gsettings_sound);
"combobox_chat_theme_variant", &priv->combobox_chat_theme_variant,
"hbox_chat_theme_variant", &priv->hbox_chat_theme_variant,
"sw_chat_theme_preview", &priv->sw_chat_theme_preview,
- "checkbutton_separate_chat_windows", &priv->checkbutton_separate_chat_windows,
+ "radiobutton_chats_new_windows", &priv->radiobutton_chats_new_windows,
"checkbutton_events_notif_area", &priv->checkbutton_events_notif_area,
"checkbutton_autoconnect", &priv->checkbutton_autoconnect,
"checkbutton_logging", &priv->checkbutton_logging,
"checkbutton_location_resource_network", &priv->checkbutton_location_resource_network,
"checkbutton_location_resource_cell", &priv->checkbutton_location_resource_cell,
"checkbutton_location_resource_gps", &priv->checkbutton_location_resource_gps,
+ "call_echo_cancellation", &priv->echo_cancellation,
NULL);
g_free (filename);
priv->gsettings = g_settings_new (EMPATHY_PREFS_SCHEMA);
priv->gsettings_chat = g_settings_new (EMPATHY_PREFS_CHAT_SCHEMA);
+ priv->gsettings_call = g_settings_new (EMPATHY_PREFS_CALL_SCHEMA);
priv->gsettings_loc = g_settings_new (EMPATHY_PREFS_LOCATION_SCHEMA);
priv->gsettings_notify = g_settings_new (EMPATHY_PREFS_NOTIFICATIONS_SCHEMA);
priv->gsettings_sound = g_settings_new (EMPATHY_PREFS_SOUNDS_SCHEMA);
preferences_sound_load (preferences);
if (empathy_spell_supported ()) {
- page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), 2);
+ page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), EMPATHY_PREFERENCES_TAB_SPELL);
gtk_widget_show (page);
}
- page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), 3);
+ page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook), EMPATHY_PREFERENCES_TAB_LOCATION);
#ifdef HAVE_GEOCLUE
gtk_widget_show (page);
#else
#endif
}
+static EmpathyPreferencesTab
+empathy_preferences_tab_from_string (const gchar *str)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (empathy_preferences_tabs); i++)
+ {
+ if (!tp_strdiff (str, empathy_preferences_tabs[i]))
+ return i;
+ }
+
+ g_warn_if_reached ();
+ return -1;
+}
+
+const gchar *
+empathy_preferences_tab_to_string (EmpathyPreferencesTab tab)
+{
+ g_return_val_if_fail (tab < G_N_ELEMENTS (empathy_preferences_tabs), NULL);
+
+ return empathy_preferences_tabs[tab];
+}
+
GtkWidget *
-empathy_preferences_new (GtkWindow *parent)
+empathy_preferences_new (GtkWindow *parent,
+ gboolean shell_running)
{
- GtkWidget *self;
+ GtkWidget *self;
+ EmpathyPreferencesPriv *priv;
+ GtkWidget *notif_page;
g_return_val_if_fail (parent == NULL || GTK_IS_WINDOW (parent), NULL);
parent);
}
+ /* when running in Gnome Shell we must hide these options since they
+ * are meaningless in that context:
+ * - 'Display incoming events in the notification area' (General->Behavior)
+ * - 'Notifications' tab
+ */
+ priv = GET_PRIV (self);
+ if (shell_running) {
+ gtk_widget_hide (priv->checkbutton_events_notif_area);
+ notif_page = gtk_notebook_get_nth_page (GTK_NOTEBOOK (priv->notebook),
+ EMPATHY_PREFERENCES_TAB_NOTIFICATIONS);
+ gtk_widget_hide (notif_page);
+ }
+
return self;
}
+
+void
+empathy_preferences_show_tab (EmpathyPreferences *self,
+ const gchar *page)
+{
+ EmpathyPreferencesPriv *priv = GET_PRIV (self);
+
+ gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook),
+ empathy_preferences_tab_from_string (page));
+}