--- 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