aboutsummaryrefslogtreecommitdiffstats
path: root/libempathy-gtk
diff options
context:
space:
mode:
authorXavier Claessens <xclaesse@src.gnome.org>2007-08-31 00:49:52 +0800
committerXavier Claessens <xclaesse@src.gnome.org>2007-08-31 00:49:52 +0800
commit0b0bb0f621d8e1cda1508d9062a279459fc3b955 (patch)
tree03ad0e8b2180f5e3d6821fbab6315b33c7baf4d8 /libempathy-gtk
parent3a535643a694d0dd1bed8e0b7a2fd6fd21e6ee0c (diff)
downloadgsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar.gz
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar.bz2
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar.lz
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar.xz
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.tar.zst
gsoc2013-empathy-0b0bb0f621d8e1cda1508d9062a279459fc3b955.zip
Completely reworked ContactList API. Fixes bug #471611, bug #467280, bug #459540 and bug #462907.
svn path=/trunk/; revision=280
Diffstat (limited to 'libempathy-gtk')
-rw-r--r--libempathy-gtk/empathy-chat-window.c35
-rw-r--r--libempathy-gtk/empathy-contact-dialogs.c12
-rw-r--r--libempathy-gtk/empathy-contact-list-store.c373
-rw-r--r--libempathy-gtk/empathy-contact-list-store.h5
-rw-r--r--libempathy-gtk/empathy-contact-list-view.c346
-rw-r--r--libempathy-gtk/empathy-contact-list-view.h25
-rw-r--r--libempathy-gtk/empathy-contact-widget.c114
-rw-r--r--libempathy-gtk/empathy-group-chat.c49
-rw-r--r--libempathy-gtk/empathy-images.h2
-rw-r--r--libempathy-gtk/empathy-main-window.c1
-rw-r--r--libempathy-gtk/empathy-private-chat.c40
-rw-r--r--libempathy-gtk/empathy-status-icon.c49
-rw-r--r--libempathy-gtk/empathy-ui-utils.c10
13 files changed, 386 insertions, 675 deletions
diff --git a/libempathy-gtk/empathy-chat-window.c b/libempathy-gtk/empathy-chat-window.c
index 7d48abf8a..c1df38b15 100644
--- a/libempathy-gtk/empathy-chat-window.c
+++ b/libempathy-gtk/empathy-chat-window.c
@@ -34,7 +34,7 @@
#include <glade/glade.h>
#include <glib/gi18n.h>
-#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-contact-factory.h>
#include <libempathy/empathy-contact-list.h>
#include <libempathy/empathy-log-manager.h>
#include <libempathy/empathy-chatroom-manager.h>
@@ -823,17 +823,20 @@ chat_window_update_menu (EmpathyChatWindow *window)
window);
} else {
EmpathyPrivateChat *chat;
- EmpathySubscription subscription;
EmpathyContact *contact;
+ EmpathyPresence *presence;
chat = EMPATHY_PRIVATE_CHAT (priv->current_chat);
/* Show / Hide widgets */
gtk_widget_hide (priv->menu_room);
+ /* presence==NULL means this contact refuses to send us his
+ * presence. By adding the contact we ask the contact to accept
+ * to send his presence. */
contact = empathy_private_chat_get_contact (chat);
- subscription = empathy_contact_get_subscription (contact);
- if (!(subscription & EMPATHY_SUBSCRIPTION_FROM)) {
+ presence = empathy_contact_get_presence (contact);
+ if (!presence) {
gtk_widget_show (priv->menu_conv_add_contact);
} else {
gtk_widget_hide (priv->menu_conv_add_contact);
@@ -1583,12 +1586,13 @@ chat_window_drag_data_received (GtkWidget *widget,
{
/* FIXME: DnD of contact do not seems to work... */
if (info == DND_DRAG_TYPE_CONTACT_ID) {
- EmpathyContactManager *manager;
- EmpathyContact *contact;
- EmpathyChat *chat;
- EmpathyChatWindow *old_window;
+ EmpathyContactFactory *factory;
+ EmpathyContact *contact = NULL;
+ EmpathyChat *chat;
+ EmpathyChatWindow *old_window;
McAccount *account;
const gchar *id = NULL;
+ gchar **strv;
if (selection) {
id = (const gchar*) selection->data;
@@ -1596,9 +1600,18 @@ chat_window_drag_data_received (GtkWidget *widget,
empathy_debug (DEBUG_DOMAIN, "DND contact from roster with id:'%s'", id);
- manager = empathy_contact_manager_new ();
- contact = empathy_contact_list_find (EMPATHY_CONTACT_LIST (manager), id);
- g_object_unref (manager);
+ strv = g_strsplit (id, "/", 2);
+ factory = empathy_contact_factory_new ();
+ account = mc_account_lookup (strv[0]);
+ if (account) {
+ contact = empathy_contact_factory_get_from_id (factory,
+ account,
+ strv[1]);
+ g_object_unref (account);
+ }
+ g_object_unref (factory);
+ g_object_unref (account);
+ g_strfreev (strv);
if (!contact) {
empathy_debug (DEBUG_DOMAIN, "DND contact from roster not found");
diff --git a/libempathy-gtk/empathy-contact-dialogs.c b/libempathy-gtk/empathy-contact-dialogs.c
index 437e255fa..553f85bcc 100644
--- a/libempathy-gtk/empathy-contact-dialogs.c
+++ b/libempathy-gtk/empathy-contact-dialogs.c
@@ -42,7 +42,7 @@ static GtkWidget *new_contact_dialog = NULL;
static gint
-contact_dialogs_find (GtkDialog *dialog,
+contact_dialogs_find (GtkDialog *dialog,
EmpathyContact *contact)
{
GtkWidget *contact_widget;
@@ -64,18 +64,18 @@ subscription_dialog_response_cb (GtkDialog *dialog,
GtkWidget *contact_widget)
{
EmpathyContactManager *manager;
- EmpathyContact *contact;
+ EmpathyContact *contact;
manager = empathy_contact_manager_new ();
contact = empathy_contact_widget_get_contact (contact_widget);
if (response == GTK_RESPONSE_YES) {
- empathy_contact_list_process_pending (EMPATHY_CONTACT_LIST (manager),
- contact, TRUE);
+ empathy_contact_list_add (EMPATHY_CONTACT_LIST (manager),
+ contact, "");
}
else if (response == GTK_RESPONSE_NO) {
- empathy_contact_list_process_pending (EMPATHY_CONTACT_LIST (manager),
- contact, FALSE);
+ empathy_contact_list_remove (EMPATHY_CONTACT_LIST (manager),
+ contact, "");
}
subscription_dialogs = g_list_remove (subscription_dialogs, dialog);
diff --git a/libempathy-gtk/empathy-contact-list-store.c b/libempathy-gtk/empathy-contact-list-store.c
index ac2fa62cd..9cf03bfe8 100644
--- a/libempathy-gtk/empathy-contact-list-store.c
+++ b/libempathy-gtk/empathy-contact-list-store.c
@@ -57,10 +57,10 @@ struct _EmpathyContactListStorePriv {
gboolean show_avatars;
gboolean is_compact;
gboolean show_active;
- EmpathyContactListStoreSort sort_criterium;
+ EmpathyContactListStoreSort sort_criterium;
guint inhibit_active;
- EmpathyContactGroupsFunc get_contact_groups;
+ EmpathyContactGroupsFunc get_contact_groups;
gpointer get_contact_groups_data;
};
@@ -84,71 +84,74 @@ typedef struct {
static void empathy_contact_list_store_class_init (EmpathyContactListStoreClass *klass);
static void empathy_contact_list_store_init (EmpathyContactListStore *list);
-static void contact_list_store_finalize (GObject *object);
-static void contact_list_store_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void contact_list_store_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void contact_list_store_setup (EmpathyContactListStore *store);
-static gboolean contact_list_store_inibit_active_cb (EmpathyContactListStore *store);
-static void contact_list_store_contact_added_cb (EmpathyContactList *list_iface,
- EmpathyContact *contact,
- EmpathyContactListStore *store);
-static void contact_list_store_add_contact (EmpathyContactListStore *store,
- EmpathyContact *contact);
-static void contact_list_store_contact_removed_cb (EmpathyContactList *list_iface,
- EmpathyContact *contact,
- EmpathyContactListStore *store);
-static void contact_list_store_remove_contact (EmpathyContactListStore *store,
- EmpathyContact *contact);
-static void contact_list_store_contact_update (EmpathyContactListStore *store,
- EmpathyContact *contact);
-static void contact_list_store_contact_groups_updated_cb (EmpathyContact *contact,
- GParamSpec *param,
- EmpathyContactListStore *store);
-static void contact_list_store_contact_updated_cb (EmpathyContact *contact,
- GParamSpec *param,
- EmpathyContactListStore *store);
-static void contact_list_store_contact_set_active (EmpathyContactListStore *store,
- EmpathyContact *contact,
- gboolean active,
- gboolean set_changed);
-static ShowActiveData * contact_list_store_contact_active_new (EmpathyContactListStore *store,
- EmpathyContact *contact,
- gboolean remove);
-static void contact_list_store_contact_active_free (ShowActiveData *data);
-static gboolean contact_list_store_contact_active_cb (ShowActiveData *data);
-static gboolean contact_list_store_get_group_foreach (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- FindGroup *fg);
-static void contact_list_store_get_group (EmpathyContactListStore *store,
- const gchar *name,
- GtkTreeIter *iter_group_to_set,
- GtkTreeIter *iter_separator_to_set,
- gboolean *created);
-static gint contact_list_store_state_sort_func (GtkTreeModel *model,
- GtkTreeIter *iter_a,
- GtkTreeIter *iter_b,
- gpointer user_data);
-static gint contact_list_store_name_sort_func (GtkTreeModel *model,
- GtkTreeIter *iter_a,
- GtkTreeIter *iter_b,
- gpointer user_data);
-static gboolean contact_list_store_find_contact_foreach (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- FindContact *fc);
-static GList * contact_list_store_find_contact (EmpathyContactListStore *store,
- EmpathyContact *contact);
-static gboolean contact_list_store_update_list_mode_foreach (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- EmpathyContactListStore *store);
+static void contact_list_store_finalize (GObject *object);
+static void contact_list_store_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void contact_list_store_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+static void contact_list_store_setup (EmpathyContactListStore *store);
+static gboolean contact_list_store_inibit_active_cb (EmpathyContactListStore *store);
+static void contact_list_store_members_changed_cb (EmpathyContactList *list_iface,
+ EmpathyContact *contact,
+ EmpathyContact *actor,
+ guint reason,
+ gchar *message,
+ gboolean is_member,
+ EmpathyContactListStore *store);
+static void contact_list_store_groups_changed_cb (EmpathyContactList *list_iface,
+ EmpathyContact *contact,
+ gchar *group,
+ gboolean is_member,
+ EmpathyContactListStore *store);
+static void contact_list_store_add_contact (EmpathyContactListStore *store,
+ EmpathyContact *contact);
+static void contact_list_store_remove_contact (EmpathyContactListStore *store,
+ EmpathyContact *contact);
+static void contact_list_store_contact_update (EmpathyContactListStore *store,
+ EmpathyContact *contact);
+static void contact_list_store_contact_updated_cb (EmpathyContact *contact,
+ GParamSpec *param,
+ EmpathyContactListStore *store);
+static void contact_list_store_contact_set_active (EmpathyContactListStore *store,
+ EmpathyContact *contact,
+ gboolean active,
+ gboolean set_changed);
+static ShowActiveData * contact_list_store_contact_active_new (EmpathyContactListStore *store,
+ EmpathyContact *contact,
+ gboolean remove);
+static void contact_list_store_contact_active_free (ShowActiveData *data);
+static gboolean contact_list_store_contact_active_cb (ShowActiveData *data);
+static gboolean contact_list_store_get_group_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ FindGroup *fg);
+static void contact_list_store_get_group (EmpathyContactListStore *store,
+ const gchar *name,
+ GtkTreeIter *iter_group_to_set,
+ GtkTreeIter *iter_separator_to_set,
+ gboolean *created);
+static gint contact_list_store_state_sort_func (GtkTreeModel *model,
+ GtkTreeIter *iter_a,
+ GtkTreeIter *iter_b,
+ gpointer user_data);
+static gint contact_list_store_name_sort_func (GtkTreeModel *model,
+ GtkTreeIter *iter_a,
+ GtkTreeIter *iter_b,
+ gpointer user_data);
+static gboolean contact_list_store_find_contact_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ FindContact *fc);
+static GList * contact_list_store_find_contact (EmpathyContactListStore *store,
+ EmpathyContact *contact);
+static gboolean contact_list_store_update_list_mode_foreach (GtkTreeModel *model,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ EmpathyContactListStore *store);
enum {
PROP_0,
@@ -317,24 +320,23 @@ empathy_contact_list_store_new (EmpathyContactList *list_iface)
/* Signal connection. */
g_signal_connect (priv->list,
- "contact-added",
- G_CALLBACK (contact_list_store_contact_added_cb),
+ "members-changed",
+ G_CALLBACK (contact_list_store_members_changed_cb),
store);
g_signal_connect (priv->list,
- "contact-removed",
- G_CALLBACK (contact_list_store_contact_removed_cb),
+ "groups-changed",
+ G_CALLBACK (contact_list_store_groups_changed_cb),
store);
/* Add contacts already created. */
contacts = empathy_contact_list_get_members (priv->list);
for (l = contacts; l; l = l->next) {
- EmpathyContact *contact;
+ contact_list_store_members_changed_cb (priv->list, l->data,
+ NULL, 0, NULL,
+ TRUE,
+ store);
- contact = l->data;
-
- contact_list_store_contact_added_cb (priv->list, contact, store);
-
- g_object_unref (contact);
+ g_object_unref (l->data);
}
g_list_free (contacts);
@@ -385,13 +387,9 @@ empathy_contact_list_store_set_show_offline (EmpathyContactListStore *store,
contacts = empathy_contact_list_get_members (priv->list);
for (l = contacts; l; l = l->next) {
- EmpathyContact *contact;
-
- contact = EMPATHY_CONTACT (l->data);
-
- contact_list_store_contact_update (store, contact);
+ contact_list_store_contact_update (store, l->data);
- g_object_unref (contact);
+ g_object_unref (l->data);
}
g_list_free (contacts);
@@ -611,80 +609,6 @@ empathy_contact_list_store_search_equal_func (GtkTreeModel *model,
return ret;
}
-void
-empathy_contact_list_store_set_contact_groups_func (EmpathyContactListStore *store,
- EmpathyContactGroupsFunc func,
- gpointer user_data)
-{
- EmpathyContactListStorePriv *priv;
- GList *contacts, *l;
-
- g_return_if_fail (EMPATHY_IS_CONTACT_LIST_STORE (store));
-
- priv = GET_PRIV (store);
-
- if (func) {
- priv->get_contact_groups = func;
- priv->get_contact_groups_data = user_data;
- } else {
- priv->get_contact_groups = NULL;
- priv->get_contact_groups_data = NULL;
- }
-
- /* If we set a custom function to get contacts groups we have to
- * disconnect our default notify::groups signal and wait for the user
- * to call himself empathy_contact_list_store_update_contact_groups ()
- * when needed. If func is NULL we come back to default.
- */
- contacts = empathy_contact_list_get_members (priv->list);
- for (l = contacts; l; l = l->next) {
- EmpathyContact *contact;
-
- contact = l->data;
-
- if (func) {
- g_signal_handlers_disconnect_by_func (contact,
- G_CALLBACK (contact_list_store_contact_groups_updated_cb),
- store);
- } else {
- g_signal_connect (contact, "notify::groups",
- G_CALLBACK (contact_list_store_contact_groups_updated_cb),
- store);
- }
-
- empathy_contact_list_store_update_contact_groups (store, contact);
-
- g_object_unref (contact);
- }
- g_list_free (contacts);
-}
-
-void
-empathy_contact_list_store_update_contact_groups (EmpathyContactListStore *store,
- EmpathyContact *contact)
-{
- EmpathyContactListStorePriv *priv;
- gboolean show_active;
-
- g_return_if_fail (EMPATHY_IS_CONTACT_LIST_STORE (store));
- g_return_if_fail (EMPATHY_IS_CONTACT (contact));
-
- priv = GET_PRIV (store);
-
- empathy_debug (DEBUG_DOMAIN, "Contact:'%s' updating groups",
- empathy_contact_get_name (contact));
-
- /* We do this to make sure the groups are correct, if not, we
- * would have to check the groups already set up for each
- * contact and then see what has been updated.
- */
- show_active = priv->show_active;
- priv->show_active = FALSE;
- contact_list_store_remove_contact (store, contact);
- contact_list_store_add_contact (store, contact);
- priv->show_active = show_active;
-}
-
static void
contact_list_store_setup (EmpathyContactListStore *store)
{
@@ -733,37 +657,73 @@ contact_list_store_inibit_active_cb (EmpathyContactListStore *store)
}
static void
-contact_list_store_contact_added_cb (EmpathyContactList *list_iface,
- EmpathyContact *contact,
- EmpathyContactListStore *store)
+contact_list_store_members_changed_cb (EmpathyContactList *list_iface,
+ EmpathyContact *contact,
+ EmpathyContact *actor,
+ guint reason,
+ gchar *message,
+ gboolean is_member,
+ EmpathyContactListStore *store)
{
EmpathyContactListStorePriv *priv;
priv = GET_PRIV (store);
empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' added",
- empathy_contact_get_name (contact));
-
- if (!priv->get_contact_groups) {
- g_signal_connect (contact, "notify::groups",
- G_CALLBACK (contact_list_store_contact_groups_updated_cb),
+ "Contact %s (%d) %s",
+ empathy_contact_get_id (contact),
+ empathy_contact_get_handle (contact),
+ is_member ? "added" : "removed");
+
+ if (is_member) {
+ g_signal_connect (contact, "notify::presence",
+ G_CALLBACK (contact_list_store_contact_updated_cb),
+ store);
+ g_signal_connect (contact, "notify::name",
+ G_CALLBACK (contact_list_store_contact_updated_cb),
store);
+ g_signal_connect (contact, "notify::avatar",
+ G_CALLBACK (contact_list_store_contact_updated_cb),
+ store);
+ g_signal_connect (contact, "notify::type",
+ G_CALLBACK (contact_list_store_contact_updated_cb),
+ store);
+
+ contact_list_store_add_contact (store, contact);
+ } else {
+ g_signal_handlers_disconnect_by_func (contact,
+ G_CALLBACK (contact_list_store_contact_updated_cb),
+ store);
+
+ contact_list_store_remove_contact (store, contact);
}
- g_signal_connect (contact, "notify::presence",
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
- g_signal_connect (contact, "notify::name",
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
- g_signal_connect (contact, "notify::avatar",
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
- g_signal_connect (contact, "notify::type",
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
+}
+static void
+contact_list_store_groups_changed_cb (EmpathyContactList *list_iface,
+ EmpathyContact *contact,
+ gchar *group,
+ gboolean is_member,
+ EmpathyContactListStore *store)
+{
+ EmpathyContactListStorePriv *priv;
+ gboolean show_active;
+
+ priv = GET_PRIV (store);
+
+ empathy_debug (DEBUG_DOMAIN, "Updating groups for contact %s (%d)",
+ empathy_contact_get_id (contact),
+ empathy_contact_get_handle (contact));
+
+ /* We do this to make sure the groups are correct, if not, we
+ * would have to check the groups already set up for each
+ * contact and then see what has been updated.
+ */
+ show_active = priv->show_active;
+ priv->show_active = FALSE;
+ contact_list_store_remove_contact (store, contact);
contact_list_store_add_contact (store, contact);
+ priv->show_active = show_active;
}
static void
@@ -780,14 +740,9 @@ contact_list_store_add_contact (EmpathyContactListStore *store,
return;
}
- /* If no groups just add it at the top level. */
- if (priv->get_contact_groups) {
- groups = priv->get_contact_groups (contact,
- priv->get_contact_groups_data);
- } else {
- groups = empathy_contact_get_groups (contact);
- }
+ groups = empathy_contact_list_get_groups (priv->list, contact);
+ /* If no groups just add it at the top level. */
if (!groups) {
gtk_tree_store_append (GTK_TREE_STORE (store), &iter, NULL);
gtk_tree_store_set (GTK_TREE_STORE (store), &iter,
@@ -800,15 +755,9 @@ contact_list_store_add_contact (EmpathyContactListStore *store,
/* Else add to each group. */
for (l = groups; l; l = l->next) {
- GtkTreeIter iter_group;
- const gchar *name;
-
- name = l->data;
- if (!name) {
- continue;
- }
+ GtkTreeIter iter_group;
- contact_list_store_get_group (store, name, &iter_group, NULL, NULL);
+ contact_list_store_get_group (store, l->data, &iter_group, NULL, NULL);
gtk_tree_store_insert_after (GTK_TREE_STORE (store), &iter,
&iter_group, NULL);
@@ -818,28 +767,12 @@ contact_list_store_add_contact (EmpathyContactListStore *store,
COL_IS_GROUP, FALSE,
COL_IS_SEPARATOR, FALSE,
-1);
+ g_free (l->data);
}
+ g_list_free (groups);
contact_list_store_contact_update (store, contact);
-}
-
-static void
-contact_list_store_contact_removed_cb (EmpathyContactList *list_iface,
- EmpathyContact *contact,
- EmpathyContactListStore *store)
-{
- empathy_debug (DEBUG_DOMAIN, "Contact:'%s' removed",
- empathy_contact_get_name (contact));
-
- /* Disconnect signals */
- g_signal_handlers_disconnect_by_func (contact,
- G_CALLBACK (contact_list_store_contact_groups_updated_cb),
- store);
- g_signal_handlers_disconnect_by_func (contact,
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
- contact_list_store_remove_contact (store, contact);
}
static void
@@ -1029,16 +962,8 @@ contact_list_store_contact_update (EmpathyContactListStore *store,
}
static void
-contact_list_store_contact_groups_updated_cb (EmpathyContact *contact,
- GParamSpec *param,
- EmpathyContactListStore *store)
-{
- empathy_contact_list_store_update_contact_groups (store, contact);
-}
-
-static void
contact_list_store_contact_updated_cb (EmpathyContact *contact,
- GParamSpec *param,
+ GParamSpec *param,
EmpathyContactListStore *store)
{
empathy_debug (DEBUG_DOMAIN,
@@ -1180,10 +1105,10 @@ contact_list_store_get_group (EmpathyContactListStore *store,
gboolean *created)
{
EmpathyContactListStorePriv *priv;
- GtkTreeModel *model;
- GtkTreeIter iter_group;
- GtkTreeIter iter_separator;
- FindGroup fg;
+ GtkTreeModel *model;
+ GtkTreeIter iter_group;
+ GtkTreeIter iter_separator;
+ FindGroup fg;
priv = GET_PRIV (store);
diff --git a/libempathy-gtk/empathy-contact-list-store.h b/libempathy-gtk/empathy-contact-list-store.h
index d7c9635f5..d096daafd 100644
--- a/libempathy-gtk/empathy-contact-list-store.h
+++ b/libempathy-gtk/empathy-contact-list-store.h
@@ -106,11 +106,6 @@ gboolean empathy_contact_list_store_search_equal_func (GtkTre
const gchar *key,
GtkTreeIter *iter,
gpointer search_data);
-void empathy_contact_list_store_set_contact_groups_func (EmpathyContactListStore*store,
- EmpathyContactGroupsFunc func,
- gpointer user_data);
-void empathy_contact_list_store_update_contact_groups (EmpathyContactListStore *store,
- EmpathyContact *contact);
G_END_DECLS
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index 2a5cf3406..5b3f0de08 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -34,7 +34,7 @@
#include <libmissioncontrol/mc-account.h>
#include <libmissioncontrol/mission-control.h>
-#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-contact-factory.h>
#include <libempathy/empathy-contact-list.h>
#include <libempathy/empathy-log-manager.h>
#include <libempathy/empathy-debug.h>
@@ -66,13 +66,8 @@
struct _EmpathyContactListViewPriv {
EmpathyContactListStore *store;
- GtkUIManager *ui;
- GtkTreeRowReference *drag_row;
- GtkTreeModel *filter;
- gchar *filter_text;
-
- EmpathyContactListViewDragReceivedFunc drag_received;
- gpointer drag_received_data;
+ GtkUIManager *ui;
+ GtkTreeRowReference *drag_row;
};
typedef struct {
@@ -103,11 +98,6 @@ static void contact_list_view_row_has_child_toggled_cb (GtkTreeModel
GtkTreePath *path,
GtkTreeIter *iter,
EmpathyContactListView *view);
-static void contact_list_view_contact_received (EmpathyContactListView *view,
- EmpathyContact *contact,
- GdkDragAction action,
- const gchar *old_group,
- const gchar *new_group);
static void contact_list_view_drag_data_received (GtkWidget *widget,
GdkDragContext *context,
gint x,
@@ -173,14 +163,6 @@ static void contact_list_view_row_expand_or_collapse_cb (EmpathyContactLi
GtkTreeIter *iter,
GtkTreePath *path,
gpointer user_data);
-static gboolean contact_list_view_filter_show_contact (EmpathyContact *contact,
- const gchar *filter);
-static gboolean contact_list_view_filter_show_group (EmpathyContactListView *view,
- const gchar *group,
- const gchar *filter);
-static gboolean contact_list_view_filter_func (GtkTreeModel *model,
- GtkTreeIter *iter,
- EmpathyContactListView *view);
static void contact_list_view_action_cb (GtkAction *action,
EmpathyContactListView *view);
static void contact_list_view_action_activated (EmpathyContactListView *view,
@@ -188,7 +170,6 @@ static void contact_list_view_action_activated (EmpathyContactLi
enum {
PROP_0,
- PROP_FILTER,
};
static const GtkActionEntry entries[] = {
@@ -315,14 +296,6 @@ empathy_contact_list_view_class_init (EmpathyContactListViewClass *klass)
G_TYPE_NONE,
3, EMPATHY_TYPE_CONTACT, G_TYPE_STRING, G_TYPE_STRING);
- g_object_class_install_property (object_class,
- PROP_FILTER,
- g_param_spec_string ("filter",
- "Filter",
- "The text to use to filter the contact list",
- NULL,
- G_PARAM_READWRITE));
-
g_type_class_add_private (object_class, sizeof (EmpathyContactListViewPriv));
}
@@ -389,10 +362,6 @@ contact_list_view_finalize (GObject *object)
if (priv->store) {
g_object_unref (priv->store);
}
- if (priv->filter) {
- g_object_unref (priv->filter);
- }
- g_free (priv->filter_text);
G_OBJECT_CLASS (empathy_contact_list_view_parent_class)->finalize (object);
}
@@ -408,9 +377,6 @@ contact_list_view_get_property (GObject *object,
priv = GET_PRIV (object);
switch (param_id) {
- case PROP_FILTER:
- g_value_set_string (value, priv->filter_text);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -428,10 +394,6 @@ contact_list_view_set_property (GObject *object,
priv = GET_PRIV (object);
switch (param_id) {
- case PROP_FILTER:
- empathy_contact_list_view_set_filter (EMPATHY_CONTACT_LIST_VIEW (object),
- g_value_get_string (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
break;
@@ -547,47 +509,6 @@ empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view,
can_show_log);
}
-void
-empathy_contact_list_view_set_filter (EmpathyContactListView *view,
- const gchar *filter)
-{
- EmpathyContactListViewPriv *priv;
-
- g_return_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view));
-
- priv = GET_PRIV (view);
-
- g_free (priv->filter_text);
- if (filter) {
- priv->filter_text = g_utf8_casefold (filter, -1);
- } else {
- priv->filter_text = NULL;
- }
-
- empathy_debug (DEBUG_DOMAIN, "Refiltering with filter:'%s' (case folded)", filter);
- gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
-}
-
-void
-empathy_contact_list_view_set_drag_received_func (EmpathyContactListView *view,
- EmpathyContactListViewDragReceivedFunc func,
- gpointer user_data)
-{
- EmpathyContactListViewPriv *priv;
-
- g_return_if_fail (EMPATHY_IS_CONTACT_LIST_VIEW (view));
-
- priv = GET_PRIV (view);
-
- if (func) {
- priv->drag_received = func;
- priv->drag_received_data = user_data;
- } else {
- priv->drag_received = NULL;
- priv->drag_received_data = NULL;
- }
-}
-
static void
contact_list_view_setup (EmpathyContactListView *view)
{
@@ -598,21 +519,11 @@ contact_list_view_setup (EmpathyContactListView *view)
priv = GET_PRIV (view);
- /* Create filter */
- priv->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (priv->store), NULL);
-
- gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter),
- (GtkTreeModelFilterVisibleFunc)
- contact_list_view_filter_func,
- view, NULL);
- gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (view),
- empathy_contact_list_store_search_equal_func,
- view, NULL);
- g_signal_connect (priv->filter, "row-has-child-toggled",
+ g_signal_connect (priv->store, "row-has-child-toggled",
G_CALLBACK (contact_list_view_row_has_child_toggled_cb),
view);
- gtk_tree_view_set_model (GTK_TREE_VIEW (view), priv->filter);
-
+ gtk_tree_view_set_model (GTK_TREE_VIEW (view),
+ GTK_TREE_MODEL (priv->store));
/* Setup view */
g_object_set (view,
@@ -697,13 +608,13 @@ contact_list_view_setup (EmpathyContactListView *view)
GDK_BUTTON1_MASK,
drag_types_source,
G_N_ELEMENTS (drag_types_source),
- GDK_ACTION_MOVE);
+ GDK_ACTION_MOVE | GDK_ACTION_COPY);
gtk_drag_dest_set (GTK_WIDGET (view),
GTK_DEST_DEFAULT_ALL,
drag_types_dest,
G_N_ELEMENTS (drag_types_dest),
- GDK_ACTION_MOVE | GDK_ACTION_LINK);
+ GDK_ACTION_MOVE | GDK_ACTION_COPY);
}
static void
@@ -747,46 +658,6 @@ contact_list_view_row_has_child_toggled_cb (GtkTreeModel *model,
}
static void
-contact_list_view_contact_received (EmpathyContactListView *view,
- EmpathyContact *contact,
- GdkDragAction action,
- const gchar *old_group,
- const gchar *new_group)
-{
- EmpathyContactListViewPriv *priv;
- GList *groups, *l;
- GList *new_groups_list = NULL;
-
- priv = GET_PRIV (view);
-
- groups = empathy_contact_get_groups (contact);
- for (l = groups; l; l = l->next) {
- gchar *str;
-
- str = l->data;
-
- if (action == GDK_ACTION_MOVE &&
- old_group != NULL &&
- strcmp (str, old_group) == 0) {
- continue;
- }
-
- if (new_group && strcmp (str, new_group) == 0) {
- /* Otherwise we set it twice */
- continue;
- }
-
- new_groups_list = g_list_prepend (new_groups_list, g_strdup (str));
- }
-
- if (new_group) {
- new_groups_list = g_list_prepend (new_groups_list, g_strdup (new_group));
- }
-
- empathy_contact_set_groups (contact, new_groups_list);
-}
-
-static void
contact_list_view_drag_data_received (GtkWidget *widget,
GdkDragContext *context,
gint x,
@@ -796,15 +667,18 @@ contact_list_view_drag_data_received (GtkWidget *widget,
guint time)
{
EmpathyContactListViewPriv *priv;
- EmpathyContactList *list;
- GtkTreeModel *model;
- GtkTreePath *path;
- GtkTreeViewDropPosition position;
- EmpathyContact *contact;
- const gchar *id;
- gchar *new_group = NULL;
- gchar *old_group = NULL;
- gboolean is_row;
+ EmpathyContactList *list;
+ EmpathyContactFactory *factory;
+ McAccount *account;
+ GtkTreeModel *model;
+ GtkTreePath *path;
+ GtkTreeViewDropPosition position;
+ EmpathyContact *contact = NULL;
+ const gchar *id;
+ gchar **strv;
+ gchar *new_group = NULL;
+ gchar *old_group = NULL;
+ gboolean is_row;
priv = GET_PRIV (widget);
@@ -814,9 +688,18 @@ contact_list_view_drag_data_received (GtkWidget *widget,
context->action == GDK_ACTION_COPY ? "copy" : "",
id);
- /* FIXME: This is ambigous, an id can come from multiple accounts */
- list = empathy_contact_list_store_get_list_iface (priv->store);
- contact = empathy_contact_list_find (list, id);
+ strv = g_strsplit (id, "/", 2);
+ factory = empathy_contact_factory_new ();
+ account = mc_account_lookup (strv[0]);
+ if (account) {
+ contact = empathy_contact_factory_get_from_id (factory,
+ account,
+ strv[1]);
+ g_object_unref (account);
+ }
+ g_object_unref (factory);
+ g_object_unref (account);
+ g_strfreev (strv);
if (!contact) {
empathy_debug (DEBUG_DOMAIN, "No contact found associated with drag & drop");
@@ -847,22 +730,17 @@ contact_list_view_drag_data_received (GtkWidget *widget,
}
empathy_debug (DEBUG_DOMAIN,
- "contact '%s' dragged from '%s' to '%s'",
- empathy_contact_get_name (contact),
+ "contact %s (%d) dragged from '%s' to '%s'",
+ empathy_contact_get_id (contact),
+ empathy_contact_get_handle (contact),
old_group, new_group);
- if (priv->drag_received) {
- priv->drag_received (contact,
- context->action,
- old_group,
- new_group,
- priv->drag_received_data);
- } else {
- contact_list_view_contact_received (EMPATHY_CONTACT_LIST_VIEW (widget),
- contact,
- context->action,
- old_group,
- new_group);
+ list = empathy_contact_list_store_get_list_iface (priv->store);
+ if (new_group) {
+ empathy_contact_list_add_to_group (list, contact, new_group);
+ }
+ if (old_group && context->action == GDK_ACTION_MOVE) {
+ empathy_contact_list_remove_from_group (list, contact, old_group);
}
g_free (old_group);
@@ -976,11 +854,15 @@ contact_list_view_drag_data_get (GtkWidget *widget,
guint time)
{
EmpathyContactListViewPriv *priv;
- GtkTreePath *src_path;
- GtkTreeIter iter;
- GtkTreeModel *model;
+ GtkTreePath *src_path;
+ GtkTreeIter iter;
+ GtkTreeModel *model;
EmpathyContact *contact;
- const gchar *id;
+ McAccount *account;
+ const gchar *contact_id;
+ const gchar *account_id;
+ gchar *str;
+
priv = GET_PRIV (widget);
@@ -1006,18 +888,20 @@ contact_list_view_drag_data_get (GtkWidget *widget,
return;
}
- id = empathy_contact_get_id (contact);
+ account = empathy_contact_get_account (contact);
+ account_id = mc_account_get_unique_name (account);
+ contact_id = empathy_contact_get_id (contact);
g_object_unref (contact);
+ str = g_strconcat (account_id, "/", contact_id, NULL);
switch (info) {
case DND_DRAG_TYPE_CONTACT_ID:
gtk_selection_data_set (selection, drag_atoms_source[info], 8,
- (guchar*)id, strlen (id) + 1);
+ (guchar*)str, strlen (str) + 1);
break;
-
- default:
- return;
}
+
+ g_free (str);
}
static void
@@ -1329,124 +1213,6 @@ contact_list_view_row_expand_or_collapse_cb (EmpathyContactListView *view,
g_free (name);
}
-static gboolean
-contact_list_view_filter_show_contact (EmpathyContact *contact,
- const gchar *filter)
-{
- gchar *str;
- gboolean visible;
-
- /* Check contact id */
- str = g_utf8_casefold (empathy_contact_get_id (contact), -1);
- visible = G_STR_EMPTY (str) || strstr (str, filter);
- g_free (str);
-
- if (visible) {
- return TRUE;
- }
-
- /* Check contact name */
- str = g_utf8_casefold (empathy_contact_get_name (contact), -1);
- visible = G_STR_EMPTY (str) || strstr (str, filter);
- g_free (str);
-
- return visible;
-}
-
-static gboolean
-contact_list_view_filter_show_group (EmpathyContactListView *view,
- const gchar *group,
- const gchar *filter)
-{
- EmpathyContactListViewPriv *priv;
- EmpathyContactList *list;
- GList *contacts, *l;
- gchar *str;
- gboolean show_group = FALSE;
-
- priv = GET_PRIV (view);
-
- str = g_utf8_casefold (group, -1);
- if (!str) {
- return FALSE;
- }
-
- /* If the filter is the partially the group name, we show the
- * whole group.
- */
- if (strstr (str, filter)) {
- g_free (str);
- return TRUE;
- }
-
- /* At this point, we need to check in advance if this
- * group should be shown because a contact we want to
- * show exists in it.
- */
- list = empathy_contact_list_store_get_list_iface (priv->store);
- contacts = empathy_contact_list_get_members (list);
- for (l = contacts; l && !show_group; l = l->next) {
- if (!empathy_contact_is_in_group (l->data, group)) {
- g_object_unref (l->data);
- continue;
- }
-
- if (contact_list_view_filter_show_contact (l->data, filter)) {
- show_group = TRUE;
- }
- g_object_unref (l->data);
- }
- g_list_free (contacts);
- g_free (str);
-
- return show_group;
-}
-
-static gboolean
-contact_list_view_filter_func (GtkTreeModel *model,
- GtkTreeIter *iter,
- EmpathyContactListView *view)
-{
- EmpathyContactListViewPriv *priv;
- gboolean is_group;
- gboolean is_separator;
- gboolean visible = TRUE;
-
- priv = GET_PRIV (view);
-
- if (G_STR_EMPTY (priv->filter_text)) {
- return TRUE;
- }
-
- /* Check to see if iter matches any group names */
- gtk_tree_model_get (model, iter,
- COL_IS_GROUP, &is_group,
- COL_IS_SEPARATOR, &is_separator,
- -1);
-
- if (is_group) {
- gchar *name;
-
- gtk_tree_model_get (model, iter, COL_NAME, &name, -1);
- visible &= contact_list_view_filter_show_group (view,
- name,
- priv->filter_text);
- g_free (name);
- } else if (is_separator) {
- /* Do nothing here */
- } else {
- EmpathyContact *contact;
-
- /* Check contact id */
- gtk_tree_model_get (model, iter, COL_CONTACT, &contact, -1);
- visible &= contact_list_view_filter_show_contact (contact,
- priv->filter_text);
- g_object_unref (contact);
- }
-
- return visible;
-}
-
static void
contact_list_view_action_cb (GtkAction *action,
EmpathyContactListView *view)
diff --git a/libempathy-gtk/empathy-contact-list-view.h b/libempathy-gtk/empathy-contact-list-view.h
index 4d7cf1cb9..b9de24357 100644
--- a/libempathy-gtk/empathy-contact-list-view.h
+++ b/libempathy-gtk/empathy-contact-list-view.h
@@ -53,24 +53,13 @@ struct _EmpathyContactListViewClass {
GtkTreeViewClass parent_class;
};
-typedef void (*EmpathyContactListViewDragReceivedFunc) (EmpathyContact *contact,
- GdkDragAction action,
- const gchar *old_group,
- const gchar *new_group,
- gpointer user_data);
-
-GType empathy_contact_list_view_get_type (void) G_GNUC_CONST;
-EmpathyContactListView *empathy_contact_list_view_new (EmpathyContactListStore *store);
-EmpathyContact * empathy_contact_list_view_get_selected (EmpathyContactListView *view);
-gchar * empathy_contact_list_view_get_selected_group (EmpathyContactListView *view);
-GtkWidget * empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view,
- EmpathyContact *contact);
-GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view);
-void empathy_contact_list_view_set_filter (EmpathyContactListView *view,
- const gchar *filter);
-void empathy_contact_list_view_set_drag_received_func (EmpathyContactListView *view,
- EmpathyContactListViewDragReceivedFunc func,
- gpointer user_data);
+GType empathy_contact_list_view_get_type (void) G_GNUC_CONST;
+EmpathyContactListView *empathy_contact_list_view_new (EmpathyContactListStore *store);
+EmpathyContact * empathy_contact_list_view_get_selected (EmpathyContactListView *view);
+gchar * empathy_contact_list_view_get_selected_group (EmpathyContactListView *view);
+GtkWidget * empathy_contact_list_view_get_contact_menu (EmpathyContactListView *view,
+ EmpathyContact *contact);
+GtkWidget * empathy_contact_list_view_get_group_menu (EmpathyContactListView *view);
G_END_DECLS
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index 5c8f6d3d8..b3081b130 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -31,7 +31,9 @@
#include <libmissioncontrol/mc-account.h>
+#include <libempathy/empathy-contact-factory.h>
#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-contact-list.h>
#include <libempathy/empathy-utils.h>
#include "empathy-contact-widget.h"
@@ -42,44 +44,45 @@
#define ID_CHANGED_TIMEOUT 500
typedef struct {
- EmpathyContact *contact;
- gboolean is_user;
- EmpathyContactWidgetType type;
- GtkCellRenderer *renderer;
- guint widget_id_timeout;
+ EmpathyContactFactory *factory;
+ EmpathyContactManager *manager;
+ EmpathyContact *contact;
+ gboolean is_user;
+ EmpathyContactWidgetType type;
+ GtkCellRenderer *renderer;
+ guint widget_id_timeout;
- GtkWidget *vbox_contact_widget;
+ GtkWidget *vbox_contact_widget;
/* Contact */
- GtkWidget *vbox_contact;
- GtkWidget *widget_avatar;
- GtkWidget *widget_account;
- GtkWidget *widget_id;
- GtkWidget *widget_alias;
- GtkWidget *label_alias;
- GtkWidget *entry_alias;
- GtkWidget *hbox_presence;
- GtkWidget *image_state;
- GtkWidget *label_status;
- GtkWidget *table_contact;
- GtkWidget *hbox_contact;
+ GtkWidget *vbox_contact;
+ GtkWidget *widget_avatar;
+ GtkWidget *widget_account;
+ GtkWidget *widget_id;
+ GtkWidget *widget_alias;
+ GtkWidget *label_alias;
+ GtkWidget *entry_alias;
+ GtkWidget *hbox_presence;
+ GtkWidget *image_state;
+ GtkWidget *label_status;
+ GtkWidget *table_contact;
+ GtkWidget *hbox_contact;
/* Groups */
- GtkWidget *vbox_groups;
- GtkWidget *entry_group;
- GtkWidget *button_group;
- GtkWidget *treeview_groups;
+ GtkWidget *vbox_groups;
+ GtkWidget *entry_group;
+ GtkWidget *button_group;
+ GtkWidget *treeview_groups;
/* Details */
- GtkWidget *vbox_details;
- GtkWidget *table_details;
- GtkWidget *hbox_details_requested;
+ GtkWidget *vbox_details;
+ GtkWidget *table_details;
+ GtkWidget *hbox_details_requested;
/* Client */
- GtkWidget *vbox_client;
- GtkWidget *table_client;
- GtkWidget *hbow_client_requested;
-
+ GtkWidget *vbox_client;
+ GtkWidget *table_client;
+ GtkWidget *hbow_client_requested;
} EmpathyContactWidget;
typedef struct {
@@ -151,6 +154,7 @@ empathy_contact_widget_new (EmpathyContact *contact,
information = g_slice_new0 (EmpathyContactWidget);
information->type = type;
+ information->factory = empathy_contact_factory_new ();
if (contact) {
information->is_user = empathy_contact_is_user (contact);
} else {
@@ -231,6 +235,12 @@ contact_widget_destroy_cb (GtkWidget *widget,
if (information->widget_id_timeout != 0) {
g_source_remove (information->widget_id_timeout);
}
+ if (information->factory) {
+ g_object_unref (information->factory);
+ }
+ if (information->manager) {
+ g_object_unref (information->manager);
+ }
g_slice_free (EmpathyContactWidget, information);
}
@@ -467,17 +477,15 @@ contact_widget_update_contact (EmpathyContactWidget *information)
id = gtk_entry_get_text (GTK_ENTRY (information->widget_id));
if (account && !G_STR_EMPTY (id)) {
- EmpathyContactManager *manager;
- EmpathyContact *contact;
+ EmpathyContact *contact;
- manager = empathy_contact_manager_new ();
- contact = empathy_contact_manager_create (manager, account, id);
+ contact = empathy_contact_factory_get_from_id (information->factory,
+ account, id);
contact_widget_set_contact (information, contact);
if (contact) {
g_object_unref (contact);
}
- g_object_unref (manager);
}
return FALSE;
@@ -508,7 +516,9 @@ contact_widget_entry_alias_focus_event_cb (GtkEditable *editable,
const gchar *name;
name = gtk_entry_get_text (GTK_ENTRY (editable));
- empathy_contact_set_name (information->contact, name);
+ empathy_contact_factory_set_name (information->factory,
+ information->contact,
+ name);
}
return FALSE;
@@ -559,6 +569,7 @@ static void
contact_widget_groups_setup (EmpathyContactWidget *information)
{
if (information->type > CONTACT_WIDGET_TYPE_SHOW) {
+ information->manager = empathy_contact_manager_new ();
contact_widget_model_setup (information);
}
}
@@ -657,21 +668,19 @@ contact_widget_model_populate_columns (EmpathyContactWidget *information)
static void
contact_widget_groups_populate_data (EmpathyContactWidget *information)
{
- EmpathyContactManager *manager;
- GtkTreeView *view;
- GtkListStore *store;
- GtkTreeIter iter;
- GList *my_groups, *l;
- GList *all_groups;
+ GtkTreeView *view;
+ GtkListStore *store;
+ GtkTreeIter iter;
+ GList *my_groups, *l;
+ GList *all_groups;
view = GTK_TREE_VIEW (information->treeview_groups);
store = GTK_LIST_STORE (gtk_tree_view_get_model (view));
gtk_list_store_clear (store);
- manager = empathy_contact_manager_new ();
- all_groups = empathy_contact_manager_get_groups (manager);
- my_groups = empathy_contact_get_groups (information->contact);
- g_object_unref (manager);
+ all_groups = empathy_contact_list_get_all_groups (EMPATHY_CONTACT_LIST (information->manager));
+ my_groups = empathy_contact_list_get_groups (EMPATHY_CONTACT_LIST (information->manager),
+ information->contact);
for (l = all_groups; l; l = l->next) {
const gchar *group_str;
@@ -691,7 +700,10 @@ contact_widget_groups_populate_data (EmpathyContactWidget *information)
-1);
}
+ g_list_foreach (all_groups, (GFunc) g_free, NULL);
+ g_list_foreach (my_groups, (GFunc) g_free, NULL);
g_list_free (all_groups);
+ g_list_free (my_groups);
}
static void
@@ -792,9 +804,13 @@ contact_widget_cell_toggled (GtkCellRendererToggle *cell,
if (group) {
if (enabled) {
- empathy_contact_remove_group (information->contact, group);
+ empathy_contact_list_remove_from_group (EMPATHY_CONTACT_LIST (information->manager),
+ information->contact,
+ group);
} else {
- empathy_contact_add_group (information->contact, group);
+ empathy_contact_list_add_to_group (EMPATHY_CONTACT_LIST (information->manager),
+ information->contact,
+ group);
}
g_free (group);
@@ -846,7 +862,9 @@ contact_widget_button_group_clicked_cb (GtkButton *button,
COL_ENABLED, TRUE,
-1);
- empathy_contact_add_group (information->contact, group);
+ empathy_contact_list_add_to_group (EMPATHY_CONTACT_LIST (information->manager),
+ information->contact,
+ group);
}
static void
diff --git a/libempathy-gtk/empathy-group-chat.c b/libempathy-gtk/empathy-group-chat.c
index ca046a3d7..48439302d 100644
--- a/libempathy-gtk/empathy-group-chat.c
+++ b/libempathy-gtk/empathy-group-chat.c
@@ -78,11 +78,12 @@ static void group_chat_finalize (GObject *obj
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,
+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);
@@ -348,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);
}
@@ -540,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),
diff --git a/libempathy-gtk/empathy-images.h b/libempathy-gtk/empathy-images.h
index 227ebe599..ad6d43b28 100644
--- a/libempathy-gtk/empathy-images.h
+++ b/libempathy-gtk/empathy-images.h
@@ -31,7 +31,7 @@ G_BEGIN_DECLS
#define EMPATHY_IMAGE_BUSY "empathy-busy"
#define EMPATHY_IMAGE_AWAY "empathy-away"
#define EMPATHY_IMAGE_EXT_AWAY "empathy-extended-away"
-#define EMPATHY_IMAGE_PENDING "empathy-pending"
+#define EMPATHY_IMAGE_UNKNOWN "empathy-pending"
#define EMPATHY_IMAGE_MESSAGE "empathy-message"
#define EMPATHY_IMAGE_NEW_MESSAGE "empathy-new-message"
diff --git a/libempathy-gtk/empathy-main-window.c b/libempathy-gtk/empathy-main-window.c
index 13c578d89..4b89c4e67 100644
--- a/libempathy-gtk/empathy-main-window.c
+++ b/libempathy-gtk/empathy-main-window.c
@@ -288,7 +288,6 @@ empathy_main_window_show (void)
empathy_status_presets_get_all ();
list_iface = EMPATHY_CONTACT_LIST (empathy_contact_manager_new ());
- empathy_contact_list_setup (list_iface);
window->list_store = empathy_contact_list_store_new (list_iface);
window->list_view = empathy_contact_list_view_new (window->list_store);
g_object_unref (list_iface);
diff --git a/libempathy-gtk/empathy-private-chat.c b/libempathy-gtk/empathy-private-chat.c
index 81f93c021..b187e98cd 100644
--- a/libempathy-gtk/empathy-private-chat.c
+++ b/libempathy-gtk/empathy-private-chat.c
@@ -36,7 +36,7 @@
#include <libempathy/empathy-debug.h>
#include <libempathy/empathy-tp-chat.h>
#include <libempathy/empathy-tp-contact-list.h>
-#include <libempathy/empathy-contact-manager.h>
+#include <libempathy/empathy-contact-factory.h>
#include "empathy-private-chat.h"
#include "empathy-chat-view.h"
@@ -51,11 +51,12 @@
#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_PRIVATE_CHAT, EmpathyPrivateChatPriv))
struct _EmpathyPrivateChatPriv {
- EmpathyContact *contact;
- gchar *name;
- gboolean is_online;
- GtkWidget *widget;
- GtkWidget *text_view_sw;
+ EmpathyContactFactory *factory;
+ EmpathyContact *contact;
+ gchar *name;
+ gboolean is_online;
+ GtkWidget *widget;
+ GtkWidget *text_view_sw;
};
static void empathy_private_chat_class_init (EmpathyPrivateChatClass *klass);
@@ -125,7 +126,9 @@ private_chat_finalize (GObject *object)
if (priv->contact) {
g_object_unref (priv->contact);
}
-
+ if (priv->factory) {
+ g_object_unref (priv->factory);
+ }
g_free (priv->name);
G_OBJECT_CLASS (empathy_private_chat_parent_class)->finalize (object);
@@ -327,27 +330,30 @@ EmpathyPrivateChat *
empathy_private_chat_new (McAccount *account,
TpChan *tp_chan)
{
- EmpathyPrivateChat *chat;
- EmpathyTpChat *tp_chat;
- EmpathyContactManager *manager;
- EmpathyTpContactList *list;
- EmpathyContact *contact;
+ EmpathyPrivateChat *chat;
+ EmpathyPrivateChatPriv *priv;
+ EmpathyTpChat *tp_chat;
+ EmpathyContactFactory *factory;
+ EmpathyContact *contact;
g_return_val_if_fail (MC_IS_ACCOUNT (account), NULL);
g_return_val_if_fail (TELEPATHY_IS_CHAN (tp_chan), NULL);
- manager = empathy_contact_manager_new ();
- list = empathy_contact_manager_get_list (manager, account);
- contact = empathy_tp_contact_list_get_from_handle (list, tp_chan->handle);
+ factory = empathy_contact_factory_new ();
+ contact = empathy_contact_factory_get_from_handle (factory,
+ account,
+ tp_chan->handle);
chat = g_object_new (EMPATHY_TYPE_PRIVATE_CHAT, NULL);
- tp_chat = empathy_tp_chat_new (account, tp_chan);
+ priv = GET_PRIV (chat);
+ priv->factory = factory;
+ tp_chat = empathy_tp_chat_new (account, tp_chan);
private_chat_setup (chat, contact, tp_chat);
g_object_unref (tp_chat);
g_object_unref (contact);
- g_object_unref (manager);
+ g_object_unref (factory);
return chat;
}
diff --git a/libempathy-gtk/empathy-status-icon.c b/libempathy-gtk/empathy-status-icon.c
index 1ec1a21a5..1fdc00953 100644
--- a/libempathy-gtk/empathy-status-icon.c
+++ b/libempathy-gtk/empathy-status-icon.c
@@ -117,9 +117,12 @@ static void status_icon_quit_cb (GtkWidget *windo
EmpathyStatusIcon *icon);
static void status_icon_show_hide_window_cb (GtkWidget *widget,
EmpathyStatusIcon *icon);
-static void status_icon_local_pending_cb (EmpathyContactManager *manager,
- EmpathyContact *contact,
+static void status_icon_pendings_changed_cb (EmpathyContactManager *manager,
+ EmpathyContact *contact,
+ EmpathyContact *actor,
+ guint reason,
gchar *message,
+ gboolean is_pending,
EmpathyStatusIcon *icon);
static void status_icon_event_subscribe_cb (StatusIconEvent *event);
static void status_icon_event_flash_state_cb (StatusIconEvent *event);
@@ -148,7 +151,7 @@ static void
empathy_status_icon_init (EmpathyStatusIcon *icon)
{
EmpathyStatusIconPriv *priv;
- GList *pending, *l;
+ GList *pendings, *l;
priv = GET_PRIV (icon);
@@ -177,21 +180,25 @@ empathy_status_icon_init (EmpathyStatusIcon *icon)
g_signal_connect (priv->icon, "popup-menu",
G_CALLBACK (status_icon_popup_menu_cb),
icon);
- g_signal_connect (priv->manager, "local-pending",
- G_CALLBACK (status_icon_local_pending_cb),
+ g_signal_connect (priv->manager, "pendings-changed",
+ G_CALLBACK (status_icon_pendings_changed_cb),
icon);
- pending = empathy_contact_list_get_local_pending (EMPATHY_CONTACT_LIST (priv->manager));
- for (l = pending; l; l = l->next) {
- EmpathyContactListInfo *info;
+ pendings = empathy_contact_list_get_pendings (EMPATHY_CONTACT_LIST (priv->manager));
+ for (l = pendings; l; l = l->next) {
+ EmpathyPendingInfo *info;
info = l->data;
- status_icon_local_pending_cb (priv->manager,
- info->contact,
- info->message,
- icon);
+ status_icon_pendings_changed_cb (priv->manager,
+ info->member,
+ info->actor,
+ 0,
+ info->message,
+ TRUE,
+ icon);
+ empathy_pending_info_free (info);
}
- g_list_free (pending);
+ g_list_free (pendings);
}
static void
@@ -533,10 +540,13 @@ status_icon_show_hide_window_cb (GtkWidget *widget,
}
static void
-status_icon_local_pending_cb (EmpathyContactManager *manager,
- EmpathyContact *contact,
- gchar *message,
- EmpathyStatusIcon *icon)
+status_icon_pendings_changed_cb (EmpathyContactManager *manager,
+ EmpathyContact *contact,
+ EmpathyContact *actor,
+ guint reason,
+ gchar *message,
+ gboolean is_pending,
+ EmpathyStatusIcon *icon)
{
EmpathyStatusIconPriv *priv;
StatusIconEvent *event;
@@ -545,6 +555,11 @@ status_icon_local_pending_cb (EmpathyContactManager *manager,
priv = GET_PRIV (icon);
+ if (!is_pending) {
+ /* FIXME: We should remove the event */
+ return;
+ }
+
for (l = priv->events; l; l = l->next) {
if (empathy_contact_equal (contact, ((StatusIconEvent*)l->data)->user_data)) {
return;
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index fb491cc5e..aedacb08b 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -378,8 +378,7 @@ empathy_icon_name_for_presence (EmpathyPresence *presence)
const gchar *
empathy_icon_name_for_contact (EmpathyContact *contact)
{
- EmpathyPresence *presence;
- EmpathySubscription subscription;
+ EmpathyPresence *presence;
g_return_val_if_fail (EMPATHY_IS_CONTACT (contact),
EMPATHY_IMAGE_OFFLINE);
@@ -389,12 +388,7 @@ empathy_icon_name_for_contact (EmpathyContact *contact)
return empathy_icon_name_for_presence (presence);
}
- subscription = empathy_contact_get_subscription (contact);
- if (!(subscription & EMPATHY_SUBSCRIPTION_FROM)) {
- return EMPATHY_IMAGE_PENDING;
- }
-
- return EMPATHY_IMAGE_OFFLINE;
+ return EMPATHY_IMAGE_UNKNOWN;
}
static void