changeset 2324:4ddd6f5c3ffc

Add support for displaying the number of unread messages for each roster entry
author Michał Kępień <bitbucket@kempniu.pl>
date Sun, 23 Sep 2018 22:52:29 +0200
parents d2111a776b66
children c5665d3191aa
files mcabber/mcabber/roster.c mcabber/mcabber/roster.h mcabber/mcabber/screen.c mcabber/mcabberrc.example
diffstat 4 files changed, 53 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/roster.c	Thu Mar 22 19:27:48 2018 +0100
+++ b/mcabber/mcabber/roster.c	Sun Sep 23 22:52:29 2018 +0200
@@ -108,6 +108,7 @@
   /* Flag used for the UI */
   guint flags;
   guint ui_prio;  // Boolean, positive if "attention" is requested
+  guint unread;
 
   // list: user -> points to his group; group -> points to its users list
   GSList *list;
@@ -729,6 +730,27 @@
   }
 }
 
+//  roster_msg_update_unread()
+// If increment is true, increment the unread messages count for jid by 1.
+// If increment is false, reset the unread messages count for jid to 0.
+void roster_msg_update_unread(const char *jid, gboolean increment)
+{
+  GSList *sl_user;
+  roster *roster_usr;
+
+  sl_user = roster_find(jid, jidsearch,
+                        ROSTER_TYPE_USER|ROSTER_TYPE_ROOM|ROSTER_TYPE_AGENT);
+  if (!sl_user)
+    return;
+
+  roster_usr = (roster*)sl_user->data;
+
+  if (increment)
+    roster_usr->unread++;
+  else
+    roster_usr->unread = 0;
+}
+
 //  roster_setuiprio(jid, special, prio_value, action)
 // Set the "attention" priority value for the given roster item.
 // Note that this function doesn't create the roster item if it doesn't exist.
@@ -1541,6 +1563,12 @@
   return roster_usr->ui_prio;
 }
 
+guint buddy_getunread(gpointer rosterdata)
+{
+  roster *roster_usr = rosterdata;
+  return roster_usr->unread;
+}
+
 //  buddy_setonserverflag()
 // Set the on_server flag
 void buddy_setonserverflag(gpointer rosterdata, guint onserver)
--- a/mcabber/mcabber/roster.h	Thu Mar 22 19:27:48 2018 +0100
+++ b/mcabber/mcabber/roster.h	Sun Sep 23 22:52:29 2018 +0200
@@ -177,6 +177,7 @@
                          const char *realjid);
 void    roster_setflags(const char *jid, guint flags, guint value);
 void    roster_msg_setflag(const char *jid, guint special, guint value);
+void    roster_msg_update_unread(const char *jid, gboolean increment);
 void    roster_setuiprio(const char *jid, guint special, guint value,
                          enum setuiprio_ops action);
 guint   roster_getuiprio(const char *jid, guint special);
@@ -245,6 +246,7 @@
 void    buddy_setflags(gpointer rosterdata, guint flags, guint value);
 guint   buddy_getflags(gpointer rosterdata);
 guint   buddy_getuiprio(gpointer rosterdata);
+guint   buddy_getunread(gpointer rosterdata);
 void    buddy_setonserverflag(gpointer rosterdata, guint onserver);
 guint   buddy_getonserverflag(gpointer rosterdata);
 GList  *buddy_search_jid(const char *jid);
--- a/mcabber/mcabber/screen.c	Thu Mar 22 19:27:48 2018 +0100
+++ b/mcabber/mcabber/screen.c	Sun Sep 23 22:52:29 2018 +0200
@@ -1461,6 +1461,7 @@
     return;
   }
 
+  roster_msg_update_unread(bjid, FALSE);
   scr_show_window(bjid, FALSE);
 }
 
@@ -1576,9 +1577,11 @@
   }
   if (!special) {
     if (clearmsgflg) {
+      roster_msg_update_unread(winId, FALSE);
       roster_msg_setflag(winId, FALSE, FALSE);
       scr_update_roster();
     } else if (setmsgflg) {
+      roster_msg_update_unread(winId, TRUE);
       roster_msg_setflag(winId, FALSE, TRUE);
       scr_update_roster();
     }
@@ -2095,7 +2098,7 @@
 void scr_draw_roster(void)
 {
   static int offset = 0;
-  char *name, *rline;
+  char *name, *rline, *unread;
   int maxx, maxy;
   GList *buddy;
   int i, n;
@@ -2174,6 +2177,7 @@
   }
 
   name = g_new0(char, 4*Roster_Width);
+  unread = g_new0(char, Roster_Width+1);;
   rline = g_new0(char, 4*Roster_Width+1);
 
   buddy = buddylist;
@@ -2267,10 +2271,18 @@
       }
     }
 
-    if (Roster_Width > prefix_length)
+    name[0] = 0;
+    unread[0] = 0;
+    if (Roster_Width > prefix_length) {
       g_utf8_strncpy(name, buddy_getname(BUDDATA(buddy)), Roster_Width-prefix_length);
-    else
-      name[0] = 0;
+      if (settings_opt_get_int("roster_show_unread_count")) {
+        guint unread_count = buddy_getunread(BUDDATA(buddy));
+        glong name_length = g_utf8_strlen(name, 4*Roster_Width);
+        if (unread_count > 0 && Roster_Width > prefix_length + name_length) {
+          snprintf(unread, Roster_Width-(prefix_length+name_length)+1, " (%u)", unread_count);
+        }
+      }
+    }
 
     if (pending == '#') {
       // Attention sign?
@@ -2306,8 +2318,8 @@
           sepright = '}';
         }
       }
-      snprintf(rline, 4*Roster_Width, "%s%lc%c%c%c %s",
-               space, pending, sepleft, status, sepright, name);
+      snprintf(rline, 4*Roster_Width, "%s%lc%c%c%c %s%s",
+               space, pending, sepleft, status, sepright, name, unread);
     }
 
     rline_locale = from_utf8(rline);
@@ -2317,6 +2329,7 @@
   }
 
   g_free(rline);
+  g_free(unread);
   g_free(name);
   top_panel(inputPanel);
   update_panels();
--- a/mcabber/mcabberrc.example	Thu Mar 22 19:27:48 2018 +0100
+++ b/mcabber/mcabberrc.example	Sun Sep 23 22:52:29 2018 +0200
@@ -510,6 +510,10 @@
 # - 3: "name" (if the name is the same as the JID, use <jid/res>)
 #set buddy_format = 2
 #
+# Set 'roster_show_unread_count' to 1 if you want the number of unread messages,
+# if there are any, to be displayed for every roster entry (default: 0).
+#set roster_show_unread_count = 0
+#
 # Time format:
 # - 0: (default) Date and time
 # - 1: Time only