#include <glib.h>
#include <gtk/gtk.h>
-#include <libempathy/empathy-debug.h>
+#include <telepathy-glib/util.h>
+#include <libempathy/empathy-utils.h>
#include "empathy-contact-list-store.h"
#include "empathy-ui-utils.h"
#include "empathy-gtk-enum-types.h"
-#define DEBUG_DOMAIN "ContactListStore"
+#define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
+#include <libempathy/empathy-debug.h>
/* Active users are those which have recently changed state
* (e.g. online, offline or from normal to a busy state).
/* Time in seconds after connecting which we wait before active users are enabled */
#define ACTIVE_USER_WAIT_TO_ENABLE_TIME 5
-#define GET_PRIV(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EMPATHY_TYPE_CONTACT_LIST_STORE, EmpathyContactListStorePriv))
-
+#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyContactListStore)
typedef struct {
EmpathyContactList *list;
gboolean show_offline;
gboolean remove;
} ShowActiveData;
-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,
guint param_id,
const GValue *value,
GParamSpec *pspec);
-static gboolean contact_list_store_finalize_foreach (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data);
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,
G_DEFINE_TYPE (EmpathyContactListStore, empathy_contact_list_store, GTK_TYPE_TREE_STORE);
-
static gboolean
contact_list_store_iface_setup (gpointer user_data)
{
priv->list = g_object_ref (list_iface);
/* Let a chance to have all properties set before populating */
- g_idle_add (contact_list_store_iface_setup,
- store);
+ g_idle_add (contact_list_store_iface_setup, store);
}
static void
static void
empathy_contact_list_store_init (EmpathyContactListStore *store)
{
- EmpathyContactListStorePriv *priv;
-
- priv = GET_PRIV (store);
+ EmpathyContactListStorePriv *priv = G_TYPE_INSTANCE_GET_PRIVATE (store,
+ EMPATHY_TYPE_CONTACT_LIST_STORE, EmpathyContactListStorePriv);
+ store->priv = priv;
priv->show_avatars = TRUE;
priv->show_groups = TRUE;
priv->inhibit_active = g_timeout_add_seconds (ACTIVE_USER_WAIT_TO_ENABLE_TIME,
static void
contact_list_store_finalize (GObject *object)
{
- EmpathyContactListStorePriv *priv;
-
- priv = GET_PRIV (object);
-
- gtk_tree_model_foreach (GTK_TREE_MODEL (object),
- (GtkTreeModelForeachFunc) contact_list_store_finalize_foreach,
- object);
+ EmpathyContactListStorePriv *priv = GET_PRIV (object);
+ GList *contacts, *l;
- if (priv->list) {
- g_signal_handlers_disconnect_by_func (priv->list,
- G_CALLBACK (contact_list_store_members_changed_cb),
- object);
- g_signal_handlers_disconnect_by_func (priv->list,
- G_CALLBACK (contact_list_store_groups_changed_cb),
+ contacts = empathy_contact_list_get_members (priv->list);
+ for (l = contacts; l; l = l->next) {
+ g_signal_handlers_disconnect_by_func (l->data,
+ G_CALLBACK (contact_list_store_contact_updated_cb),
object);
- g_object_unref (priv->list);
+
+ g_object_unref (l->data);
}
+ g_list_free (contacts);
+
+ g_signal_handlers_disconnect_by_func (priv->list,
+ G_CALLBACK (contact_list_store_members_changed_cb),
+ object);
+ g_signal_handlers_disconnect_by_func (priv->list,
+ G_CALLBACK (contact_list_store_groups_changed_cb),
+ object);
+ g_object_unref (priv->list);
if (priv->inhibit_active) {
g_source_remove (priv->inhibit_active);
return ret;
}
-static gboolean
-contact_list_store_finalize_foreach (GtkTreeModel *model,
- GtkTreePath *path,
- GtkTreeIter *iter,
- gpointer user_data)
-{
- EmpathyContactListStore *store = user_data;
- EmpathyContact *contact = NULL;
-
- gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
- EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact,
- -1);
-
- if (contact) {
- g_signal_handlers_disconnect_by_func (contact,
- G_CALLBACK (contact_list_store_contact_updated_cb),
- store);
- }
-
- return FALSE;
-}
-
static void
contact_list_store_setup (EmpathyContactListStore *store)
{
priv = GET_PRIV (store);
- empathy_debug (DEBUG_DOMAIN,
- "Contact %s (%d) %s",
- empathy_contact_get_id (contact),
- empathy_contact_get_handle (contact),
- is_member ? "added" : "removed");
+ DEBUG ("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",
priv = GET_PRIV (store);
- empathy_debug (DEBUG_DOMAIN, "Updating groups for contact %s (%d)",
- empathy_contact_get_id (contact),
- empathy_contact_get_handle (contact));
+ DEBUG ("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
priv = GET_PRIV (store);
- if (!priv->show_offline && !empathy_contact_is_online (contact)) {
+ if (EMP_STR_EMPTY (empathy_contact_get_name (contact)) ||
+ (!priv->show_offline && !empathy_contact_is_online (contact))) {
return;
}
gboolean do_remove = FALSE;
gboolean do_set_active = FALSE;
gboolean do_set_refresh = FALSE;
+ gboolean show_avatar = FALSE;
GdkPixbuf *pixbuf_avatar;
priv = GET_PRIV (store);
if (!in_list && !should_be_in_list) {
/* Nothing to do. */
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' in list:NO, should be:NO",
- empathy_contact_get_name (contact));
+ DEBUG ("Contact:'%s' in list:NO, should be:NO",
+ empathy_contact_get_name (contact));
g_list_foreach (iters, (GFunc) gtk_tree_iter_free, NULL);
g_list_free (iters);
return;
}
else if (in_list && !should_be_in_list) {
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' in list:YES, should be:NO",
- empathy_contact_get_name (contact));
+ DEBUG ("Contact:'%s' in list:YES, should be:NO",
+ empathy_contact_get_name (contact));
if (priv->show_active) {
do_remove = TRUE;
do_set_refresh = TRUE;
set_model = TRUE;
- empathy_debug (DEBUG_DOMAIN, "Remove item (after timeout)");
+ DEBUG ("Remove item (after timeout)");
} else {
- empathy_debug (DEBUG_DOMAIN, "Remove item (now)!");
+ DEBUG ("Remove item (now)!");
contact_list_store_remove_contact (store, contact);
}
}
else if (!in_list && should_be_in_list) {
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' in list:NO, should be:YES",
- empathy_contact_get_name (contact));
+ DEBUG ("Contact:'%s' in list:NO, should be:YES",
+ empathy_contact_get_name (contact));
contact_list_store_add_contact (store, contact);
if (priv->show_active) {
do_set_active = TRUE;
- empathy_debug (DEBUG_DOMAIN, "Set active (contact added)");
+ DEBUG ("Set active (contact added)");
}
} else {
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' in list:YES, should be:YES",
- empathy_contact_get_name (contact));
+ DEBUG ("Contact:'%s' in list:YES, should be:YES",
+ empathy_contact_get_name (contact));
/* Get online state before. */
if (iters && g_list_length (iters) > 0) {
do_set_active = TRUE;
do_set_refresh = TRUE;
- empathy_debug (DEBUG_DOMAIN, "Set active (contact updated %s)",
- was_online ? "online -> offline" :
- "offline -> online");
+ DEBUG ("Set active (contact updated %s)",
+ was_online ? "online -> offline" :
+ "offline -> online");
} else {
/* Was TRUE for presence updates. */
/* do_set_active = FALSE; */
do_set_refresh = TRUE;
- empathy_debug (DEBUG_DOMAIN, "Set active (contact updated)");
+ DEBUG ("Set active (contact updated)");
}
}
set_model = TRUE;
}
+ if (priv->show_avatars && !priv->is_compact) {
+ show_avatar = TRUE;
+ }
pixbuf_avatar = empathy_pixbuf_avatar_from_contact_scaled (contact, 32, 32);
for (l = iters; l && set_model; l = l->next) {
gtk_tree_store_set (GTK_TREE_STORE (store), l->data,
EMPATHY_CONTACT_LIST_STORE_COL_ICON_STATUS, empathy_icon_name_for_contact (contact),
EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR, pixbuf_avatar,
- EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, priv->show_avatars,
+ EMPATHY_CONTACT_LIST_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
EMPATHY_CONTACT_LIST_STORE_COL_NAME, empathy_contact_get_name (contact),
EMPATHY_CONTACT_LIST_STORE_COL_STATUS, empathy_contact_get_status (contact),
EMPATHY_CONTACT_LIST_STORE_COL_STATUS_VISIBLE, !priv->is_compact,
GParamSpec *param,
EmpathyContactListStore *store)
{
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' updated, checking roster is in sync...",
- empathy_contact_get_name (contact));
+ DEBUG ("Contact:'%s' updated, checking roster is in sync...",
+ empathy_contact_get_name (contact));
contact_list_store_contact_update (store, contact);
}
EMPATHY_CONTACT_LIST_STORE_COL_IS_ACTIVE, active,
-1);
- empathy_debug (DEBUG_DOMAIN, "Set item %s", active ? "active" : "inactive");
+ DEBUG ("Set item %s", active ? "active" : "inactive");
if (set_changed) {
path = gtk_tree_model_get_path (model, l->data);
{
ShowActiveData *data;
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' now active, and %s be removed",
- empathy_contact_get_name (contact),
- remove ? "WILL" : "WILL NOT");
+ DEBUG ("Contact:'%s' now active, and %s be removed",
+ empathy_contact_get_name (contact),
+ remove ? "WILL" : "WILL NOT");
data = g_slice_new0 (ShowActiveData);
if (data->remove &&
!priv->show_offline &&
!empathy_contact_is_online (data->contact)) {
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' active timeout, removing item",
- empathy_contact_get_name (data->contact));
+ DEBUG ("Contact:'%s' active timeout, removing item",
+ empathy_contact_get_name (data->contact));
contact_list_store_remove_contact (data->store, data->contact);
}
- empathy_debug (DEBUG_DOMAIN,
- "Contact:'%s' no longer active",
- empathy_contact_get_name (data->contact));
+ DEBUG ("Contact:'%s' no longer active",
+ empathy_contact_get_name (data->contact));
contact_list_store_contact_set_active (data->store,
data->contact,
EMPATHY_CONTACT_LIST_STORE_COL_IS_GROUP, &is_group,
-1);
- if (is_group && strcmp (str, fg->name) == 0) {
+ if (is_group && !tp_strdiff (str, fg->name)) {
fg->found = TRUE;
fg->iter = *iter;
}
EMPATHY_CONTACT_LIST_STORE_COL_CONTACT, &contact,
-1);
- if (!contact) {
- return FALSE;
- }
-
- if (empathy_contact_equal (contact, fc->contact)) {
+ if (contact == fc->contact) {
fc->found = TRUE;
fc->iters = g_list_append (fc->iters, gtk_tree_iter_copy (iter));
}
- g_object_unref (contact);
+
+ if (contact) {
+ g_object_unref (contact);
+ }
return FALSE;
}