]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-group-chat.c
Completely reworked ContactList API. Fixes bug #471611, bug #467280, bug #459540...
[empathy.git] / libempathy-gtk / empathy-group-chat.c
index 623547d9b362e45df890263db851d86e770b21dd..48439302d30cd8725d044a5a9dbf5999e6cae1a3 100644 (file)
@@ -75,39 +75,37 @@ struct _EmpathyGroupChatPriv {
 };
 
 static void          group_chat_finalize                 (GObject           *object);
-static void          group_chat_create_ui                (EmpathyGroupChat   *chat);
+static void          group_chat_create_ui                (EmpathyGroupChat  *chat);
 static void          group_chat_widget_destroy_cb        (GtkWidget         *widget,
-                                                         EmpathyGroupChat   *chat);
-static void          group_chat_contact_added_cb         (EmpathyTpChatroom *tp_chat,
-                                                         EmpathyContact     *contact,
-                                                         EmpathyGroupChat   *chat);
-static void          group_chat_contact_removed_cb       (EmpathyTpChatroom *tp_chat,
-                                                         EmpathyContact     *contact,
-                                                         EmpathyGroupChat   *chat);
-/*static void          group_chat_topic_changed_cb         (EmpathyTpChatroom *tp_chat,
-                                                         const gchar       *new_topic,
-                                                         EmpathyGroupChat   *chat);*/
+                                                         EmpathyGroupChat  *chat);
+static void          group_chat_members_changed_cb       (EmpathyTpChatroom *tp_chat,
+                                                         EmpathyContact    *contact,
+                                                         EmpathyContact    *actor,
+                                                         guint              reason,
+                                                         gchar             *message,
+                                                         gboolean           is_member,
+                                                         EmpathyGroupChat  *chat);
 static void          group_chat_topic_entry_activate_cb  (GtkWidget         *entry,
                                                          GtkDialog         *dialog);
 static void          group_chat_topic_response_cb        (GtkWidget         *dialog,
                                                          gint               response,                        
-                                                         EmpathyGroupChat   *chat);
-static const gchar * group_chat_get_name                 (EmpathyChat        *chat);
-static gchar *       group_chat_get_tooltip              (EmpathyChat        *chat);
-static const gchar * group_chat_get_status_icon_name     (EmpathyChat        *chat);
-static GtkWidget *   group_chat_get_widget               (EmpathyChat        *chat);
-static gboolean      group_chat_is_group_chat            (EmpathyChat        *chat);
-static void          group_chat_set_tp_chat              (EmpathyChat        *chat,
+                                                         EmpathyGroupChat  *chat);
+static const gchar * group_chat_get_name                 (EmpathyChat       *chat);
+static gchar *       group_chat_get_tooltip              (EmpathyChat       *chat);
+static const gchar * group_chat_get_status_icon_name     (EmpathyChat       *chat);
+static GtkWidget *   group_chat_get_widget               (EmpathyChat       *chat);
+static gboolean      group_chat_is_group_chat            (EmpathyChat       *chat);
+static void          group_chat_set_tp_chat              (EmpathyChat       *chat,
                                                          EmpathyTpChat     *tp_chat);
 static void          group_chat_subject_notify_cb        (EmpathyTpChat     *tp_chat,
                                                          GParamSpec        *param,
-                                                         EmpathyGroupChat   *chat);
+                                                         EmpathyGroupChat  *chat);
 static void          group_chat_name_notify_cb           (EmpathyTpChat     *tp_chat,
                                                          GParamSpec        *param,
-                                                         EmpathyGroupChat   *chat);
+                                                         EmpathyGroupChat  *chat);
 /*static gboolean      group_chat_key_press_event          (GtkWidget         *widget,
                                                          GdkEventKey       *event,
-                                                         EmpathyGroupChat   *chat);*/
+                                                         EmpathyGroupChat  *chat);*/
 static gint          group_chat_contacts_completion_func (const gchar       *s1,
                                                          const gchar       *s2,
                                                          gsize              n);
@@ -173,7 +171,7 @@ group_chat_finalize (GObject *object)
 
 EmpathyGroupChat *
 empathy_group_chat_new (McAccount *account,
-                      TpChan    *tp_chan)
+                       TpChan    *tp_chan)
 {
        EmpathyGroupChat     *chat;
        EmpathyGroupChatPriv *priv;
@@ -351,33 +349,26 @@ group_chat_widget_destroy_cb (GtkWidget       *widget,
 }
 
 static void
-group_chat_contact_added_cb (EmpathyTpChatroom *tp_chat,
-                            EmpathyContact     *contact,
-                            EmpathyGroupChat   *chat)
-{
-       EmpathyGroupChatPriv *priv;
-       gchar               *str;
-
-       priv = GET_PRIV (chat);
-
-       str = g_strdup_printf (_("%s has joined the room"),
-                              empathy_contact_get_name (contact));
-       empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str);
-       g_free (str);
-}
-
-static void
-group_chat_contact_removed_cb (EmpathyTpChatroom *tp_chat,
+group_chat_members_changed_cb (EmpathyTpChatroom *tp_chat,
                               EmpathyContact     *contact,
+                              EmpathyContact     *actor,
+                              guint               reason,
+                              gchar              *message,
+                              gboolean            is_member,
                               EmpathyGroupChat   *chat)
 {
        EmpathyGroupChatPriv *priv;
-       gchar               *str;
+       gchar                *str;
 
        priv = GET_PRIV (chat);
 
-       str = g_strdup_printf (_("%s has left the room"),
-                              empathy_contact_get_name (contact));
+       if (is_member) {
+               str = g_strdup_printf (_("%s has joined the room"),
+                                      empathy_contact_get_name (contact));
+       } else {
+               str = g_strdup_printf (_("%s has left the room"),
+                                      empathy_contact_get_name (contact));
+       }
        empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str);
        g_free (str);
 }
@@ -543,11 +534,8 @@ group_chat_set_tp_chat (EmpathyChat    *chat,
        gtk_widget_show (GTK_WIDGET (priv->view));
 
        /* Connect signals */
-       g_signal_connect (priv->tp_chat, "contact-added",
-                         G_CALLBACK (group_chat_contact_added_cb),
-                         chat);
-       g_signal_connect (priv->tp_chat, "contact-removed",
-                         G_CALLBACK (group_chat_contact_removed_cb),
+       g_signal_connect (priv->tp_chat, "members-changed",
+                         G_CALLBACK (group_chat_members_changed_cb),
                          chat);
        g_signal_connect (priv->tp_chat, "notify::subject",
                          G_CALLBACK (group_chat_subject_notify_cb),
@@ -563,16 +551,25 @@ group_chat_subject_notify_cb (EmpathyTpChat   *tp_chat,
                              EmpathyGroupChat *chat)
 {
        EmpathyGroupChatPriv *priv;
-       gchar               *str;
+       gchar                *str = NULL;
 
        priv = GET_PRIV (chat);
 
-       g_free (priv->topic);
+       g_object_get (priv->tp_chat, "subject", &str, NULL);
+       if (!empathy_strdiff (priv->topic, str)) {
+               g_free (str);
+               return;
+       }
 
-       g_object_get (priv->tp_chat, "subject", &priv->topic, NULL);
+       g_free (priv->topic);
+       priv->topic = str;
        gtk_label_set_text (GTK_LABEL (priv->label_topic), priv->topic);
 
-       str = g_strdup_printf (_("Topic set to: %s"), priv->topic);
+       if (!G_STR_EMPTY (priv->topic)) {
+               str = g_strdup_printf (_("Topic set to: %s"), priv->topic);
+       } else {
+               str = g_strdup (_("No topic defined"));
+       }
        empathy_chat_view_append_event (EMPATHY_CHAT (chat)->view, str);
        g_free (str);
 }