# HG changeset patch # User Michał Kępień # Date 1537735949 -7200 # Node ID 4ddd6f5c3ffcf471ed93e49fa1b392cf997f9926 # Parent d2111a776b6636e7efa1140a21f960224afe2bd5 Add support for displaying the number of unread messages for each roster entry diff -r d2111a776b66 -r 4ddd6f5c3ffc mcabber/mcabber/roster.c --- 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) diff -r d2111a776b66 -r 4ddd6f5c3ffc mcabber/mcabber/roster.h --- 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); diff -r d2111a776b66 -r 4ddd6f5c3ffc mcabber/mcabber/screen.c --- 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(); diff -r d2111a776b66 -r 4ddd6f5c3ffc mcabber/mcabberrc.example --- 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 ) #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