diff options
author | Wouter Coekaerts <coekie@irssi.org> | 2006-02-20 11:20:57 +0000 |
---|---|---|
committer | coekie <coekie@dbcabf3a-b0e7-0310-adc4-f8d773084564> | 2006-02-20 11:20:57 +0000 |
commit | 461f653d9b34de2d88de7df3547c19dc0954d301 (patch) | |
tree | f4d2719861276ff47e2afc5a83ebfb4169811d12 | |
parent | 3eedfa4e122044f4e9f5fe4233748c880d281d42 (diff) | |
download | irssi-461f653d9b34de2d88de7df3547c19dc0954d301.zip |
sort nicks with custom prefix by the order defined in isupport in /NAMES
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@4247 dbcabf3a-b0e7-0310-adc4-f8d773084564
-rw-r--r-- | src/core/nicklist.c | 17 | ||||
-rw-r--r-- | src/core/nicklist.h | 2 | ||||
-rw-r--r-- | src/fe-common/core/fe-channels.c | 10 |
3 files changed, 17 insertions, 12 deletions
diff --git a/src/core/nicklist.c b/src/core/nicklist.c index 3d557987..73143644 100644 --- a/src/core/nicklist.c +++ b/src/core/nicklist.c @@ -357,7 +357,7 @@ GSList *nicklist_get_same_unique(SERVER_REC *server, void *id) } /* nick record comparision for sort functions */ -int nicklist_compare(NICK_REC *p1, NICK_REC *p2) +int nicklist_compare(NICK_REC *p1, NICK_REC *p2, const char *nick_prefix) { int status1, status2; @@ -369,10 +369,10 @@ int nicklist_compare(NICK_REC *p1, NICK_REC *p2) * returns :-) * -- yath */ - /* Treat others as highest - should really use order in 005 numeric */ - if (p1->other) - status1 = 5; - else if (p1->op) + if (p1->other) { + const char *other = (nick_prefix == NULL) ? NULL : strchr(nick_prefix, p1->other); + status1 = (other == NULL) ? 5 : 1000 - (other - nick_prefix); + } else if (p1->op) status1 = 4; else if (p1->halfop) status1 = 3; @@ -381,9 +381,10 @@ int nicklist_compare(NICK_REC *p1, NICK_REC *p2) else status1 = 1; - if (p2->other) - status2 = 5; - else if (p2->op) + if (p2->other) { + const char *other = (nick_prefix == NULL) ? NULL : strchr(nick_prefix, p2->other); + status2 = (other == NULL) ? 5 : 1000 - (other - nick_prefix); + } else if (p2->op) status2 = 4; else if (p2->halfop) status2 = 3; diff --git a/src/core/nicklist.h b/src/core/nicklist.h index a9683500..38c547a5 100644 --- a/src/core/nicklist.h +++ b/src/core/nicklist.h @@ -49,7 +49,7 @@ void nicklist_update_flags_unique(SERVER_REC *server, void *id, void nicklist_set_own(CHANNEL_REC *channel, NICK_REC *nick); /* Nick record comparision for sort functions */ -int nicklist_compare(NICK_REC *p1, NICK_REC *p2); +int nicklist_compare(NICK_REC *p1, NICK_REC *p2, const char *nick_prefix); /* Check is `msg' is meant for `nick'. */ int nick_match_msg(CHANNEL_REC *channel, const char *msg, const char *nick); diff --git a/src/fe-common/core/fe-channels.c b/src/fe-common/core/fe-channels.c index 5b531c2e..9bc51f37 100644 --- a/src/fe-common/core/fe-channels.c +++ b/src/fe-common/core/fe-channels.c @@ -473,12 +473,14 @@ void fe_channels_nicklist(CHANNEL_REC *channel, int flags) NICK_REC *nick; GSList *tmp, *nicklist, *sorted; int nicks, normal, voices, halfops, ops; + const char *nick_flags; nicks = normal = voices = halfops = ops = 0; nicklist = nicklist_getnicks(channel); sorted = NULL; + nick_flags = channel->server->get_nick_flags(channel->server); - /* sort the nicklist */ + /* filter (for flags) and count ops, halfops, voices */ for (tmp = nicklist; tmp != NULL; tmp = tmp->next) { nick = tmp->data; @@ -501,11 +503,13 @@ void fe_channels_nicklist(CHANNEL_REC *channel, int flags) continue; } - sorted = g_slist_insert_sorted(sorted, nick, (GCompareFunc) - nicklist_compare); + sorted = g_slist_prepend(sorted, nick); } g_slist_free(nicklist); + /* sort the nicklist */ + sorted = g_slist_sort_with_data(sorted, (GCompareDataFunc) nicklist_compare, (void *)nick_flags); + /* display the nicks */ if ((flags & CHANNEL_NICKLIST_FLAG_COUNT) == 0) { printformat(channel->server, channel->visible_name, |