diff options
author | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-09-17 20:10:32 +0800 |
---|---|---|
committer | Guillaume Desmottes <guillaume.desmottes@collabora.co.uk> | 2010-09-27 21:20:19 +0800 |
commit | a2851c345723360e779b9adc4fe17684136f40b7 (patch) | |
tree | 05fba549c3c52b00bf44ea1c6bec51a65e89f1b4 /libempathy | |
parent | 362d847a53dfa9c344781065c3b1af5952a405e3 (diff) | |
download | gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar.gz gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar.bz2 gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar.lz gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar.xz gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.tar.zst gsoc2013-empathy-a2851c345723360e779b9adc4fe17684136f40b7.zip |
Prioritize default individual for chats using capabilities (#629912)
Diffstat (limited to 'libempathy')
-rw-r--r-- | libempathy/empathy-contact.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/libempathy/empathy-contact.c b/libempathy/empathy-contact.c index ab3fba538..642f087df 100644 --- a/libempathy/empathy-contact.c +++ b/libempathy/empathy-contact.c @@ -1770,6 +1770,40 @@ voip_cmp_func (EmpathyContact *a, return 0; } +static gint +ft_cmp_func (EmpathyContact *a, + EmpathyContact *b) +{ + gboolean can_send_files_a, can_send_files_b; + + can_send_files_a = empathy_contact_can_send_files (a); + can_send_files_b = empathy_contact_can_send_files (b); + + if (can_send_files_a == can_send_files_b) + return 0; + else if (can_send_files_a) + return -1; + else + return 1; +} + +static gint +rfb_stream_tube_cmp_func (EmpathyContact *a, + EmpathyContact *b) +{ + gboolean rfb_a, rfb_b; + + rfb_a = empathy_contact_can_use_rfb_stream_tube (a); + rfb_b = empathy_contact_can_use_rfb_stream_tube (b); + + if (rfb_a == rfb_b) + return 0; + else if (rfb_a) + return -1; + else + return 1; +} + /* Sort by presence as with presence_cmp_func(), but if the two contacts have * the same presence, prefer the one which can do both audio *and* video calls, * over the one which can only do one of the two. */ @@ -1784,6 +1818,33 @@ voip_sort_func (EmpathyContact *a, EmpathyContact *b) return voip_cmp_func (a, b); } +/* Sort by presence as with presence_cmp_func() and then break ties using the + * most "capable" individual. So users will be able to pick more actions on + * the contact in the "Contact" menu of the chat window. */ +static gint +chat_sort_func (EmpathyContact *a, + EmpathyContact *b) +{ + gint result; + + result = presence_cmp_func (a, b); + if (result != 0) + return result; + + /* Prefer individual supporting file transfer */ + result = ft_cmp_func (a, b); + if (result != 0) + return result; + + /* Check audio/video capabilities */ + result = voip_cmp_func (a, b); + if (result != 0) + return result; + + /* Check 'Share my destop' feature */ + return rfb_stream_tube_cmp_func (a, b); +} + static GCompareFunc get_sort_func_for_action (EmpathyActionType action_type) { @@ -1793,6 +1854,7 @@ get_sort_func_for_action (EmpathyActionType action_type) case EMPATHY_ACTION_VIDEO_CALL: return (GCompareFunc) voip_sort_func; case EMPATHY_ACTION_CHAT: + return (GCompareFunc) chat_sort_func; case EMPATHY_ACTION_VIEW_LOGS: case EMPATHY_ACTION_SEND_FILE: case EMPATHY_ACTION_SHARE_MY_DESKTOP: |