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