about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/commands.c4
-rw-r--r--src/config/theme.c72
-rw-r--r--src/config/theme.h22
-rw-r--r--src/event/server_events.c4
-rw-r--r--src/ui/rosterwin.c44
-rw-r--r--theme_template18
-rw-r--r--themes/aqua18
-rw-r--r--themes/batman18
-rw-r--r--themes/boothj518
-rw-r--r--themes/forest18
-rw-r--r--themes/hacker18
-rw-r--r--themes/headache18
-rw-r--r--themes/joker18
-rw-r--r--themes/mono18
-rw-r--r--themes/orange18
-rw-r--r--themes/original18
-rw-r--r--themes/original_bright18
-rw-r--r--themes/shade18
-rw-r--r--themes/spawn18
-rw-r--r--themes/whiteness18
20 files changed, 411 insertions, 5 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index 447bd4b4..7b6fef6d 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1071,6 +1071,7 @@ cmd_close(ProfWin *window, const char *const command, gchar **args)
         } else {
             cons_show("Closed %d windows.", count);
         }
+        rosterwin_roster();
         return TRUE;
     }
 
@@ -1083,6 +1084,7 @@ cmd_close(ProfWin *window, const char *const command, gchar **args)
         } else {
             cons_show("Closed %d windows.", count);
         }
+        rosterwin_roster();
         return TRUE;
     }
 
@@ -1141,6 +1143,7 @@ cmd_close(ProfWin *window, const char *const command, gchar **args)
             wins_tidy();
         }
 
+        rosterwin_roster();
         return TRUE;
     } else {
         if (g_strcmp0(args[0], "console") == 0) {
@@ -1175,6 +1178,7 @@ cmd_close(ProfWin *window, const char *const command, gchar **args)
             wins_tidy();
         }
 
+        rosterwin_roster();
         return TRUE;
     }
 }
diff --git a/src/config/theme.c b/src/config/theme.c
index 63c42cea..c0a6b134 100644
--- a/src/config/theme.c
+++ b/src/config/theme.c
@@ -448,6 +448,60 @@ _theme_find(const char *const theme_name)
 }
 
 theme_item_t
+theme_roster_unread_presence_attrs(const char *const presence)
+{
+    if (g_strcmp0(presence, "online") == 0) {
+        return THEME_ROSTER_ONLINE_UNREAD;
+    } else if (g_strcmp0(presence, "away") == 0) {
+        return THEME_ROSTER_AWAY_UNREAD;
+    } else if (g_strcmp0(presence, "chat") == 0) {
+        return THEME_ROSTER_CHAT_UNREAD;
+    } else if (g_strcmp0(presence, "dnd") == 0) {
+        return THEME_ROSTER_DND_UNREAD;
+    } else if (g_strcmp0(presence, "xa") == 0) {
+        return THEME_ROSTER_XA_UNREAD;
+    } else {
+        return THEME_ROSTER_OFFLINE_UNREAD;
+    }
+}
+
+theme_item_t
+theme_roster_active_presence_attrs(const char *const presence)
+{
+    if (g_strcmp0(presence, "online") == 0) {
+        return THEME_ROSTER_ONLINE_ACTIVE;
+    } else if (g_strcmp0(presence, "away") == 0) {
+        return THEME_ROSTER_AWAY_ACTIVE;
+    } else if (g_strcmp0(presence, "chat") == 0) {
+        return THEME_ROSTER_CHAT_ACTIVE;
+    } else if (g_strcmp0(presence, "dnd") == 0) {
+        return THEME_ROSTER_DND_ACTIVE;
+    } else if (g_strcmp0(presence, "xa") == 0) {
+        return THEME_ROSTER_XA_ACTIVE;
+    } else {
+        return THEME_ROSTER_OFFLINE_ACTIVE;
+    }
+}
+
+theme_item_t
+theme_roster_presence_attrs(const char *const presence)
+{
+    if (g_strcmp0(presence, "online") == 0) {
+        return THEME_ROSTER_ONLINE;
+    } else if (g_strcmp0(presence, "away") == 0) {
+        return THEME_ROSTER_AWAY;
+    } else if (g_strcmp0(presence, "chat") == 0) {
+        return THEME_ROSTER_CHAT;
+    } else if (g_strcmp0(presence, "dnd") == 0) {
+        return THEME_ROSTER_DND;
+    } else if (g_strcmp0(presence, "xa") == 0) {
+        return THEME_ROSTER_XA;
+    } else {
+        return THEME_ROSTER_OFFLINE;
+    }
+}
+
+theme_item_t
 theme_main_presence_attrs(const char *const presence)
 {
     if (g_strcmp0(presence, "online") == 0) {
@@ -554,6 +608,24 @@ theme_attrs(theme_item_t attrs)
     case THEME_OTR_TRUSTED:             _theme_prep_fgnd("otr.trusted",             "green",    lookup_str, &bold); break;
     case THEME_OTR_UNTRUSTED:           _theme_prep_fgnd("otr.untrusted",           "yellow",   lookup_str, &bold); break;
     case THEME_ROSTER_HEADER:           _theme_prep_fgnd("roster.header",           "yellow",   lookup_str, &bold); break;
+    case THEME_ROSTER_ONLINE:           _theme_prep_fgnd("roster.online",           "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_OFFLINE:          _theme_prep_fgnd("roster.offline",          "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_CHAT:             _theme_prep_fgnd("roster.chat",             "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_AWAY:             _theme_prep_fgnd("roster.away",             "cyan",     lookup_str, &bold); break;
+    case THEME_ROSTER_DND:              _theme_prep_fgnd("roster.dnd",              "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_XA:               _theme_prep_fgnd("roster.xa",               "cyan",     lookup_str, &bold); break;
+    case THEME_ROSTER_ONLINE_ACTIVE:    _theme_prep_fgnd("roster.online.active",    "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_OFFLINE_ACTIVE:   _theme_prep_fgnd("roster.offline.active",   "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_CHAT_ACTIVE:      _theme_prep_fgnd("roster.chat.active",      "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_AWAY_ACTIVE:      _theme_prep_fgnd("roster.away.active",      "cyan",     lookup_str, &bold); break;
+    case THEME_ROSTER_DND_ACTIVE:       _theme_prep_fgnd("roster.dnd.active",       "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_XA_ACTIVE:        _theme_prep_fgnd("roster.xa.active",        "cyan",     lookup_str, &bold); break;
+    case THEME_ROSTER_ONLINE_UNREAD:    _theme_prep_fgnd("roster.online.unread",    "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_OFFLINE_UNREAD:   _theme_prep_fgnd("roster.offline.unread",   "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_CHAT_UNREAD:      _theme_prep_fgnd("roster.chat.unread",      "green",    lookup_str, &bold); break;
+    case THEME_ROSTER_AWAY_UNREAD:      _theme_prep_fgnd("roster.away.unread",      "cyan",     lookup_str, &bold); break;
+    case THEME_ROSTER_DND_UNREAD:       _theme_prep_fgnd("roster.dnd.unread",       "red",      lookup_str, &bold); break;
+    case THEME_ROSTER_XA_UNREAD:        _theme_prep_fgnd("roster.xa.unread",        "cyan",     lookup_str, &bold); break;
     case THEME_ROSTER_ROOM:             _theme_prep_fgnd("roster.room",             "green",    lookup_str, &bold); break;
     case THEME_ROSTER_ROOM_UNREAD:      _theme_prep_fgnd("roster.room.unread",      "green",    lookup_str, &bold); break;
     case THEME_OCCUPANTS_HEADER:        _theme_prep_fgnd("occupants.header",        "yellow",   lookup_str, &bold); break;
diff --git a/src/config/theme.h b/src/config/theme.h
index c0380354..7b86d1a7 100644
--- a/src/config/theme.h
+++ b/src/config/theme.h
@@ -85,6 +85,24 @@ typedef enum {
     THEME_OTR_UNTRUSTED,
     THEME_OCCUPANTS_HEADER,
     THEME_ROSTER_HEADER,
+    THEME_ROSTER_ONLINE,
+    THEME_ROSTER_OFFLINE,
+    THEME_ROSTER_AWAY,
+    THEME_ROSTER_CHAT,
+    THEME_ROSTER_DND,
+    THEME_ROSTER_XA,
+    THEME_ROSTER_ONLINE_ACTIVE,
+    THEME_ROSTER_OFFLINE_ACTIVE,
+    THEME_ROSTER_AWAY_ACTIVE,
+    THEME_ROSTER_CHAT_ACTIVE,
+    THEME_ROSTER_DND_ACTIVE,
+    THEME_ROSTER_XA_ACTIVE,
+    THEME_ROSTER_ONLINE_UNREAD,
+    THEME_ROSTER_OFFLINE_UNREAD,
+    THEME_ROSTER_AWAY_UNREAD,
+    THEME_ROSTER_CHAT_UNREAD,
+    THEME_ROSTER_DND_UNREAD,
+    THEME_ROSTER_XA_UNREAD,
     THEME_ROSTER_ROOM,
     THEME_ROSTER_ROOM_UNREAD,
     THEME_RECEIPT_SENT,
@@ -113,6 +131,10 @@ gboolean theme_load(const char *const theme_name);
 GSList* theme_list(void);
 void theme_close(void);
 int theme_attrs(theme_item_t attrs);
+
 theme_item_t theme_main_presence_attrs(const char *const presence);
+theme_item_t theme_roster_unread_presence_attrs(const char *const presence);
+theme_item_t theme_roster_active_presence_attrs(const char *const presence);
+theme_item_t theme_roster_presence_attrs(const char *const presence);
 
 #endif
diff --git a/src/event/server_events.c b/src/event/server_events.c
index 147ea6ce..872dc74b 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -427,6 +427,7 @@ sv_ev_incoming_message(char *barejid, char *resource, char *message, char *pgp_m
     } else {
         _sv_ev_incoming_otr(chatwin, new_win, barejid, resource, message, timestamp);
     }
+    rosterwin_roster();
     return;
 #endif
 #endif
@@ -435,6 +436,7 @@ sv_ev_incoming_message(char *barejid, char *resource, char *message, char *pgp_m
 #ifdef HAVE_LIBOTR
 #ifndef HAVE_LIBGPGME
     _sv_ev_incoming_otr(chatwin, new_win, barejid, resource, message, timestamp);
+    rosterwin_roster();
     return;
 #endif
 #endif
@@ -447,6 +449,7 @@ sv_ev_incoming_message(char *barejid, char *resource, char *message, char *pgp_m
     } else {
         _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, timestamp);
     }
+    rosterwin_roster();
     return;
 #endif
 #endif
@@ -455,6 +458,7 @@ sv_ev_incoming_message(char *barejid, char *resource, char *message, char *pgp_m
 #ifndef HAVE_LIBOTR
 #ifndef HAVE_LIBGPGME
     _sv_ev_incoming_plain(chatwin, new_win, barejid, resource, message, timestamp);
+    rosterwin_roster();
     return;
 #endif
 #endif
diff --git a/src/ui/rosterwin.c b/src/ui/rosterwin.c
index afafdd86..b05f7b42 100644
--- a/src/ui/rosterwin.c
+++ b/src/ui/rosterwin.c
@@ -42,6 +42,12 @@
 #include "config/preferences.h"
 #include "roster_list.h"
 
+typedef enum {
+    ROSTER_CONTACT,
+    ROSTER_CONTACT_ACTIVE,
+    ROSTER_CONTACT_UNREAD
+} roster_contact_theme_t;
+
 static void
 _rosterwin_presence(ProfLayoutSplit *layout, theme_item_t colour, const char *presence, const char *status,
     int current_indent)
@@ -126,7 +132,7 @@ _rosterwin_presence(ProfLayoutSplit *layout, theme_item_t colour, const char *pr
 }
 
 static void
-_rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_indent)
+_rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_indent, roster_contact_theme_t theme_type)
 {
     gboolean join = prefs_get_boolean(PREF_ROSTER_RESOURCE_JOIN);
 
@@ -135,7 +141,13 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
         if (join && (g_list_length(resources) == 1)) {
             Resource *resource = resources->data;
             const char *resource_presence = string_from_resource_presence(resource->presence);
-            theme_item_t resource_presence_colour = theme_main_presence_attrs(resource_presence);
+
+            theme_item_t resource_presence_colour;
+            switch (theme_type) {
+            case ROSTER_CONTACT:        resource_presence_colour = theme_roster_presence_attrs(resource_presence); break;
+            case ROSTER_CONTACT_ACTIVE: resource_presence_colour = theme_roster_active_presence_attrs(resource_presence); break;
+            case ROSTER_CONTACT_UNREAD: resource_presence_colour = theme_roster_unread_presence_attrs(resource_presence); break;
+            }
 
             wattron(layout->subwin, theme_attrs(resource_presence_colour));
             GString *msg = g_string_new("");
@@ -167,7 +179,13 @@ _rosterwin_resources(ProfLayoutSplit *layout, PContact contact, int current_inde
             while (curr_resource) {
                 Resource *resource = curr_resource->data;
                 const char *resource_presence = string_from_resource_presence(resource->presence);
-                theme_item_t resource_presence_colour = theme_main_presence_attrs(resource_presence);
+
+                theme_item_t resource_presence_colour;
+                switch (theme_type) {
+                case ROSTER_CONTACT:        resource_presence_colour = theme_roster_presence_attrs(resource_presence); break;
+                case ROSTER_CONTACT_ACTIVE: resource_presence_colour = theme_roster_active_presence_attrs(resource_presence); break;
+                case ROSTER_CONTACT_UNREAD: resource_presence_colour = theme_roster_unread_presence_attrs(resource_presence); break;
+                }
 
                 wattron(layout->subwin, theme_attrs(resource_presence_colour));
                 GString *msg = g_string_new(" ");
@@ -213,8 +231,24 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
     const char *name = p_contact_name_or_jid(contact);
     const char *presence = p_contact_presence(contact);
     const char *status = p_contact_status(contact);
+    const char *barejid = p_contact_barejid(contact);
 
-    theme_item_t presence_colour = theme_main_presence_attrs(presence);
+    roster_contact_theme_t theme_type = ROSTER_CONTACT;
+    ProfChatWin *chatwin = wins_get_chat(barejid);
+    if (chatwin) {
+        if (chatwin->unread > 0) {
+            theme_type = ROSTER_CONTACT_UNREAD;
+        } else {
+            theme_type = ROSTER_CONTACT_ACTIVE;
+        }
+    }
+
+    theme_item_t presence_colour;
+    switch (theme_type) {
+    case ROSTER_CONTACT:        presence_colour = theme_roster_presence_attrs(presence); break;
+    case ROSTER_CONTACT_ACTIVE: presence_colour = theme_roster_active_presence_attrs(presence); break;
+    case ROSTER_CONTACT_UNREAD: presence_colour = theme_roster_unread_presence_attrs(presence); break;
+    }
 
     wattron(layout->subwin, theme_attrs(presence_colour));
     GString *msg = g_string_new(" ");
@@ -239,7 +273,7 @@ _rosterwin_contact(ProfLayoutSplit *layout, PContact contact)
     wattroff(layout->subwin, theme_attrs(presence_colour));
 
     if (prefs_get_boolean(PREF_ROSTER_RESOURCE)) {
-        _rosterwin_resources(layout, contact, current_indent);
+        _rosterwin_resources(layout, contact, current_indent, theme_type);
     } else if (prefs_get_boolean(PREF_ROSTER_PRESENCE) || prefs_get_boolean(PREF_ROSTER_STATUS)) {
         _rosterwin_presence(layout, presence_colour, presence, status, current_indent);
     }
diff --git a/theme_template b/theme_template
index dc74471f..a0382029 100644
--- a/theme_template
+++ b/theme_template
@@ -46,6 +46,24 @@ roommention=
 me=
 them=
 roster.header=
+roster.chat=
+roster.online=
+roster.away=
+roster.xa=
+roster.dnd=
+roster.offline=
+roster.chat.active=
+roster.online.active=
+roster.away.active=
+roster.xa.active=
+roster.dnd.active=
+roster.offline.active=
+roster.chat.unread=
+roster.online.unread=
+roster.away.unread=
+roster.xa.unread=
+roster.dnd.unread=
+roster.offline.unread=
 roster.room=
 roster.room.unread=
 occupants.header=
diff --git a/themes/aqua b/themes/aqua
index 76dd53a6..7ca54abd 100644
--- a/themes/aqua
+++ b/themes/aqua
@@ -46,6 +46,24 @@ roommention=bold_blue
 me=cyan
 them=white
 roster.header=bold_white
+roster.chat=white
+roster.online=bold_cyan
+roster.away=bold_blue
+roster.xa=cyan
+roster.dnd=blue
+roster.offline=bold_black
+roster.chat.active=white
+roster.online.active=bold_cyan
+roster.away.active=bold_blue
+roster.xa.active=cyan
+roster.dnd.active=blue
+roster.offline.active=bold_black
+roster.chat.unread=white
+roster.online.unread=bold_cyan
+roster.away.unread=bold_blue
+roster.xa.unread=cyan
+roster.dnd.unread=blue
+roster.offline.unread=bold_black
 roster.room=cyan
 roster.room.unread=bold_cyan
 occupants.header=bold_white
diff --git a/themes/batman b/themes/batman
index f856ebb0..d5fb1dee 100644
--- a/themes/batman
+++ b/themes/batman
@@ -46,6 +46,24 @@ subscribed=magenta
 unsubscribed=black_bold
 roommention=cyan
 roster.header=yellow
+roster.chat=green
+roster.online=green
+roster.away=yellow
+roster.xa=yellow
+roster.dnd=green
+roster.offline=bold_black
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=yellow
+roster.xa.active=yellow
+roster.dnd.active=green
+roster.offline.active=bold_black
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=yellow
+roster.xa.unread=yellow
+roster.dnd.unread=green
+roster.offline.unread=bold_black
 roster.room=green
 roster.room.unread=green
 occupants.header=yellow
diff --git a/themes/boothj5 b/themes/boothj5
index 4786b1e6..1f356161 100644
--- a/themes/boothj5
+++ b/themes/boothj5
@@ -46,6 +46,24 @@ roommention=bold_red
 me=blue
 them=bold_green
 roster.header=bold_yellow
+roster.chat=white
+roster.online=green
+roster.away=cyan
+roster.xa=blue
+roster.dnd=magenta
+roster.offline=red
+roster.chat.active=white
+roster.online.active=green
+roster.away.active=cyan
+roster.xa.active=blue
+roster.dnd.active=magenta
+roster.offline.active=red
+roster.chat.unread=bold_white
+roster.online.unread=bold_green
+roster.away.unread=bold_cyan
+roster.xa.unread=bold_blue
+roster.dnd.unread=bold_magenta
+roster.offline.unread=bold_red
 roster.room=green
 roster.room.unread=bold_green
 occupants.header=bold_yellow
diff --git a/themes/forest b/themes/forest
index 65407c93..92cbcc5f 100644
--- a/themes/forest
+++ b/themes/forest
@@ -46,6 +46,24 @@ roommention=bold_cyan
 me=blue
 them=bold_blue
 roster.header=bold_green
+roster.chat=green
+roster.online=green
+roster.away=blue
+roster.xa=blue
+roster.dnd=bold_black
+roster.offline=bold_black
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=blue
+roster.xa.active=blue
+roster.dnd.active=bold_black
+roster.offline.active=bold_black
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=blue
+roster.xa.unread=blue
+roster.dnd.unread=bold_black
+roster.offline.unread=bold_black
 roster.room=green
 roster.room.unread=bold_green
 occupants.header=bold_green
diff --git a/themes/hacker b/themes/hacker
index ff726544..09baebb9 100644
--- a/themes/hacker
+++ b/themes/hacker
@@ -46,6 +46,24 @@ roommention=bold_green
 me=green
 them=bold_green
 roster.header=bold_green
+roster.chat=bold_green
+roster.online=bold_green
+roster.away=green
+roster.xa=green
+roster.dnd=green
+roster.offline=green
+roster.chat.active=bold_green
+roster.online.active=bold_green
+roster.away.active=green
+roster.xa.active=green
+roster.dnd.active=green
+roster.offline.active=green
+roster.chat.unread=bold_green
+roster.online.unread=bold_green
+roster.away.unread=green
+roster.xa.unread=green
+roster.dnd.unread=green
+roster.offline.unread=green
 roster.room=green
 roster.room=bold_green
 occupants.header=bold_green
diff --git a/themes/headache b/themes/headache
index e9c63cbf..ed4b7e72 100644
--- a/themes/headache
+++ b/themes/headache
@@ -46,6 +46,24 @@ roommention=bold_green
 me=white
 them=white
 roster.header=bold_cyan
+roster.chat=green
+roster.online=red
+roster.away=cyan
+roster.xa=cyan
+roster.dnd=magenta
+roster.offline=green
+roster.chat.active=green
+roster.online.active=red
+roster.away.active=cyan
+roster.xa.active=cyan
+roster.dnd.active=magenta
+roster.offline.active=green
+roster.chat.unread=bold_green
+roster.online.unread=bold_red
+roster.away.unread=bold_cyan
+roster.xa.unread=bold_cyan
+roster.dnd.unread=bold_magenta
+roster.offline.unread=bold_green
 roster.room=red
 roster.room.unread=bold_red
 occupants.header=bold_cyan
diff --git a/themes/joker b/themes/joker
index 6076339a..6d49e171 100644
--- a/themes/joker
+++ b/themes/joker
@@ -46,6 +46,24 @@ roommention=green
 me=magenta
 them=green
 roster.header=magenta
+roster.chat=green
+roster.online=green
+roster.away=yellow
+roster.xa=yellow
+roster.dnd=green
+roster.offline=bold_black
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=yellow
+roster.xa.active=yellow
+roster.dnd.active=green
+roster.offline.active=bold_black
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=yellow
+roster.xa.unread=yellow
+roster.dnd.unread=green
+roster.offline.unread=bold_black
 roster.room=green
 roster.room.unread=green
 occupants.header=magenta
diff --git a/themes/mono b/themes/mono
index 86265336..96882cea 100644
--- a/themes/mono
+++ b/themes/mono
@@ -46,6 +46,24 @@ roommention=white
 me=white
 them=white
 roster.header=white
+roster.chat=white
+roster.online=white
+roster.away=white
+roster.xa=white
+roster.dnd=white
+roster.offline=white
+roster.chat.active=white
+roster.online.active=white
+roster.away.active=white
+roster.xa.active=white
+roster.dnd.active=white
+roster.offline.active=white
+roster.chat.unread=white
+roster.online.unread=white
+roster.away.unread=white
+roster.xa.unread=white
+roster.dnd.unread=white
+roster.offline.unread=white
 roster.room=white
 roster.room.unread=white
 occupants.header=white
diff --git a/themes/orange b/themes/orange
index 035d4b45..6bbe7490 100644
--- a/themes/orange
+++ b/themes/orange
@@ -46,6 +46,24 @@ roommention=blue
 me=black
 them=black
 roster.header=black
+roster.chat=blue
+roster.online=blue
+roster.away=white
+roster.xa=white
+roster.dnd=white
+roster.offline=white
+roster.chat.active=blue
+roster.online.active=blue
+roster.away.active=white
+roster.xa.active=white
+roster.dnd.active=white
+roster.offline.active=white
+roster.chat.unread=blue
+roster.online.unread=blue
+roster.away.unread=white
+roster.xa.unread=white
+roster.dnd.unread=white
+roster.offline.unread=white
 roster.room=blue
 roster.room.unread=blue
 occupants.header=black
diff --git a/themes/original b/themes/original
index 5c4fa88e..bd1651f5 100644
--- a/themes/original
+++ b/themes/original
@@ -46,6 +46,24 @@ roommention=yellow
 me=yellow
 them=green
 roster.header=yellow
+roster.chat=green
+roster.online=green
+roster.away=cyan
+roster.xa=cyan
+roster.dnd=red
+roster.offline=red
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=cyan
+roster.xa.active=cyan
+roster.dnd.active=red
+roster.offline.active=red
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=cyan
+roster.xa.unread=cyan
+roster.dnd.unread=red
+roster.offline.unread=red
 roster.room=green
 roster.room.unread=green
 occupants.header=yellow
diff --git a/themes/original_bright b/themes/original_bright
index 90dcae54..76eb0e4c 100644
--- a/themes/original_bright
+++ b/themes/original_bright
@@ -46,6 +46,24 @@ roommention=bold_yellow
 me=bold_yellow
 them=bold_green
 roster.header=bold_yellow
+roster.chat=bold_green
+roster.online=bold_green
+roster.away=bold_cyan
+roster.xa=bold_cyan
+roster.dnd=bold_red
+roster.offline=bold_red
+roster.chat.active=bold_green
+roster.online.active=bold_green
+roster.away.active=bold_cyan
+roster.xa.active=bold_cyan
+roster.dnd.active=bold_red
+roster.offline.active=bold_red
+roster.chat.unread=bold_green
+roster.online.unread=bold_green
+roster.away.unread=bold_cyan
+roster.xa.unread=bold_cyan
+roster.dnd.unread=bold_red
+roster.offline.unread=bold_red
 roster.room=bold_green
 roster.room.unread=bold_green
 occupants.header=bold_yellow
diff --git a/themes/shade b/themes/shade
index 4a671717..9227945a 100644
--- a/themes/shade
+++ b/themes/shade
@@ -46,6 +46,24 @@ roommention=green
 me=bold_black
 them=magenta
 roster.header=magenta
+roster.chat=green
+roster.online=green
+roster.away=yellow
+roster.xa=yellow
+roster.dnd=green
+roster.offline=white
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=yellow
+roster.xa.active=yellow
+roster.dnd.active=green
+roster.offline.active=white
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=yellow
+roster.xa.unread=yellow
+roster.dnd.unread=green
+roster.offline.unread=white
 roster.room=green
 roster.room.unread=green
 occupants.header=magenta
diff --git a/themes/spawn b/themes/spawn
index 907c10c5..13323309 100644
--- a/themes/spawn
+++ b/themes/spawn
@@ -46,6 +46,24 @@ roommention=red
 me=green
 them=yellow
 roster.header=white
+roster.chat=green
+roster.online=green
+roster.away=yellow
+roster.xa=yellow
+roster.dnd=green
+roster.offline=bold_black
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=yellow
+roster.xa.active=yellow
+roster.dnd.active=green
+roster.offline.active=bold_black
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=yellow
+roster.xa.unread=yellow
+roster.dnd.unread=green
+roster.offline.unread=bold_black
 roster.room=green
 roster.room.unread=green
 occupants.header=white
diff --git a/themes/whiteness b/themes/whiteness
index ad26afcf..e01ee646 100644
--- a/themes/whiteness
+++ b/themes/whiteness
@@ -46,6 +46,24 @@ roommention=yellow
 me=black
 them=black
 roster.header=black
+roster.chat=green
+roster.online=green
+roster.away=cyan
+roster.xa=cyan
+roster.dnd=red
+roster.offline=red
+roster.chat.active=green
+roster.online.active=green
+roster.away.active=cyan
+roster.xa.active=cyan
+roster.dnd.active=red
+roster.offline.active=red
+roster.chat.unread=green
+roster.online.unread=green
+roster.away.unread=cyan
+roster.xa.unread=cyan
+roster.dnd.unread=red
+roster.offline.unread=red
 roster.room=green
 roster.room.unread=green
 occupants.header=black