about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/command.c17
-rw-r--r--src/command/commands.c26
-rw-r--r--src/config/preferences.c5
-rw-r--r--src/config/preferences.h1
-rw-r--r--src/config/theme.c1
-rw-r--r--src/ui/console.c9
-rw-r--r--src/ui/rosterwin.c7
-rw-r--r--themes/boothj51
-rw-r--r--themes/complex1
-rw-r--r--themes/simple1
10 files changed, 68 insertions, 1 deletions
diff --git a/src/command/command.c b/src/command/command.c
index 681e4ff7..b6c00803 100644
--- a/src/command/command.c
+++ b/src/command/command.c
@@ -283,6 +283,7 @@ static struct cmd_t command_defs[] =
             "/roster by group|presence|none",
             "/roster order name|presence",
             "/roster room order name|unread",
+            "/roster room unread before|after|off",
             "/roster header char <char>|none",
             "/roster presence indent <indent>",
             "/roster contact char <char>|none",
@@ -327,6 +328,9 @@ static struct cmd_t command_defs[] =
             { "order presence",             "Order roster items by presence, and then by name." },
             { "room order name",            "Order roster rooms by name." },
             { "room order unread",          "Order roster rooms by unread messages, and then by name." },
+            { "room unread before",         "Show unread message count before room in roster." },
+            { "room unread after",          "Show unread message count after room in roster." },
+            { "room unread off",            "Do not show unread message count for rooms in rosters." },
             { "header char <char>",         "Prefix roster headers with specified character." },
             { "header char none",           "Remove roster header character prefix." },
             { "contact char <char>",        "Prefix roster contacts with specified character." },
@@ -1911,6 +1915,7 @@ static Autocomplete roster_char_ac;
 static Autocomplete roster_remove_all_ac;
 static Autocomplete roster_room_ac;
 static Autocomplete roster_room_order_ac;
+static Autocomplete roster_unread_ac;
 static Autocomplete group_ac;
 static Autocomplete bookmark_ac;
 static Autocomplete bookmark_property_ac;
@@ -2212,8 +2217,14 @@ cmd_init(void)
     autocomplete_add(roster_order_ac, "name");
     autocomplete_add(roster_order_ac, "presence");
 
+    roster_unread_ac = autocomplete_new();
+    autocomplete_add(roster_unread_ac, "before");
+    autocomplete_add(roster_unread_ac, "after");
+    autocomplete_add(roster_unread_ac, "off");
+
     roster_room_ac = autocomplete_new();
     autocomplete_add(roster_room_ac, "order");
+    autocomplete_add(roster_room_ac, "unread");
 
     roster_room_order_ac = autocomplete_new();
     autocomplete_add(roster_room_order_ac, "name");
@@ -2492,6 +2503,7 @@ cmd_uninit(void)
     autocomplete_free(roster_by_ac);
     autocomplete_free(roster_order_ac);
     autocomplete_free(roster_room_ac);
+    autocomplete_free(roster_unread_ac);
     autocomplete_free(roster_room_order_ac);
     autocomplete_free(roster_remove_all_ac);
     autocomplete_free(group_ac);
@@ -2702,6 +2714,7 @@ cmd_reset_autocomplete(ProfWin *window)
     autocomplete_reset(roster_by_ac);
     autocomplete_reset(roster_order_ac);
     autocomplete_reset(roster_room_ac);
+    autocomplete_reset(roster_unread_ac);
     autocomplete_reset(roster_room_order_ac);
     autocomplete_reset(roster_remove_all_ac);
     autocomplete_reset(group_ac);
@@ -3115,6 +3128,10 @@ _roster_autocomplete(ProfWin *window, const char *const input)
     if (result) {
         return result;
     }
+    result = autocomplete_param_with_ac(input, "/roster room unread", roster_unread_ac, TRUE);
+    if (result) {
+        return result;
+    }
 
     jabber_conn_status_t conn_status = jabber_get_connection_status();
     if (conn_status == JABBER_CONNECTED) {
diff --git a/src/command/commands.c b/src/command/commands.c
index 7b6fef6d..3ad79778 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -2330,6 +2330,32 @@ cmd_roster(ProfWin *window, const char *const command, gchar **args)
                 cons_bad_cmd_usage(command);
                 return TRUE;
             }
+        } else if (g_strcmp0(args[1], "unread") == 0) {
+            if (g_strcmp0(args[2], "before") == 0) {
+                cons_show("Roster rooms unread message count: before");
+                prefs_set_string(PREF_ROSTER_ROOMS_UNREAD, "before");
+                if (conn_status == JABBER_CONNECTED) {
+                    rosterwin_roster();
+                }
+                return TRUE;
+            } else if (g_strcmp0(args[2], "after") == 0) {
+                cons_show("Roster rooms unread message count: after");
+                prefs_set_string(PREF_ROSTER_ROOMS_UNREAD, "after");
+                if (conn_status == JABBER_CONNECTED) {
+                    rosterwin_roster();
+                }
+                return TRUE;
+            } else if (g_strcmp0(args[2], "off") == 0) {
+                cons_show("Roster rooms unread message count: off");
+                prefs_set_string(PREF_ROSTER_ROOMS_UNREAD, "off");
+                if (conn_status == JABBER_CONNECTED) {
+                    rosterwin_roster();
+                }
+                return TRUE;
+            } else {
+                cons_bad_cmd_usage(command);
+                return TRUE;
+            }
         } else {
             cons_bad_cmd_usage(command);
             return TRUE;
diff --git a/src/config/preferences.c b/src/config/preferences.c
index 7188517a..4b762c04 100644
--- a/src/config/preferences.c
+++ b/src/config/preferences.c
@@ -1048,6 +1048,7 @@ _get_group(preference_t pref)
         case PREF_ROSTER_RESOURCE_JOIN:
         case PREF_ROSTER_ROOMS:
         case PREF_ROSTER_ROOMS_ORDER:
+        case PREF_ROSTER_ROOMS_UNREAD:
         case PREF_RESOURCE_TITLE:
         case PREF_RESOURCE_MESSAGE:
         case PREF_ENC_WARN:
@@ -1246,6 +1247,8 @@ _get_key(preference_t pref)
             return "roster.rooms";
         case PREF_ROSTER_ROOMS_ORDER:
             return "roster.rooms.order";
+        case PREF_ROSTER_ROOMS_UNREAD:
+            return "roster.rooms.unread";
         case PREF_RESOURCE_TITLE:
             return "resource.title";
         case PREF_RESOURCE_MESSAGE:
@@ -1335,6 +1338,8 @@ _get_default_string(preference_t pref)
             return "presence";
         case PREF_ROSTER_ROOMS_ORDER:
             return "name";
+        case PREF_ROSTER_ROOMS_UNREAD:
+            return "after";
         case PREF_TIME_CONSOLE:
             return "%H:%M:%S";
         case PREF_TIME_CHAT:
diff --git a/src/config/preferences.h b/src/config/preferences.h
index a46acf6a..06c2c67b 100644
--- a/src/config/preferences.h
+++ b/src/config/preferences.h
@@ -75,6 +75,7 @@ typedef enum {
     PREF_ROSTER_RESOURCE_JOIN,
     PREF_ROSTER_ROOMS,
     PREF_ROSTER_ROOMS_ORDER,
+    PREF_ROSTER_ROOMS_UNREAD,
     PREF_MUC_PRIVILEGES,
     PREF_PRESENCE,
     PREF_WRAP,
diff --git a/src/config/theme.c b/src/config/theme.c
index c0a6b134..6460f65d 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -321,6 +321,7 @@ _load_preferences(void)
     _set_boolean_preference("roster.priority", PREF_ROSTER_PRIORITY);
     _set_boolean_preference("roster.rooms", PREF_ROSTER_ROOMS);
     _set_string_preference("roster.rooms.order", PREF_ROSTER_ROOMS_ORDER);
+    _set_string_preference("roster.rooms.unread", PREF_ROSTER_ROOMS_ORDER);
     if (g_key_file_has_key(theme, "ui", "roster.size", NULL)) {
         gint roster_size = g_key_file_get_integer(theme, "ui", "roster.size", NULL);
         prefs_set_roster_size(roster_size);
diff --git a/src/ui/console.c b/src/ui/console.c
index 42001960..4656b4e3 100644
--- a/src/ui/console.c
+++ b/src/ui/console.c
@@ -1341,6 +1341,15 @@ cons_roster_setting(void)
     cons_show("Roster rooms order (/roster)     : %s", rooms_order);
     prefs_free_string(rooms_order);
 
+    char *roomsunread = prefs_get_string(PREF_ROSTER_ROOMS_UNREAD);
+    if (g_strcmp0(roomsunread, "before") == 0) {
+        cons_show("Roster rooms unread (/roster)    : before");
+    } else if (g_strcmp0(roomsunread, "after") == 0) {
+        cons_show("Roster rooms unread (/roster)    : after");
+    } else {
+        cons_show("Roster rooms unread (/roster)    : OFF");
+    }
+
     int size = prefs_get_roster_size();
     cons_show("Roster size (/roster)            : %d", size);
 
diff --git a/src/ui/rosterwin.c b/src/ui/rosterwin.c
index 06ac4673..5b18ec95 100644
--- a/src/ui/rosterwin.c
+++ b/src/ui/rosterwin.c
@@ -483,10 +483,15 @@ _rosterwin_room(ProfLayoutSplit *layout, ProfMucWin *mucwin)
         g_string_append_printf(msg, "%c", ch);
     }
 
+    char *unreadpos = prefs_get_string(PREF_ROSTER_ROOMS_UNREAD);
+    if ((g_strcmp0(unreadpos, "before") == 0) && mucwin->unread > 0) {
+        g_string_append_printf(msg, "(%d) ", mucwin->unread);
+    }
     g_string_append(msg, mucwin->roomjid);
-    if (mucwin->unread > 0) {
+    if ((g_strcmp0(unreadpos, "after") == 0) && mucwin->unread > 0) {
         g_string_append_printf(msg, " (%d)", mucwin->unread);
     }
+    prefs_free_string(unreadpos);
 
     win_sub_newline_lazy(layout->subwin);
     gboolean wrap = prefs_get_boolean(PREF_ROSTER_WRAP);
diff --git a/themes/boothj5 b/themes/boothj5
index 83f07fa9..31c3586c 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -111,6 +111,7 @@ roster.presence.indent=-1
 roster.status=true
 roster.rooms=true
 roster.rooms.order=name
+roster.rooms.unread=after
 occupants=true
 occupants.size=15
 occupants.jid=false
diff --git a/themes/complex b/themes/complex
index dc98217e..16aa96a7 100644
--- a/themes/complex
+++ b/themes/complex
@@ -39,6 +39,7 @@ roster.presence.indent=1
 roster.status=true
 roster.rooms=true
 roster.rooms.order=unread
+roster.rooms.unread=after
 privileges=true
 presence=true
 intype=true
diff --git a/themes/simple b/themes/simple
index 2f9ace50..39423e25 100644
--- a/themes/simple
+++ b/themes/simple
@@ -31,6 +31,7 @@ roster.resource=false
 roster.presence=false
 roster.status=false
 roster.rooms=false
+roster.rooms.unread=off
 privileges=false
 presence=false
 intype=false