diff options
Diffstat (limited to 'libempathy-gtk')
-rw-r--r-- | libempathy-gtk/empathy-individual-store.c | 38 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-store.h | 1 | ||||
-rw-r--r-- | libempathy-gtk/empathy-individual-view.c | 39 |
3 files changed, 78 insertions, 0 deletions
diff --git a/libempathy-gtk/empathy-individual-store.c b/libempathy-gtk/empathy-individual-store.c index 807afb2a2..abd1d02e8 100644 --- a/libempathy-gtk/empathy-individual-store.c +++ b/libempathy-gtk/empathy-individual-store.c @@ -154,6 +154,33 @@ individual_can_audio_video_call (FolksIndividual *individual, *can_video_call = can_video; } +static const gchar * const * +individual_get_client_types (FolksIndividual *individual) +{ + GList *personas, *l; + const gchar * const *types = NULL; + FolksPresenceType presence_type = FOLKS_PRESENCE_TYPE_UNSET; + + personas = folks_individual_get_personas (individual); + for (l = personas; l != NULL; l = l->next) + { + FolksPresence *presence = FOLKS_PRESENCE (l->data); + + if (folks_presence_typecmp (folks_presence_get_presence_type (presence), + presence_type) > 0) + { + TpContact *tp_contact; + + presence_type = folks_presence_get_presence_type (presence); + + tp_contact = tpf_persona_get_contact (TPF_PERSONA (l->data)); + types = tp_contact_get_client_types (tp_contact); + } + } + + return types; +} + static void add_individual_to_store (GtkTreeStore *self, GtkTreeIter *iter, @@ -161,10 +188,13 @@ add_individual_to_store (GtkTreeStore *self, FolksIndividual *individual) { gboolean can_audio_call, can_video_call; + const gchar * const *types; individual_can_audio_video_call (individual, &can_audio_call, &can_video_call); + types = individual_get_client_types (individual); + gtk_tree_store_insert_with_values (self, iter, parent, 0, EMPATHY_INDIVIDUAL_STORE_COL_NAME, folks_aliasable_get_alias (FOLKS_ALIASABLE (individual)), @@ -173,6 +203,7 @@ add_individual_to_store (GtkTreeStore *self, 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, + EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, types, -1); } @@ -738,10 +769,13 @@ individual_store_contact_update (EmpathyIndividualStore *self, for (l = iters; l && set_model; l = l->next) { gboolean can_audio_call, can_video_call; + const gchar * const *types; individual_can_audio_video_call (individual, &can_audio_call, &can_video_call); + types = individual_get_client_types (individual); + 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, @@ -757,6 +791,7 @@ individual_store_contact_update (EmpathyIndividualStore *self, 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, + EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, types, -1); } @@ -859,6 +894,8 @@ individual_personas_changed_cb (FolksIndividual *individual, g_object_set_data (G_OBJECT (contact), "individual", individual); g_signal_connect (contact, "notify::capabilities", (GCallback) individual_store_contact_updated_cb, self); + g_signal_connect (contact, "notify::client-types", + (GCallback) individual_store_contact_updated_cb, self); g_object_unref (contact); } @@ -1494,6 +1531,7 @@ individual_store_setup (EmpathyIndividualStore *self) G_TYPE_BOOLEAN, /* Can make audio calls */ G_TYPE_BOOLEAN, /* Can make video calls */ G_TYPE_BOOLEAN, /* Is a fake group */ + G_TYPE_STRV, /* Client types */ }; priv = GET_PRIV (self); diff --git a/libempathy-gtk/empathy-individual-store.h b/libempathy-gtk/empathy-individual-store.h index debb218ad..246c73b91 100644 --- a/libempathy-gtk/empathy-individual-store.h +++ b/libempathy-gtk/empathy-individual-store.h @@ -64,6 +64,7 @@ typedef enum EMPATHY_INDIVIDUAL_STORE_COL_CAN_AUDIO_CALL, EMPATHY_INDIVIDUAL_STORE_COL_CAN_VIDEO_CALL, EMPATHY_INDIVIDUAL_STORE_COL_IS_FAKE_GROUP, + EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, EMPATHY_INDIVIDUAL_STORE_COL_COUNT, } EmpathyIndividualStoreCol; diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c index 6eb301d34..94e60a41c 100644 --- a/libempathy-gtk/empathy-individual-view.c +++ b/libempathy-gtk/empathy-individual-view.c @@ -1192,6 +1192,36 @@ individual_view_avatar_cell_data_func (GtkTreeViewColumn *tree_column, } static void +individual_view_phone_cell_data_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + EmpathyIndividualView *view) +{ + gboolean is_group; + gboolean is_active; + gchar **types; + + gtk_tree_model_get (model, iter, + EMPATHY_INDIVIDUAL_STORE_COL_IS_GROUP, &is_group, + EMPATHY_INDIVIDUAL_STORE_COL_IS_ACTIVE, &is_active, + EMPATHY_INDIVIDUAL_STORE_COL_CLIENT_TYPES, &types, + -1); + + g_object_set (cell, + "visible", + !is_group + && types != NULL + && g_strv_length (types) > 0 + && !tp_strdiff (types[0], "phone"), + NULL); + + g_strfreev (types); + + individual_view_cell_set_background (view, cell, is_group, is_active); +} + +static void individual_view_text_cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, @@ -1833,6 +1863,15 @@ individual_view_constructed (GObject *object) gtk_tree_view_column_add_attribute (col, cell, "compact", EMPATHY_INDIVIDUAL_STORE_COL_COMPACT); + /* Phone Icon */ + cell = gtk_cell_renderer_pixbuf_new (); + gtk_tree_view_column_pack_start (col, cell, FALSE); + gtk_tree_view_column_set_cell_data_func (col, cell, + (GtkTreeCellDataFunc) individual_view_phone_cell_data_func, + view, NULL); + + g_object_set (cell, "visible", FALSE, "icon-name", "phone", NULL); + /* Audio Call Icon */ cell = empathy_cell_renderer_activatable_new (); gtk_tree_view_column_pack_start (col, cell, FALSE); |