changeset 1803:7d3060070d10

Sort roster unread list by UI (attention) priority
author Mikael Berthe <mikael@lilotux.net>
date Sun, 21 Mar 2010 15:13:48 +0100
parents b135572fcd26
children 35a1250c111a
files mcabber/mcabber/roster.c
diffstat 1 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/roster.c	Sun Mar 21 15:13:33 2010 +0100
+++ b/mcabber/mcabber/roster.c	Sun Mar 21 15:13:48 2010 +0100
@@ -357,6 +357,11 @@
   return p_group;
 }
 
+// Comparison function used to sort the unread list by ui (attn) priority
+static gint _roster_compare_uiprio(roster *a, roster *b) {
+  return (b->ui_prio - a->ui_prio);
+}
+
 // Returns a pointer to the new user, or existing user with that name
 // Note: if onserver is -1, the flag won't be changed.
 GSList *roster_add_user(const char *jid, const char *name, const char *group,
@@ -416,7 +421,8 @@
   if (unread_jid_del(jid)) {
     roster_usr->flags |= ROSTER_FLAG_MSG;
     // Append the roster_usr to unread_list
-    unread_list = g_slist_append(unread_list, roster_usr);
+    unread_list = g_slist_insert_sorted(unread_list, roster_usr,
+                                        (GCompareFunc)&_roster_compare_uiprio);
   }
   roster_usr->type = type;
   roster_usr->subscription = esub;
@@ -606,7 +612,8 @@
       roster_usr->flags |= ROSTER_FLAG_MSG;
       // Append the roster_usr to unread_list, but avoid duplicates
       if (!g_slist_find(unread_list, roster_usr))
-        unread_list = g_slist_append(unread_list, roster_usr);
+        unread_list = g_slist_insert_sorted(unread_list, roster_usr,
+                                        (GCompareFunc)&_roster_compare_uiprio);
     } else {
       if (roster_usr->flags & ROSTER_FLAG_MSG)
         unread_list_modified = TRUE;
@@ -640,7 +647,8 @@
     roster_grp->flags |= ROSTER_FLAG_MSG; // group
     // Append the roster_usr to unread_list, but avoid duplicates
     if (!g_slist_find(unread_list, roster_usr))
-      unread_list = g_slist_append(unread_list, roster_usr);
+      unread_list = g_slist_insert_sorted(unread_list, roster_usr,
+                                      (GCompareFunc)&_roster_compare_uiprio);
   } else {
     // Message flag is FALSE.
     guint msg = FALSE;
@@ -715,6 +723,8 @@
     newval = value;
 
   roster_usr->ui_prio = newval;
+  unread_list = g_slist_sort(unread_list,
+                             (GCompareFunc)&_roster_compare_uiprio);
 }
 
 guint roster_getuiprio(const char *jid, guint special)