about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/command/commands.c4
-rw-r--r--src/roster_list.c16
-rw-r--r--src/roster_list.h4
-rw-r--r--src/ui/rosterwin.c24
4 files changed, 31 insertions, 17 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index c1edfdb2..3a2f5292 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -1320,7 +1320,7 @@ _who_roster(ProfWin *window, const char *const command, gchar **args)
     cons_show("");
     GSList *list = NULL;
     if (group) {
-        list = roster_get_group(group, ROSTER_ORD_NAME);
+        list = roster_get_group(group, ROSTER_ORD_NAME, TRUE);
         if (list == NULL) {
             cons_show("No such group: %s.", group);
             return;
@@ -1628,7 +1628,7 @@ cmd_group(ProfWin *window, const char *const command, gchar **args)
             return TRUE;
         }
 
-        GSList *list = roster_get_group(group, ROSTER_ORD_NAME);
+        GSList *list = roster_get_group(group, ROSTER_ORD_NAME, TRUE);
         cons_show_roster_group(group, list);
         return TRUE;
     }
diff --git a/src/roster_list.c b/src/roster_list.c
index 2f1a0b55..4b2662ad 100644
--- a/src/roster_list.c
+++ b/src/roster_list.c
@@ -455,7 +455,7 @@ roster_fulljid_autocomplete(const char *const search_str)
 }
 
 GSList*
-roster_get_nogroup(roster_ord_t order)
+roster_get_nogroup(roster_ord_t order, gboolean include_offline)
 {
     GSList *result = NULL;
     GHashTableIter iter;
@@ -471,6 +471,12 @@ roster_get_nogroup(roster_ord_t order)
 
     g_hash_table_iter_init(&iter, contacts);
     while (g_hash_table_iter_next(&iter, &key, &value)) {
+        PContact contact = value;
+        const char *presence = p_contact_presence(contact);
+        if (!include_offline && (g_strcmp0(presence, "offline") == 0)) {
+            continue;
+        }
+
         GSList *groups = p_contact_groups(value);
         if (groups == NULL) {
             result = g_slist_insert_sorted(result, value, cmp_func);
@@ -482,7 +488,7 @@ roster_get_nogroup(roster_ord_t order)
 }
 
 GSList*
-roster_get_group(const char *const group, roster_ord_t order)
+roster_get_group(const char *const group, roster_ord_t order, gboolean include_offline)
 {
     GSList *result = NULL;
     GHashTableIter iter;
@@ -498,6 +504,12 @@ roster_get_group(const char *const group, roster_ord_t order)
 
     g_hash_table_iter_init(&iter, contacts);
     while (g_hash_table_iter_next(&iter, &key, &value)) {
+        PContact contact = value;
+        const char *presence = p_contact_presence(contact);
+        if (!include_offline && (g_strcmp0(presence, "offline") == 0)) {
+            continue;
+        }
+
         GSList *groups = p_contact_groups(value);
         while (groups) {
             if (strcmp(groups->data, group) == 0) {
diff --git a/src/roster_list.h b/src/roster_list.h
index 15cdacef..0f0fbc5b 100644
--- a/src/roster_list.h
+++ b/src/roster_list.h
@@ -64,12 +64,12 @@ GSList* roster_get_contacts_online(void);
 gboolean roster_has_pending_subscriptions(void);
 char* roster_contact_autocomplete(const char *const search_str);
 char* roster_fulljid_autocomplete(const char *const search_str);
-GSList* roster_get_group(const char *const group, roster_ord_t order);
+GSList* roster_get_group(const char *const group, roster_ord_t order, gboolean include_offline);
 GSList* roster_get_groups(void);
 char* roster_group_autocomplete(const char *const search_str);
 char* roster_barejid_autocomplete(const char *const search_str);
 GSList* roster_get_contacts_by_presence(const char *const presence);
-GSList* roster_get_nogroup(roster_ord_t order);
+GSList* roster_get_nogroup(roster_ord_t order, gboolean include_offline);
 char* roster_get_msg_display_name(const char *const barejid, const char *const resource);
 
 #endif
diff --git a/src/ui/rosterwin.c b/src/ui/rosterwin.c
index a689f033..8c84a9b2 100644
--- a/src/ui/rosterwin.c
+++ b/src/ui/rosterwin.c
@@ -160,23 +160,24 @@ _rosterwin_contacts_by_presence(ProfLayoutSplit *layout, const char *const prese
 static void
 _rosterwin_contacts_by_group(ProfLayoutSplit *layout, char *group)
 {
-    wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-    GString *title = g_string_new(" -");
-    g_string_append(title, group);
-    win_printline_nowrap(layout->subwin, title->str);
-    g_string_free(title, TRUE);
-    wattroff(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
-
     GSList *contacts = NULL;
 
     char *order = prefs_get_string(PREF_ROSTER_ORDER);
+    gboolean offline = prefs_get_boolean(PREF_ROSTER_OFFLINE);
     if (g_strcmp0(order, "presence") == 0) {
-        contacts = roster_get_group(group, ROSTER_ORD_PRESENCE);
+        contacts = roster_get_group(group, ROSTER_ORD_PRESENCE, offline);
     } else {
-        contacts = roster_get_group(group, ROSTER_ORD_NAME);
+        contacts = roster_get_group(group, ROSTER_ORD_NAME, offline);
     }
 
     if (contacts) {
+        wattron(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
+        GString *title = g_string_new(" -");
+        g_string_append(title, group);
+        win_printline_nowrap(layout->subwin, title->str);
+        g_string_free(title, TRUE);
+        wattroff(layout->subwin, theme_attrs(THEME_ROSTER_HEADER));
+
         GSList *curr_contact = contacts;
         while (curr_contact) {
             PContact contact = curr_contact->data;
@@ -193,10 +194,11 @@ _rosterwin_contacts_by_no_group(ProfLayoutSplit *layout)
     GSList *contacts = NULL;
 
     char *order = prefs_get_string(PREF_ROSTER_ORDER);
+    gboolean offline = prefs_get_boolean(PREF_ROSTER_OFFLINE);
     if (g_strcmp0(order, "presence") == 0) {
-        contacts = roster_get_nogroup(ROSTER_ORD_PRESENCE);
+        contacts = roster_get_nogroup(ROSTER_ORD_PRESENCE, offline);
     } else {
-        contacts = roster_get_nogroup(ROSTER_ORD_NAME);
+        contacts = roster_get_nogroup(ROSTER_ORD_NAME, offline);
     }
 
     if (contacts) {