]> git.0d.be Git - empathy.git/commitdiff
Merge branch 'gnome-3-6'
authorGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 8 Jan 2013 11:38:01 +0000 (12:38 +0100)
committerGuillaume Desmottes <guillaume.desmottes@collabora.co.uk>
Tue, 8 Jan 2013 11:38:01 +0000 (12:38 +0100)
1  2 
src/empathy-roster-window.c

index a92b945f9a5cde50ab76e5d1d927abdffc749bce,34c2c29526da68d5727a7548c89696793c062452..38adf45faa3bd5ba1e0e014ed734ea508a2ac68e
@@@ -125,8 -125,6 +125,8 @@@ struct _EmpathyRosterWindowPriv 
    GtkWidget *no_entry_label;
    GtkWidget *button_account_settings;
    GtkWidget *button_online;
 +  GtkWidget *button_show_offline;
 +  GtkWidget *button_add_contact;
    GtkWidget *spinner_loading;
    GtkWidget *tooltip_widget;
  
@@@ -395,56 -393,14 +395,56 @@@ button_online_clicked_cb (GtkButton *bu
    g_object_unref (mgr);
  }
  
 +static void
 +button_show_offline_clicked_cb (GtkButton *button,
 +    EmpathyRosterWindow *self)
 +{
 +  g_settings_set_boolean (self->priv->gsettings_ui,
 +      EMPATHY_PREFS_UI_SHOW_OFFLINE, TRUE);
 +}
 +
 +static void
 +button_add_contact_clicked_cb (GtkButton *button,
 +    EmpathyRosterWindow *self)
 +{
 +  empathy_new_individual_dialog_show (GTK_WINDOW (self));
 +}
 +
  typedef enum
  {
    PAGE_MESSAGE_FLAG_NONE = 0,
    PAGE_MESSAGE_FLAG_ACCOUNTS = 1 << 0,
    PAGE_MESSAGE_FLAG_SPINNER = 1 << 2,
    PAGE_MESSAGE_FLAG_ONLINE = 1 << 3,
 +  PAGE_MESSAGE_FLAG_SHOW_OFFLINE = 1 << 4,
 +  PAGE_MESSAGE_FLAG_ADD_CONTACT = 1 << 5,
  } PageMessageFlags;
  
 +static gboolean
 +can_add_contact (EmpathyRosterWindow *self)
 +{
 +  GList *accounts, *l;
 +  gboolean result = FALSE;
 +
 +  accounts = tp_account_manager_dup_valid_accounts (
 +      self->priv->account_manager);
 +  for (l = accounts; l != NULL && !result; l = g_list_next (l))
 +    {
 +      TpAccount *account = TP_ACCOUNT (l->data);
 +      TpConnection *conn;
 +
 +      conn = tp_account_get_connection (account);
 +      if (conn == NULL)
 +        continue;
 +
 +      if (tp_connection_get_can_change_contact_list (conn))
 +        result = TRUE;
 +    }
 +
 +  g_list_free_full (accounts, g_object_unref);
 +  return result;
 +}
 +
  static void
  display_page_message (EmpathyRosterWindow *self,
      const gchar *msg,
        (flags & PAGE_MESSAGE_FLAG_SPINNER) != 0);
    gtk_widget_set_visible (self->priv->button_online,
        (flags & PAGE_MESSAGE_FLAG_ONLINE) != 0);
 +  gtk_widget_set_visible (self->priv->button_show_offline,
 +      (flags & PAGE_MESSAGE_FLAG_SHOW_OFFLINE) != 0);
 +  gtk_widget_set_visible (self->priv->button_add_contact,
 +      (flags & PAGE_MESSAGE_FLAG_ADD_CONTACT) != 0);
 +
 +  if ((flags & PAGE_MESSAGE_FLAG_ADD_CONTACT) != 0)
 +    gtk_widget_set_sensitive (self->priv->button_add_contact,
 +        can_add_contact (self));
  
    gtk_notebook_set_current_page (GTK_NOTEBOOK (self->priv->notebook),
        PAGE_MESSAGE);
@@@ -611,6 -559,7 +611,7 @@@ roster_window_error_create_info_bar (Em
    label = gtk_label_new (message_markup);
    gtk_label_set_use_markup (GTK_LABEL (label), TRUE);
    gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+   gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
    gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
    gtk_widget_show (label);
  
@@@ -656,54 -605,6 +657,54 @@@ roster_window_error_add_stock_button (G
    gtk_info_bar_add_action_widget (info_bar, button, response_id);
  }
  
 +#ifdef HAVE_UOA
 +static const gchar *
 +uoa_account_display_string (TpAccount *account)
 +{
 +  const gchar *service;
 +
 +  service = tp_account_get_service (account);
 +
 +  /* Use well known service name, if available */
 +  if (!tp_strdiff (service, "windows-live"))
 +    return _("Windows Live");
 +  else if (!tp_strdiff (service, "google-talk"))
 +    return _("Google Talk");
 +  else if (!tp_strdiff (service, "facebook"))
 +    return _("Facebook");
 +
 +  return tp_account_get_display_name (account);
 +}
 +
 +static void
 +roster_window_uoa_auth_error (EmpathyRosterWindow *self,
 +    TpAccount *account)
 +{
 +  GtkWidget *info_bar;
 +  GtkWidget *image;
 +  GtkWidget *button;
 +  gchar *str;
 +
 +  /* translators: %s is an account name like 'Facebook' or 'Google Talk' */
 +  str = g_strdup_printf (_("%s account requires authorisation"),
 +      uoa_account_display_string (account));
 +
 +  info_bar = roster_window_error_create_info_bar (self, account,
 +      GTK_MESSAGE_OTHER, str);
 +  g_free (str);
 +
 +  image = gtk_image_new_from_icon_name ("credentials-preferences",
 +      GTK_ICON_SIZE_BUTTON);
 +  button = gtk_button_new ();
 +  gtk_button_set_image (GTK_BUTTON (button), image);
 +  gtk_widget_set_tooltip_text (button, _("Online Accounts"));
 +  gtk_widget_show (button);
 +
 +  gtk_info_bar_add_action_widget (GTK_INFO_BAR (info_bar), button,
 +      ERROR_RESPONSE_EDIT);
 +}
 +#endif
 +
  static void
  roster_window_error_display (EmpathyRosterWindow *self,
      TpAccount *account)
    if (user_requested)
      return;
  
 +#ifdef HAVE_UOA
 +  if (!tp_strdiff (TP_ERROR_STR_AUTHENTICATION_FAILED,
 +       tp_account_get_detailed_error (account, NULL)) &&
 +      !tp_strdiff (tp_account_get_storage_provider (account),
 +       EMPATHY_UOA_PROVIDER))
 +    {
 +      roster_window_uoa_auth_error (self, account);
 +      return;
 +    }
 +#endif
 +
    str = g_markup_printf_escaped ("<b>%s</b>\n%s",
        tp_account_get_display_name (account), error_message);
  
@@@ -767,7 -657,6 +768,7 @@@ roster_window_update_status (EmpathyRos
  {
    gboolean connected, connecting;
    GList *l;
 +  GAction *action;
  
    connected = empathy_account_manager_get_accounts_connected (&connecting);
  
    /* Update widgets sensibility */
    for (l = self->priv->actions_connected; l; l = l->next)
      g_simple_action_set_enabled (l->data, connected);
 +
 +  action = g_action_map_lookup_action (G_ACTION_MAP (self), "chat_add_contact");
 +  if (!can_add_contact (self))
 +    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
  }
  
  static void
@@@ -1047,17 -932,13 +1048,17 @@@ empathy_roster_window_finalize (GObjec
  static gboolean
  roster_window_key_press_event_cb  (GtkWidget *window,
      GdkEventKey *event,
 -    gpointer user_data)
 +    EmpathyRosterWindow *self)
  {
    if (event->keyval == GDK_KEY_T
        && event->state & GDK_SHIFT_MASK
        && event->state & GDK_CONTROL_MASK)
      empathy_chat_manager_call_undo_closed_chat ();
  
 +  if (event->keyval == GDK_KEY_f
 +      && event->state & GDK_CONTROL_MASK)
 +    gtk_widget_show (self->priv->search_bar);
 +
    return FALSE;
  }
  
@@@ -1686,13 -1567,8 +1687,13 @@@ set_notebook_page (EmpathyRosterWindow 
          }
        else
          {
 -          display_page_message (self, _("No online contacts"),
 -              PAGE_MESSAGE_FLAG_NONE);
 +          if (g_settings_get_boolean (self->priv->gsettings_ui,
 +                EMPATHY_PREFS_UI_SHOW_OFFLINE))
 +            display_page_message (self, _("You haven't added any contact yet"),
 +                PAGE_MESSAGE_FLAG_ADD_CONTACT);
 +          else
 +            display_page_message (self, _("No online contacts"),
 +                PAGE_MESSAGE_FLAG_SHOW_OFFLINE);
          }
        goto out;
      }
@@@ -2210,14 -2086,6 +2211,14 @@@ roster_window_most_available_presence_c
    set_notebook_page (self);
  }
  
 +static void
 +show_offline_changed_cb (GSettings *settings,
 +    const gchar *key,
 +    EmpathyRosterWindow *self)
 +{
 +  set_notebook_page (self);
 +}
 +
  static void
  empathy_roster_window_init (EmpathyRosterWindow *self)
  {
        "roster_scrolledwindow", &sw,
        "button_account_settings", &self->priv->button_account_settings,
        "button_online", &self->priv->button_online,
 +      "button_show_offline", &self->priv->button_show_offline,
 +      "button_add_contact", &self->priv->button_add_contact,
        "spinner_loading", &self->priv->spinner_loading,
        NULL);
    g_free (filename);
    gtk_widget_show (self->priv->main_vbox);
  
    g_signal_connect (self, "key-press-event",
 -      G_CALLBACK (roster_window_key_press_event_cb), NULL);
 +      G_CALLBACK (roster_window_key_press_event_cb), self);
  
    g_object_unref (gui);
  
    g_settings_bind (self->priv->gsettings_ui, EMPATHY_PREFS_UI_SHOW_OFFLINE,
        self->priv->view, "show-offline",
        G_SETTINGS_BIND_GET);
 +  tp_g_signal_connect_object (self->priv->gsettings_ui,
 +      "changed::" EMPATHY_PREFS_UI_SHOW_OFFLINE,
 +      G_CALLBACK (show_offline_changed_cb), self, 0);
    g_settings_bind (self->priv->gsettings_ui, EMPATHY_PREFS_UI_SHOW_GROUPS,
        self->priv->view, "show-groups",
        G_SETTINGS_BIND_GET);
        G_CALLBACK (button_account_settings_clicked_cb), self);
    g_signal_connect (self->priv->button_online, "clicked",
        G_CALLBACK (button_online_clicked_cb), self);
 +  g_signal_connect (self->priv->button_show_offline, "clicked",
 +      G_CALLBACK (button_show_offline_clicked_cb), self);
 +  g_signal_connect (self->priv->button_add_contact, "clicked",
 +      G_CALLBACK (button_add_contact_clicked_cb), self);
  }
  
  GtkWidget *