aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2010-09-01 01:52:24 +0800
committerPhilip Withnall <philip.withnall@collabora.co.uk>2010-09-01 17:11:41 +0800
commit628a7449101e36c00fffb76260d828737913c232 (patch)
tree0d565a67e5c2a2b1f1bcf8ee17ce630a2b712bc0
parent6a558ab4c6d124e684544568ca85b74b25bd6c17 (diff)
downloadgsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar.gz
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar.bz2
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar.lz
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar.xz
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.tar.zst
gsoc2013-empathy-628a7449101e36c00fffb76260d828737913c232.zip
Fix the audio/video icon in the contact list
Closes: bgo#628421
-rw-r--r--libempathy-gtk/empathy-individual-store.c82
1 files changed, 51 insertions, 31 deletions
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c
index ca7152f4f..e72b7ec9e 100644
--- a/libempathy-gtk/empathy-individual-store.c
+++ b/libempathy-gtk/empathy-individual-store.c
@@ -115,6 +115,45 @@ static void individual_store_contact_update (EmpathyIndividualStore *self,
G_DEFINE_TYPE (EmpathyIndividualStore, empathy_individual_store,
GTK_TYPE_TREE_STORE);
+/* Calculate whether the Individual can do audio or video calls.
+ * FIXME: We can remove this once libfolks has grown capabilities support
+ * again: bgo#626179. */
+static void
+individual_can_audio_video_call (FolksIndividual *individual,
+ gboolean *can_audio_call,
+ gboolean *can_video_call)
+{
+ GList *personas, *l;
+ gboolean can_audio = FALSE, can_video = FALSE;
+
+ personas = folks_individual_get_personas (individual);
+ for (l = personas; l != NULL; l = l->next)
+ {
+ TpContact *tp_contact;
+ EmpathyContact *contact;
+
+ if (!TPF_IS_PERSONA (l->data))
+ continue;
+
+ tp_contact = tpf_persona_get_contact (TPF_PERSONA (l->data));
+ contact = empathy_contact_dup_from_tp_contact (tp_contact);
+ empathy_contact_set_persona (contact, FOLKS_PERSONA (l->data));
+
+ can_audio = can_audio || empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_AUDIO;
+ can_video = can_video || empathy_contact_get_capabilities (contact) &
+ EMPATHY_CAPABILITIES_VIDEO;
+
+ g_object_unref (contact);
+
+ if (can_audio && can_video)
+ break;
+ }
+
+ *can_audio_call = can_audio;
+ *can_video_call = can_video;
+}
+
static void
add_individual_to_store (GtkTreeStore *self,
GtkTreeIter *iter,
@@ -122,9 +161,10 @@ add_individual_to_store (GtkTreeStore *self,
FolksIndividual *individual,
EmpathyIndividualManagerFlags flags)
{
- EmpathyContact *contact;
+ gboolean can_audio_call, can_video_call;
- contact = empathy_contact_dup_from_folks_individual (individual);
+ individual_can_audio_video_call (individual, &can_audio_call,
+ &can_video_call);
gtk_tree_store_insert_with_values (self, iter, parent, 0,
EMPATHY_INDIVIDUAL_STORE_COL_NAME,
@@ -133,21 +173,9 @@ add_individual_to_store (GtkTreeStore *self,
EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, FALSE,
EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, FALSE,
EMPATHY_INDIVIDUAL_STORE_COL_FLAGS, flags,
+ EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, can_audio_call,
+ EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, can_video_call,
-1);
-
- if (contact != NULL)
- {
- gtk_tree_store_set (GTK_TREE_STORE (self), iter,
- EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_AUDIO,
- EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_VIDEO,
- -1);
- }
-
- tp_clear_object (&contact);
}
static gboolean
@@ -612,7 +640,6 @@ individual_store_contact_update (EmpathyIndividualStore *self,
EmpathyIndividualStorePriv *priv;
ShowActiveData *data;
GtkTreeModel *model;
- EmpathyContact *contact;
GList *iters, *l;
gboolean in_list;
gboolean was_online = TRUE;
@@ -628,7 +655,6 @@ individual_store_contact_update (EmpathyIndividualStore *self,
priv = GET_PRIV (self);
model = GTK_TREE_MODEL (self);
- contact = empathy_contact_dup_from_folks_individual (individual);
iters = individual_store_find_contact (self, individual);
if (!iters)
@@ -717,6 +743,11 @@ individual_store_contact_update (EmpathyIndividualStore *self,
for (l = iters; l && set_model; l = l->next)
{
+ gboolean can_audio_call, can_video_call;
+
+ individual_can_audio_video_call (individual, &can_audio_call,
+ &can_video_call);
+
gtk_tree_store_set (GTK_TREE_STORE (self), l->data,
EMPATHY_INDIVIDUAL_STORE_COL_ICON_STATUS, pixbuf_status,
EMPATHY_INDIVIDUAL_STORE_COL_PIXBUF_AVATAR_VISIBLE, show_avatar,
@@ -730,19 +761,9 @@ individual_store_contact_update (EmpathyIndividualStore *self,
EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, FALSE,
EMPATHY_INDIVIDUAL_STORE_COL_IS_ONLINE, now_online,
EMPATHY_INDIVIDUAL_STORE_COL_IS_SEPARATOR, FALSE,
+ EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, can_audio_call,
+ EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, can_video_call,
-1);
-
- if (contact != NULL)
- {
- gtk_tree_store_set (GTK_TREE_STORE (self), l->data,
- EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_AUDIO,
- EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL,
- empathy_contact_get_capabilities (contact) &
- EMPATHY_CAPABILITIES_VIDEO,
- -1);
- }
}
if (priv->show_active && do_set_active)
@@ -767,7 +788,6 @@ individual_store_contact_update (EmpathyIndividualStore *self,
*/
g_list_foreach (iters, (GFunc) gtk_tree_iter_free, NULL);
g_list_free (iters);
- tp_clear_object (&contact);
}
static void