#include <dbus/dbus-glib.h>
#include <gio/gdesktopappinfo.h>
-#include <telepathy-glib/account-manager.h>
-#include <telepathy-glib/defs.h>
-#include <telepathy-glib/util.h>
+#include <telepathy-glib/telepathy-glib.h>
#include <libempathy/empathy-utils.h>
#include <libempathy/empathy-connection-managers.h>
-#include <libempathy/empathy-connectivity.h>
-#include <libempathy/empathy-tp-contact-factory.h>
+#include <libempathy/empathy-pkg-kit.h>
#include <libempathy-gtk/empathy-ui-utils.h>
#include <libempathy-gtk/empathy-protocol-chooser.h>
#include <libempathy-gtk/empathy-account-widget-irc.h>
#include <libempathy-gtk/empathy-account-widget-sip.h>
#include <libempathy-gtk/empathy-cell-renderer-activatable.h>
-#include <libempathy-gtk/empathy-contact-widget.h>
+#include <libempathy-gtk/empathy-user-info.h>
#include <libempathy-gtk/empathy-images.h>
+#include <libempathy-gtk/empathy-local-xmpp-assistant-widget.h>
#include <libempathy-gtk/empathy-new-account-dialog.h>
#include "empathy-accounts-common.h"
GtkWidget *enabled_switch;
GtkWidget *treeview;
+ GtkCellRenderer *name_renderer;
GtkWidget *button_add;
GtkWidget *button_remove;
GtkWidget *label_name;
GtkWidget *label_type;
GtkWidget *dialog_content;
+ GtkWidget *user_info;
GtkWidget *notebook_account;
GtkWidget *spinner;
* That's kinda ugly; cf bgo #640417.
*
* */
- EmpathyAccountWidget *setting_widget_object;
+ EmpathyAccountWidget *setting_widget;
gboolean connecting_show;
guint connecting_id;
TpAccountManager *account_manager;
EmpathyConnectionManagers *cms;
- EmpathyConnectivity *connectivity;
+ GNetworkMonitor *connectivity;
GtkWindow *parent_window;
TpAccount *initial_selection;
* EmpathyAccountsDialog object. */
gboolean force_change_row;
GtkTreeRowReference *destination_row;
+
+ GHashTable *icons_cache;
} EmpathyAccountsDialogPriv;
enum {
}
static void
-accounts_dialog_enable_account_cb (GObject *account,
+accounts_dialog_enable_account_cb (GObject *object,
GAsyncResult *result,
gpointer user_data)
{
+ TpAccount *account = TP_ACCOUNT (object);
+ gboolean enable = GPOINTER_TO_UINT (user_data);
GError *error = NULL;
+ TpAccountManager *am;
- tp_account_set_enabled_finish (TP_ACCOUNT (account), result, &error);
-
- if (error != NULL)
+ if (!tp_account_set_enabled_finish (account, result, &error))
{
DEBUG ("Could not enable the account: %s", error->message);
g_error_free (error);
+ return;
}
- else
+
+ /* tp_account_is_enabled() is not updated yet at this point */
+ if (enable)
{
- TpAccountManager *am = tp_account_manager_dup ();
+ am = tp_account_manager_dup ();
- empathy_connect_new_account (TP_ACCOUNT (account), am);
+ empathy_connect_new_account (account, am);
g_object_unref (am);
}
}
+static void
+enable_and_connect_account (TpAccount *account,
+ gboolean enable)
+{
+ tp_account_set_enabled_async (account, enable,
+ accounts_dialog_enable_account_cb, GUINT_TO_POINTER (enable));
+}
+
static void
accounts_dialog_enable_switch_active_cb (GtkSwitch *sw,
GParamSpec *spec,
{
EmpathyAccountSettings *settings;
TpAccount *account;
+ gboolean enable;
settings = accounts_dialog_model_get_selected_settings (dialog);
if (settings == NULL)
if (account == NULL)
return;
- tp_account_set_enabled_async (account, gtk_switch_get_active (sw),
- accounts_dialog_enable_account_cb, NULL);
+ enable = gtk_switch_get_active (sw);
+
+ enable_and_connect_account (account, enable);
}
static void
-accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
+install_haze_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GError *error = NULL;
+
+ if (!empathy_pkg_kit_install_packages_finish (result, &error))
+ {
+ DEBUG ("Failed to install telepathy-haze: %s", error->message);
+
+ g_error_free (error);
+ }
+}
+
+static gboolean
+account_is_selected (EmpathyAccountsDialog *dialog,
TpAccount *account)
{
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- gchar *status_message = NULL;
- guint status;
- guint reason;
- guint presence;
- GtkTreeView *view;
- GtkTreeModel *model;
- GtkTreeSelection *selection;
- GtkTreeIter iter;
- TpAccount *selected_account;
- gboolean account_enabled;
- gboolean creating_account;
- TpStorageRestrictionFlags storage_restrictions = 0;
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ TpAccount *selected_account;
- view = GTK_TREE_VIEW (priv->treeview);
- selection = gtk_tree_view_get_selection (view);
+ if (account == NULL)
+ return FALSE;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
if (!gtk_tree_selection_get_selected (selection, &model, &iter))
- return;
+ return FALSE;
gtk_tree_model_get (model, &iter, COL_ACCOUNT, &selected_account, -1);
+
if (selected_account != NULL)
g_object_unref (selected_account);
+ return account == selected_account;
+}
+
+static gboolean
+account_can_be_enabled (TpAccount *account)
+{
+ TpStorageRestrictionFlags storage_restrictions;
+
+ storage_restrictions = tp_account_get_storage_restrictions (account);
+ if (storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED)
+ return FALSE;
+
+ /* Butterfly accounts shouldn't be used any more */
+ if (!tp_strdiff (tp_account_get_cm_name (account),
+ "butterfly"))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void
+accounts_dialog_update_status_infobar (EmpathyAccountsDialog *dialog,
+ TpAccount *account)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+ gchar *status_message = NULL;
+ guint status;
+ guint reason;
+ guint presence;
+ gboolean account_enabled;
+ gboolean creating_account;
+ gboolean display_switch = TRUE;
+
/* do not update the infobar when the account is not selected */
- if (account != selected_account)
+ if (!account_is_selected (dialog, account))
return;
if (account != NULL)
if (!account_enabled)
presence = TP_CONNECTION_PRESENCE_TYPE_OFFLINE;
- storage_restrictions = tp_account_get_storage_restrictions (account);
+ display_switch = account_can_be_enabled (account);
}
else
{
accounts_dialog_enable_switch_active_cb, dialog);
/* Display the Enable switch if account supports it */
- gtk_widget_set_visible (priv->enabled_switch,
- !(storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED));
+ gtk_widget_set_visible (priv->enabled_switch, display_switch);
if (account_enabled)
{
g_free (message);
}
- if (!empathy_connectivity_is_online (priv->connectivity))
+ if (!g_network_monitor_get_network_available (priv->connectivity))
accounts_dialog_status_infobar_set_message (dialog,
_("Offline — No Network Connection"));
}
else
{
- accounts_dialog_status_infobar_set_message (dialog,
- _("Offline — Account Disabled"));
+ if (!tp_strdiff (tp_account_get_cm_name (account),
+ "butterfly"))
+ {
+ const gchar *packages[] = { "telepathy-haze", NULL };
+
+ accounts_dialog_status_infobar_set_message (dialog,
+ _("This account has been disabled because it relies on an old, "
+ "unsupported backend. Please install telepathy-haze and "
+ "restart your session to migrate the account."));
+
+ empathy_pkg_kit_install_packages_async (0, packages, NULL, NULL,
+ install_haze_cb, NULL);
+ }
+ else
+ {
+ accounts_dialog_status_infobar_set_message (dialog,
+ _("Offline — Account Disabled"));
+ }
gtk_info_bar_set_message_type (GTK_INFO_BAR (priv->infobar),
GTK_MESSAGE_WARNING);
COL_ACCOUNT_SETTINGS, &settings,
COL_ACCOUNT, &account, -1);
- empathy_account_widget_discard_pending_changes (priv->setting_widget_object);
+ empathy_account_widget_discard_pending_changes (priv->setting_widget);
if (account == NULL)
{
GtkTreeIter iter;
gboolean creating;
- g_object_get (priv->setting_widget_object,
+ g_object_get (priv->setting_widget,
"creating-account", &creating, NULL);
if (!creating)
{
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
EmpathyAccountSettings *settings;
- GtkWidget *subdialog, *content, *content_area, *align;
+ GtkWidget *subdialog, *content_area, *align;
settings = accounts_dialog_model_get_selected_settings (dialog);
+ if (settings == NULL)
+ return;
subdialog = gtk_dialog_new_with_buttons (_("Edit Connection Parameters"),
GTK_WINDOW (dialog),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
NULL, NULL);
- priv->setting_widget_object =
+ gtk_window_set_resizable (GTK_WINDOW (subdialog), FALSE);
+
+ priv->setting_widget = (EmpathyAccountWidget *)
empathy_account_widget_new_for_protocol (settings, FALSE);
- g_object_add_weak_pointer (G_OBJECT (priv->setting_widget_object),
- (gpointer *) &priv->setting_widget_object);
+ g_object_add_weak_pointer (G_OBJECT (priv->setting_widget),
+ (gpointer *) &priv->setting_widget);
if (accounts_dialog_has_valid_accounts (dialog))
empathy_account_widget_set_other_accounts_exist (
- priv->setting_widget_object, TRUE);
-
- content = empathy_account_widget_get_widget (priv->setting_widget_object);
+ priv->setting_widget, TRUE);
- g_signal_connect (priv->setting_widget_object, "cancelled",
+ g_signal_connect (priv->setting_widget, "cancelled",
G_CALLBACK (empathy_account_dialog_widget_cancelled_cb), dialog);
- g_signal_connect_swapped (priv->setting_widget_object, "close",
+ g_signal_connect_swapped (priv->setting_widget, "close",
G_CALLBACK (gtk_widget_destroy), subdialog);
content_area = gtk_dialog_get_content_area (GTK_DIALOG (subdialog));
align = gtk_alignment_new (0.5, 0.5, 1, 1);
gtk_alignment_set_padding (GTK_ALIGNMENT (align), 6, 0, 6, 6);
- gtk_container_add (GTK_CONTAINER (align), content);
+ gtk_container_add (GTK_CONTAINER (align), GTK_WIDGET (priv->setting_widget));
gtk_box_pack_start (GTK_BOX (content_area), align, TRUE, TRUE, 0);
- gtk_widget_show (content);
+ gtk_widget_show (GTK_WIDGET (priv->setting_widget));
gtk_widget_show (align);
gtk_widget_show (subdialog);
}
-static void
-start_external_app (GAppInfo *app_info)
-{
- GError *error = NULL;
- GdkAppLaunchContext *context = NULL;
- GdkDisplay *display;
-
- display = gdk_display_get_default ();
- context = gdk_display_get_app_launch_context (display);
-
- if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
- &error))
- {
- g_critical ("Failed to bisho: %s", error->message);
- g_clear_error (&error);
- }
-
- tp_clear_object (&context);
-}
-
static void
use_external_storage_provider (EmpathyAccountsDialog *self,
TpAccount *account)
provider = tp_account_get_storage_provider (account);
if (!tp_strdiff (provider, "com.meego.libsocialweb"))
{
- GDesktopAppInfo *desktop_info;
- gchar *cmd;
- GAppInfo *app_info;
- GError *error = NULL;
-
- desktop_info = g_desktop_app_info_new ("gnome-control-center.desktop");
- if (desktop_info == NULL)
- {
- g_critical ("Could not locate 'gnome-control-center.desktop'");
- return;
- }
-
- /* glib doesn't have API to start a desktop file with args... (#637875) */
- cmd = g_strdup_printf ("%s bisho.desktop", g_app_info_get_commandline (
- (GAppInfo *) desktop_info));
-
- app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error);
-
- if (app_info == NULL)
- {
- DEBUG ("Failed to create app info: %s", error->message);
- g_error_free (error);
- }
- else
- {
- start_external_app (app_info);
- g_object_unref (app_info);
- }
-
- g_object_unref (desktop_info);
- g_free (cmd);
+ empathy_launch_external_app ("gnome-control-center.desktop",
+ "bisho.desktop", NULL);
return;
}
- else if (!tp_strdiff (provider, "org.gnome.OnlineAccounts"))
+ else if (!tp_strdiff (provider, EMPATHY_GOA_PROVIDER))
{
- GDesktopAppInfo *desktop_info;
-
- desktop_info = g_desktop_app_info_new (
- "gnome-online-accounts-panel.desktop");
- if (desktop_info == NULL)
- {
- g_critical ("Could not locate 'gnome-online-accounts-panel.desktop'");
- }
- else
- {
- start_external_app (G_APP_INFO (desktop_info));
- g_object_unref (desktop_info);
- }
-
+ empathy_launch_external_app ("gnome-online-accounts-panel.desktop",
+ NULL, NULL);
+ return;
+ }
+ else if (!tp_strdiff (provider, EMPATHY_UOA_PROVIDER))
+ {
+ empathy_launch_external_app ("gnome-credentials-panel.desktop",
+ NULL, NULL);
return;
}
else
TpStorageRestrictionFlags storage_restrictions;
settings = accounts_dialog_model_get_selected_settings (dialog);
+ if (settings == NULL)
+ return;
account = empathy_account_settings_get_account (settings);
g_return_if_fail (account != NULL);
}
}
-static void
-account_dialog_show_contact_details_failed (EmpathyAccountsDialog *dialog,
- gboolean error)
-{
- EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- GtkWidget *infobar, *label;
-
- infobar = gtk_info_bar_new ();
-
- if (error)
- {
- gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_ERROR);
- label = gtk_label_new (_("Failed to retrieve your personal information "
- "from the server."));
- }
- else
- {
- gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
- label = gtk_label_new (_("Go online to edit your personal information."));
- }
-
- gtk_container_add (
- GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (infobar))),
- label);
- gtk_box_pack_start (GTK_BOX (priv->dialog_content), infobar, FALSE, FALSE, 0);
- gtk_widget_show_all (infobar);
-}
-
-static void
-account_dialog_got_self_contact (TpConnection *conn,
- EmpathyContact *contact,
- const GError *in_error,
- gpointer user_data,
- GObject *dialog)
-{
- EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- GtkWidget *editor, *alig;
-
- if (in_error != NULL)
- {
- DEBUG ("Failed to get self-contact: %s", in_error->message);
- account_dialog_show_contact_details_failed (
- EMPATHY_ACCOUNTS_DIALOG (dialog), TRUE);
- return;
- }
-
- alig = gtk_alignment_new (0.5, 0, 1, 1);
-
- /* create the contact info editor for this account */
- editor = empathy_contact_widget_new (contact,
- EMPATHY_CONTACT_WIDGET_EDIT_ALIAS |
- EMPATHY_CONTACT_WIDGET_EDIT_AVATAR |
- EMPATHY_CONTACT_WIDGET_NO_STATUS |
- EMPATHY_CONTACT_WIDGET_EDIT_DETAILS);
-
- gtk_box_pack_start (GTK_BOX (priv->dialog_content), alig, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (alig), editor);
- gtk_widget_show (alig);
- gtk_widget_show (editor);
-}
-
static void
account_dialog_create_dialog_content (EmpathyAccountsDialog *dialog,
EmpathyAccountSettings *settings)
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
const gchar *icon_name;
TpAccount *account;
- TpConnection *conn = NULL;
GtkWidget *bbox, *button;
+ GtkWidget *alig;
account = empathy_account_settings_get_account (settings);
- // if (priv->setting_widget_object != NULL)
- // g_object_remove_weak_pointer (G_OBJECT (priv->setting_widget_object),
- // (gpointer *) &priv->setting_widget_object);
-
priv->dialog_content = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
gtk_container_add (GTK_CONTAINER (priv->alignment_settings),
priv->dialog_content);
gtk_widget_show (priv->dialog_content);
- /* request the self contact */
- if (account != NULL)
- conn = tp_account_get_connection (account);
-
- if (conn != NULL)
- {
- empathy_tp_contact_factory_get_from_handle (conn,
- tp_connection_get_self_handle (conn),
- account_dialog_got_self_contact,
- NULL, NULL, G_OBJECT (dialog));
- }
- else
- {
- account_dialog_show_contact_details_failed (dialog, FALSE);
- }
+ alig = gtk_alignment_new (0.5, 0, 1, 1);
+ priv->user_info = empathy_user_info_new (account);
+ gtk_container_add (GTK_CONTAINER (alig), priv->user_info);
+ gtk_box_pack_start (GTK_BOX (priv->dialog_content), alig, TRUE, TRUE, 0);
+ gtk_widget_show (alig);
+ gtk_widget_show (priv->user_info);
bbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
if (gtk_tree_selection_get_selected (selection, &model, &iter))
gtk_tree_model_get (model, &iter, COL_ACCOUNT, account, -1);
- return priv->setting_widget_object != NULL
+ return priv->setting_widget != NULL
&& empathy_account_widget_contains_pending_changes (
- priv->setting_widget_object);
+ priv->setting_widget);
}
static void
response = gtk_dialog_run (GTK_DIALOG (dialog));
- if (response == GTK_RESPONSE_OK)
+ if (response == GTK_RESPONSE_APPLY)
{
EmpathyAccountSettings *settings;
TpAccount *account;
return;
}
- /* No account and no profile, warn the user */
+ /* No account selected */
gtk_widget_hide (priv->vbox_details);
- gtk_widget_set_sensitive (priv->button_add, FALSE);
+ gtk_widget_set_sensitive (priv->button_add, TRUE);
+ gtk_widget_set_sensitive (priv->button_remove, FALSE);
gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook_account),
NOTEBOOK_PAGE_NO_PROTOCOL);
* one for the account selected */
gtk_widget_show (priv->vbox_details);
+ if (priv->user_info != NULL)
+ {
+ empathy_user_info_apply_async ((EmpathyUserInfo *) priv->user_info,
+ NULL, NULL);
+ priv->user_info = NULL;
+ }
if (priv->dialog_content)
{
gtk_widget_destroy (priv->dialog_content);
return empathy_icon_name_for_presence (presence);
}
+static GdkPixbuf *
+ensure_icon (EmpathyAccountsDialog *self,
+ const gchar *icon_name)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+ GdkPixbuf *pixbuf;
+
+ pixbuf = g_hash_table_lookup (priv->icons_cache, icon_name);
+ if (pixbuf == NULL)
+ {
+ pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+
+ if (pixbuf == NULL)
+ return NULL;
+
+ g_hash_table_insert (priv->icons_cache, g_strdup (icon_name),
+ pixbuf);
+ }
+
+ return g_object_ref (pixbuf);
+}
+
static void
accounts_dialog_model_status_pixbuf_data_func (GtkTreeViewColumn *tree_column,
GtkCellRenderer *cell,
EmpathyAccountsDialog *dialog)
{
TpAccount *account;
+ const gchar *icon_name;
+ GdkPixbuf *pixbuf;
gtk_tree_model_get (model, iter, COL_ACCOUNT, &account, -1);
+ icon_name = get_status_icon_for_account (dialog, account);
+ pixbuf = ensure_icon (dialog, icon_name);
+
g_object_set (cell,
- "icon-name", get_status_icon_for_account (dialog, account),
+ "pixbuf", pixbuf,
NULL);
if (account != NULL)
g_object_unref (account);
+
+ if (pixbuf != NULL)
+ g_object_unref (pixbuf);
}
static void
-1);
icon_name = empathy_account_settings_get_icon_name (settings);
- pixbuf = empathy_pixbuf_from_icon_name (icon_name, GTK_ICON_SIZE_BUTTON);
+ pixbuf = ensure_icon (dialog, icon_name);
g_object_set (cell,
"visible", TRUE,
accounts_dialog_remove_account_iter (dialog, &iter);
}
-#ifdef HAVE_MEEGO
-static void
-accounts_dialog_view_delete_activated_cb (EmpathyCellRendererActivatable *cell,
- const gchar *path_string,
- EmpathyAccountsDialog *dialog)
-{
- EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- GtkTreeModel *model;
- GtkTreeIter iter;
-
- model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->treeview));
- if (!gtk_tree_model_get_iter_from_string (model, &iter, path_string))
- return;
-
- accounts_dialog_remove_account_iter (dialog, &iter);
-}
-#endif /* HAVE_MEEGO */
-
static void
accounts_dialog_model_add_columns (EmpathyAccountsDialog *dialog)
{
NULL);
/* Name renderer */
- cell = gtk_cell_renderer_text_new ();
- g_object_set (cell,
+ priv->name_renderer = gtk_cell_renderer_text_new ();
+ g_object_set (priv->name_renderer,
"ellipsize", PANGO_ELLIPSIZE_END,
"width-chars", 25,
"editable", TRUE,
NULL);
- gtk_tree_view_column_pack_start (column, cell, TRUE);
- gtk_tree_view_column_add_attribute (column, cell, "text", COL_NAME);
- g_signal_connect (cell, "edited",
+ gtk_tree_view_column_pack_start (column, priv->name_renderer, TRUE);
+ gtk_tree_view_column_add_attribute (column, priv->name_renderer,
+ "text", COL_NAME);
+ g_signal_connect (priv->name_renderer, "edited",
G_CALLBACK (accounts_dialog_name_edited_cb),
dialog);
- g_signal_connect (cell, "editing-started",
+ g_signal_connect (priv->name_renderer, "editing-started",
G_CALLBACK (accounts_dialog_name_editing_started_cb),
dialog);
- g_object_set (cell, "ypad", 4, NULL);
-
-#ifdef HAVE_MEEGO
- /* Delete column */
- cell = empathy_cell_renderer_activatable_new ();
- gtk_tree_view_column_pack_start (column, cell, FALSE);
- g_object_set (cell,
- "icon-name", GTK_STOCK_DELETE,
- "show-on-select", TRUE,
- NULL);
-
- g_signal_connect (cell, "path-activated",
- G_CALLBACK (accounts_dialog_view_delete_activated_cb),
- dialog);
-#endif /* HAVE_MEEGO */
+ g_object_set (priv->name_renderer, "ypad", 4, NULL);
}
static EmpathyAccountSettings *
if (settings != NULL)
g_object_unref (settings);
- if (priv->setting_widget_object != NULL)
+ if (priv->setting_widget != NULL)
{
- g_object_get (priv->setting_widget_object,
+ g_object_get (priv->setting_widget,
"creating-account", &creating, NULL);
}
priv->force_change_row = TRUE;
empathy_account_widget_discard_pending_changes (
- priv->setting_widget_object);
+ priv->setting_widget);
path = gtk_tree_row_reference_get_path (priv->destination_row);
selection = gtk_tree_view_get_selection (
gboolean enabled;
enabled = tp_account_is_enabled (account);
- tp_account_set_enabled_async (account, !enabled, NULL, NULL);
+
+ enable_and_connect_account (account, !enabled);
+}
+
+static void
+accounts_dialog_treeview_rename_cb (GtkMenuItem *item,
+ EmpathyAccountsDialog *self)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+ GtkTreePath *path;
+ GtkTreeIter iter;
+ GtkTreeSelection *selection;
+ GtkTreeModel *model;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->treeview));
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+ return;
+ path = gtk_tree_model_get_path (model, &iter);
+
+ g_object_set (G_OBJECT (priv->name_renderer), "editable", TRUE, NULL);
+
+ gtk_widget_grab_focus (GTK_WIDGET (priv->treeview));
+ gtk_tree_view_set_cursor (GTK_TREE_VIEW (priv->treeview), path,
+ gtk_tree_view_get_column (GTK_TREE_VIEW (priv->treeview), 0), TRUE);
+
+ gtk_tree_path_free (path);
}
static gboolean
GtkTreePath *path = NULL;
GtkTreeIter iter;
GtkWidget *menu;
- GtkWidget *item_enable, *item_disable;
- GtkWidget *image_enable, *image_disable;
+ GtkWidget *item;
/* ignore multiple clicks */
if (event->type != GDK_BUTTON_PRESS)
/* Create the menu */
menu = empathy_context_menu_new (GTK_WIDGET (view));
- /* Get images for menu items */
- image_enable = gtk_image_new_from_icon_name (empathy_icon_name_for_presence (
- tp_account_manager_get_most_available_presence (
- priv->account_manager, NULL, NULL)),
- GTK_ICON_SIZE_MENU);
- image_disable = gtk_image_new_from_icon_name (
- empathy_icon_name_for_presence (TP_CONNECTION_PRESENCE_TYPE_OFFLINE),
- GTK_ICON_SIZE_MENU);
-
- /* Menu items: to enabled/disable the account */
- item_enable = gtk_image_menu_item_new_with_mnemonic (_("_Enable"));
- item_disable = gtk_image_menu_item_new_with_mnemonic (_("_Disable"));
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item_enable),
- image_enable);
- gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item_disable),
- image_disable);
-
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item_enable);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), item_disable);
-
- if (tp_account_is_enabled (account))
- {
- tp_g_signal_connect_object (item_disable, "activate",
+ /* Menu item: to enabled/disable the account */
+ item = gtk_check_menu_item_new_with_mnemonic (_("_Enabled"));
+
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ if (account_can_be_enabled (account))
+ {
+ gboolean active;
+
+ active = tp_account_is_enabled (account);
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item),
+ active);
+
+ tp_g_signal_connect_object (item, "activate",
G_CALLBACK (accounts_dialog_treeview_enabled_cb), account, 0);
- gtk_widget_set_sensitive (item_enable, FALSE);
}
else
{
- tp_g_signal_connect_object (item_enable, "activate",
- G_CALLBACK (accounts_dialog_treeview_enabled_cb), account, 0);
- gtk_widget_set_sensitive (item_disable, FALSE);
+ gtk_widget_set_sensitive (item, FALSE);
}
- gtk_widget_show (item_enable);
- gtk_widget_show (item_disable);
+ gtk_widget_show (item);
+
+ /* Menu item: Rename */
+ item = gtk_menu_item_new_with_mnemonic (_("Rename"));
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+ tp_g_signal_connect_object (item, "activate",
+ G_CALLBACK (accounts_dialog_treeview_rename_cb), dialog, 0);
+
+ gtk_widget_show (item);
/* FIXME: Add here presence items, to be able to set per-account presence */
return FALSE;
}
+static void
+reload_account_widget (EmpathyAccountsDialog *self)
+{
+ EmpathyAccountSettings *settings;
+
+ settings = accounts_dialog_model_get_selected_settings (self);
+ accounts_dialog_update_settings (self, settings);
+}
+
static void
accounts_dialog_connection_changed_cb (TpAccount *account,
guint old_status,
g_object_unref (settings);
}
+static void
+conn_prepare_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ EmpathyAccountsDialog *self = user_data;
+
+ reload_account_widget (self);
+}
+
+static void
+accounts_dialog_notify_connection_cb (TpAccount *account,
+ GParamSpec *spec,
+ EmpathyAccountsDialog *self)
+{
+ TpConnection *conn;
+ if (!account_is_selected (self, account))
+ return;
+
+ conn = tp_account_get_connection (account);
+ if (conn == NULL)
+ {
+ reload_account_widget (self);
+ }
+ else
+ {
+ /* Wait for this feature so TpConnection will have fetch the
+ * self handle */
+ GQuark features[] = { TP_CONNECTION_FEATURE_CONNECTED, 0 };
+
+ tp_proxy_prepare_async (conn, features, conn_prepare_cb, self);
+ }
+}
+
static void
accounts_dialog_add_account (EmpathyAccountsDialog *dialog,
TpAccount *account)
if (gtk_tree_selection_count_selected_rows (selection) == 0)
selected = TRUE;
- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &iter, -1,
+ COL_NAME, name,
+ COL_STATUS, status,
+ COL_ACCOUNT, account,
+ COL_ACCOUNT_SETTINGS, settings,
+ -1);
}
else
{
selected = gtk_tree_selection_iter_is_selected (selection, &iter);
- }
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- COL_NAME, name,
- COL_STATUS, status,
- COL_ACCOUNT, account,
- COL_ACCOUNT_SETTINGS, settings,
- -1);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ COL_NAME, name,
+ COL_STATUS, status,
+ COL_ACCOUNT, account,
+ COL_ACCOUNT_SETTINGS, settings,
+ -1);
+ }
if (selected)
{
G_CALLBACK (accounts_dialog_connection_changed_cb), dialog, 0);
tp_g_signal_connect_object (account, "presence-changed",
G_CALLBACK (accounts_dialog_presence_changed_cb), dialog, 0);
+ tp_g_signal_connect_object (account, "notify::connection",
+ G_CALLBACK (accounts_dialog_notify_connection_cb), dialog, 0);
g_object_unref (settings);
}
{
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- if (priv->setting_widget_object != NULL &&
+ if (priv->setting_widget != NULL &&
accounts_dialog_has_valid_accounts (dialog))
{
empathy_account_widget_set_other_accounts_exist (
- priv->setting_widget_object, TRUE);
+ priv->setting_widget, TRUE);
}
}
{
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
- if (priv->setting_widget_object != NULL &&
+ if (priv->setting_widget != NULL &&
!accounts_dialog_has_valid_accounts (dialog))
{
empathy_account_widget_set_other_accounts_exist (
- priv->setting_widget_object, FALSE);
+ priv->setting_widget, FALSE);
}
}
select_and_scroll_to_iter (dialog, &iter);
}
+static void
+salut_valid_cb (GtkWidget *widget,
+ gboolean valid,
+ GtkWidget *button)
+{
+ gtk_widget_set_sensitive (button, valid);
+}
+
+static void
+maybe_show_salut_dialog (EmpathyAccountsDialog *self)
+{
+ EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+ GtkWidget *dialog, *widget, *content, *button;
+ gint response;
+
+ if (!empathy_local_xmpp_assistant_widget_should_create_account (
+ priv->account_manager))
+ return;
+
+ widget = empathy_local_xmpp_assistant_widget_new ();
+ gtk_widget_show (widget);
+
+ dialog = gtk_dialog_new ();
+
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
+
+ gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Skip"),
+ GTK_RESPONSE_NO);
+
+ button = gtk_dialog_add_button (GTK_DIALOG (dialog),
+ _("_Connect"), GTK_RESPONSE_YES);
+ gtk_widget_set_sensitive (button,
+ empathy_local_xmpp_assistant_widget_is_valid (
+ EMPATHY_LOCAL_XMPP_ASSISTANT_WIDGET (widget)));
+
+ g_signal_connect (widget, "valid", G_CALLBACK (salut_valid_cb),
+ button);
+
+ content = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+ gtk_box_pack_start (GTK_BOX (content), widget, TRUE, TRUE, 0);
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ if (response == GTK_RESPONSE_YES)
+ {
+ empathy_local_xmpp_assistant_widget_create_account (
+ EMPATHY_LOCAL_XMPP_ASSISTANT_WIDGET (widget));
+ }
+
+ gtk_widget_destroy (dialog);
+}
+
+static void
+import_dialog_response_cb (GtkDialog *dialog,
+ gint response_id,
+ EmpathyAccountsDialog *self)
+{
+ maybe_show_salut_dialog (self);
+}
+
static void
maybe_show_import_dialog (EmpathyAccountsDialog *self)
{
EmpathyAccountsDialogPriv *priv = GET_PRIV (self);
+ GtkWidget *dialog;
if (empathy_accounts_has_non_salut_accounts (priv->account_manager))
return;
if (!empathy_import_accounts_to_import ())
- return;
+ {
+ maybe_show_salut_dialog (self);
+ return;
+ }
+
+ dialog = display_import_dialog (self);
- display_import_dialog (self);
+ tp_g_signal_connect_object (dialog, "response",
+ G_CALLBACK (import_dialog_response_cb), self, 0);
}
static void
dialog);
/* Add existing accounts */
- accounts = tp_account_manager_get_valid_accounts (priv->account_manager);
+ accounts = tp_account_manager_dup_valid_accounts (priv->account_manager);
for (l = accounts; l; l = l->next)
{
accounts_dialog_add_account (dialog, l->data);
}
- g_list_free (accounts);
+ g_list_free_full (accounts, g_object_unref);
priv->cms = empathy_connection_managers_dup_singleton ();
if (response_id == GTK_RESPONSE_HELP)
{
- empathy_url_show (widget, "ghelp:empathy?accounts-window");
+ empathy_url_show (widget, "help:empathy/accounts-window");
}
else if (response_id == GTK_RESPONSE_CLOSE ||
response_id == GTK_RESPONSE_DELETE_EVENT)
action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
-#ifdef HAVE_MEEGO
- gtk_widget_hide (action_area);
- gtk_widget_hide (priv->button_remove);
-#endif /* HAVE_MEEGO */
-
/* Display loading page */
priv->loading = TRUE;
gtk_widget_show (priv->infobar);
grid = gtk_grid_new ();
+ gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
gtk_container_add (
GTK_CONTAINER (gtk_info_bar_get_content_area (
GTK_INFO_BAR (priv->infobar))),
EmpathyAccountsDialog *dialog = EMPATHY_ACCOUNTS_DIALOG (obj);
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
+ if (priv->user_info != NULL)
+ {
+ empathy_user_info_apply_async ((EmpathyUserInfo *) priv->user_info,
+ NULL, NULL);
+ priv->user_info = NULL;
+ }
+
if (priv->connecting_id != 0)
{
g_source_remove (priv->connecting_id);
priv->connecting_id = 0;
}
+ if (priv->connectivity)
+ {
+ g_object_unref (priv->connectivity);
+ priv->connectivity = NULL;
+ }
+
if (priv->account_manager != NULL)
{
g_object_unref (priv->account_manager);
priv->cms = NULL;
}
- if (priv->connectivity)
- {
- g_object_unref (priv->connectivity);
- priv->connectivity = NULL;
- }
-
if (priv->initial_selection != NULL)
{
g_object_unref (priv->initial_selection);
priv->initial_selection = NULL;
}
+ tp_clear_pointer (&priv->icons_cache, g_hash_table_unref);
+
G_OBJECT_CLASS (empathy_accounts_dialog_parent_class)->dispose (obj);
}
tp_proxy_prepare_async (priv->account_manager, NULL,
accounts_dialog_manager_ready_cb, dialog);
- priv->connectivity = empathy_connectivity_dup_singleton ();
+ priv->connectivity = g_network_monitor_get_default ();
+ g_object_ref (priv->connectivity);
}
static void
EMPATHY_TYPE_ACCOUNTS_DIALOG,
EmpathyAccountsDialogPriv);
dialog->priv = priv;
+
+ priv->icons_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
+ g_free, g_object_unref);
}
/* public methods */
return GTK_WIDGET (dialog);
}
-void
-empathy_accounts_dialog_show_application (GdkScreen *screen,
- TpAccount *selected_account,
+#ifdef HAVE_UOA
+typedef struct
+{
+ TpAccount *account;
+ gboolean if_needed;
+} LaunchUOACtx;
+
+static LaunchUOACtx *
+launch_uoa_ctx_new (TpAccount *account,
+ gboolean if_needed)
+{
+ LaunchUOACtx *ctx;
+
+ ctx = g_slice_new0 (LaunchUOACtx);
+ if (account != NULL)
+ ctx->account = g_object_ref (account);
+ ctx->if_needed = if_needed;
+
+ return ctx;
+}
+
+static void
+launch_uoa_ctx_free (LaunchUOACtx *ctx)
+{
+ g_clear_object (&ctx->account);
+ g_slice_free (LaunchUOACtx, ctx);
+}
+
+static void
+am_prepare_cb (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ TpAccountManager *manager = TP_ACCOUNT_MANAGER (source);
+ GError *error = NULL;
+ LaunchUOACtx *ctx = user_data;
+ gchar *args = NULL;
+
+ if (!tp_proxy_prepare_finish (manager, result, &error))
+ {
+ DEBUG ("Failed to prepare account manager: %s", error->message);
+ g_error_free (error);
+ goto out;
+ }
+
+ if (ctx->if_needed && empathy_accounts_has_non_salut_accounts (manager))
+ goto out;
+
+ if (ctx->account != NULL)
+ {
+ const GValue *value;
+
+ value = tp_account_get_storage_identifier (ctx->account);
+
+ if (G_VALUE_HOLDS_UINT (value))
+ args = g_strdup_printf ("account-details=%u", g_value_get_uint (value));
+ }
+
+ empathy_launch_external_app ("gnome-credentials-panel.desktop", args, NULL);
+
+ g_free (args);
+out:
+ launch_uoa_ctx_free (ctx);
+}
+
+static void
+launch_uoa_panel (TpAccount *selected_account,
+ gboolean if_needed,
+ gboolean hidden)
+{
+ TpAccountManager *manager;
+
+ if (hidden)
+ /* Nothing to do */
+ return;
+
+ manager = tp_account_manager_dup ();
+
+ tp_proxy_prepare_async (manager, NULL, am_prepare_cb,
+ launch_uoa_ctx_new (selected_account, if_needed));
+
+ g_object_unref (manager);
+}
+
+#else /* HAVE_UOA */
+
+static void
+launch_empathy_accounts (TpAccount *selected_account,
gboolean if_needed,
gboolean hidden)
{
g_string_free (args, TRUE);
}
+#endif /* HAVE_UOA */
+
+void
+empathy_accounts_dialog_show_application (GdkScreen *screen,
+ TpAccount *selected_account,
+ gboolean if_needed,
+ gboolean hidden)
+{
+#ifdef HAVE_UOA
+ launch_uoa_panel (selected_account, if_needed, hidden);
+#else
+ launch_empathy_accounts (selected_account, if_needed, hidden);
+#endif
+}
gboolean
empathy_accounts_dialog_is_creating (EmpathyAccountsDialog *dialog)
EmpathyAccountsDialogPriv *priv = GET_PRIV (dialog);
gboolean result = FALSE;
- if (priv->setting_widget_object == NULL)
+ if (priv->setting_widget == NULL)
goto out;
- g_object_get (priv->setting_widget_object,
+ g_object_get (priv->setting_widget,
"creating-account", &result, NULL);
out: