diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2023-05-01 17:02:51 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2023-05-01 17:02:51 +0200 |
commit | b127bed0fc686be3e00c5709660cda225885fb48 (patch) | |
tree | 6777e1caff447007e0993613d2d2fd5fcefb50ee /src | |
parent | 66d79e2d23ef121b8929930f30278979f333ef3e (diff) | |
download | weechat-b127bed0fc686be3e00c5709660cda225885fb48.zip |
irc: add option `buffer` in command `/autojoin sort` (closes #1876)
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/irc/irc-command.c | 13 | ||||
-rw-r--r-- | src/plugins/irc/irc-join.c | 103 | ||||
-rw-r--r-- | src/plugins/irc/irc-join.h | 21 |
3 files changed, 110 insertions, 27 deletions
diff --git a/src/plugins/irc/irc-command.c b/src/plugins/irc/irc-command.c index 4733750b7..2e8f1c06c 100644 --- a/src/plugins/irc/irc-command.c +++ b/src/plugins/irc/irc-command.c @@ -910,6 +910,7 @@ IRC_COMMAND_CALLBACK(autojoin) struct t_irc_channel *ptr_channel2; const char *ptr_autojoin; char *old_autojoin, *autojoin; + enum t_irc_join_sort sort; int i; IRC_BUFFER_GET_SERVER_CHANNEL(buffer); @@ -1025,7 +1026,9 @@ IRC_COMMAND_CALLBACK(autojoin) /* sort channels */ if (weechat_strcmp (argv[1], "sort") == 0) { - irc_join_sort_autojoin (ptr_server); + sort = ((argc > 2) && (weechat_strcmp (argv[2], "buffer") == 0)) ? + IRC_JOIN_SORT_BUFFER : IRC_JOIN_SORT_ALPHA; + irc_join_sort_autojoin (ptr_server, sort); goto end; } @@ -6889,7 +6892,7 @@ irc_command_init () " || del [<channel1> [<channel2>...]]" " || apply" " || join" - " || sort"), + " || sort [buffer]"), N_(" add: add current channel or a list of channels (with optional " "keys) to the autojoin option; if you are on the channel and the " "key is not provided, the key is read in the channel\n" @@ -6902,6 +6905,7 @@ irc_command_init () " apply: set currently joined channels in the autojoin option\n" " join: join the channels in the autojoin option\n" " sort: sort alphabetically channels in the autojoin option\n" + " buffer: sort channels by order of buffers in the autojoin option\n" "\n" "Examples:\n" " /autojoin add\n" @@ -6913,13 +6917,14 @@ irc_command_init () " /autojoin del #chan1\n" " /autojoin apply\n" " /autojoin join\n" - " /autojoin sort"), + " /autojoin sort\n" + " /autojoin sort buffer"), "add %(irc_channels)|%*" " || addraw %(irc_channels) %-" " || del %(irc_channels_autojoin)|%*" " || apply" " || join" - " || sort", + " || sort buffer", &irc_command_autojoin, NULL, NULL); weechat_hook_command_run ("/away", &irc_command_run_away, NULL, NULL); weechat_hook_command ( diff --git a/src/plugins/irc/irc-join.c b/src/plugins/irc/irc-join.c index dd4324eb7..0707cb725 100644 --- a/src/plugins/irc/irc-join.c +++ b/src/plugins/irc/irc-join.c @@ -59,7 +59,7 @@ irc_join_compare_join_channel (struct t_irc_server *server, } /* - * Compares two join channels (no sort, keyed channels first). + * Compares two join channels: no sort, keyed channels first. */ int @@ -97,12 +97,12 @@ irc_join_compare_cb (void *data, struct t_arraylist *arraylist, } /* - * Compares two join channels (alphabetic sort, keyed channels first). + * Compares two join channels: alphabetic sort, keyed channels first. */ int -irc_join_compare_sort_cb (void *data, struct t_arraylist *arraylist, - void *pointer1, void *pointer2) +irc_join_compare_sort_alpha_cb (void *data, struct t_arraylist *arraylist, + void *pointer1, void *pointer2) { struct t_irc_server *server; struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2; @@ -135,6 +135,59 @@ irc_join_compare_sort_cb (void *data, struct t_arraylist *arraylist, } /* + * Compares two join channels: buffer sort, then alphabetic, + * keyed channels first. + */ + +int +irc_join_compare_sort_buffer_cb (void *data, struct t_arraylist *arraylist, + void *pointer1, void *pointer2) +{ + struct t_irc_server *server; + struct t_irc_channel *ptr_channel1, *ptr_channel2; + struct t_irc_join_channel *ptr_join_chan1, *ptr_join_chan2; + int rc, buffer_num1, buffer_num2; + + /* make C compiler happy */ + (void) arraylist; + + server = (struct t_irc_server *)data; + + ptr_join_chan1 = (struct t_irc_join_channel *)pointer1; + ptr_join_chan2 = (struct t_irc_join_channel *)pointer2; + + /* + * if channel is the same, always consider it's the same, even if the key + * is different + */ + rc = irc_server_strcasecmp (server, ptr_join_chan1->name, + ptr_join_chan2->name); + if (rc == 0) + return 0; + + /* channels with a key are first in list */ + if (ptr_join_chan1->key && !ptr_join_chan2->key) + return -1; + if (!ptr_join_chan1->key && ptr_join_chan2->key) + return 1; + + /* search buffer number for each channel */ + ptr_channel1 = irc_channel_search (server, ptr_join_chan1->name); + buffer_num1 = (ptr_channel1 && ptr_channel1->buffer) ? + weechat_buffer_get_integer (ptr_channel1->buffer, "number") : INT_MAX; + ptr_channel2 = irc_channel_search (server, ptr_join_chan2->name); + buffer_num2 = (ptr_channel2 && ptr_channel2->buffer) ? + weechat_buffer_get_integer (ptr_channel2->buffer, "number") : INT_MAX; + if (buffer_num1 < buffer_num2) + return -1; + if (buffer_num1 > buffer_num2) + return 1; + + /* same buffer number: fallback on alphabetic sort */ + return rc; +} + +/* * Frees a join channel. */ @@ -242,19 +295,22 @@ irc_join_arraylist_add (struct t_arraylist *arraylist, * * #channel1,#channel2,#channel3 key1,key2 * - * If sort == 1, channels are sorted alphabetically, otherwise in the order - * they are received. - * In all cases, keyed channels are first in list. + * Parameter sort can be (in all cases, keyed channels are first in list): + * IRC_JOIN_SORT_DISABLED: no sort + * IRC_JOIN_SORT_ALPHA: alphabetic sort + * IRC_JOIN_SORT_BUFFER: sort by buffer number, then alphabetic */ struct t_arraylist * -irc_join_split (struct t_irc_server *server, const char *join, int sort) +irc_join_split (struct t_irc_server *server, const char *join, + enum t_irc_join_sort sort) { struct t_arraylist *arraylist; char **items, **channels, **keys; int count_items, count_channels, count_keys, i; const char *ptr_channels, *ptr_keys; struct t_irc_join_channel *new_channel; + void *sort_cb; arraylist = NULL; items = NULL; @@ -292,12 +348,22 @@ irc_join_split (struct t_irc_server *server, const char *join, int sort) 0, &count_keys); } - arraylist = weechat_arraylist_new ( - 16, 1, 0, - (sort) ? &irc_join_compare_sort_cb : &irc_join_compare_cb, - server, - &irc_join_free_cb, - NULL); + switch (sort) + { + case IRC_JOIN_SORT_ALPHA: + sort_cb = &irc_join_compare_sort_alpha_cb; + break; + case IRC_JOIN_SORT_BUFFER: + sort_cb = &irc_join_compare_sort_buffer_cb; + break; + default: + sort_cb = &irc_join_compare_cb; + break; + } + + arraylist = weechat_arraylist_new (16, 1, 0, + sort_cb, server, + &irc_join_free_cb, NULL); if (!arraylist) goto end; @@ -807,12 +873,13 @@ irc_join_save_channels_to_autojoin (struct t_irc_server *server) */ char * -irc_join_sort_channels (struct t_irc_server *server, const char *join) +irc_join_sort_channels (struct t_irc_server *server, const char *join, + enum t_irc_join_sort sort) { struct t_arraylist *arraylist; char *new_join; - arraylist = irc_join_split (server, join, 1); + arraylist = irc_join_split (server, join, sort); if (!arraylist) return NULL; @@ -828,7 +895,7 @@ irc_join_sort_channels (struct t_irc_server *server, const char *join) */ void -irc_join_sort_autojoin (struct t_irc_server *server) +irc_join_sort_autojoin (struct t_irc_server *server, enum t_irc_join_sort sort) { const char *ptr_autojoin; char *new_autojoin; @@ -841,7 +908,7 @@ irc_join_sort_autojoin (struct t_irc_server *server) if (!ptr_autojoin || !ptr_autojoin[0]) return; - new_autojoin = irc_join_sort_channels (server, ptr_autojoin); + new_autojoin = irc_join_sort_channels (server, ptr_autojoin, sort); if (new_autojoin) { weechat_config_option_set (server->options[IRC_SERVER_OPTION_AUTOJOIN], diff --git a/src/plugins/irc/irc-join.h b/src/plugins/irc/irc-join.h index 3da75d87f..6fd238a3e 100644 --- a/src/plugins/irc/irc-join.h +++ b/src/plugins/irc/irc-join.h @@ -20,17 +20,26 @@ #ifndef WEECHAT_PLUGIN_IRC_JOIN_H #define WEECHAT_PLUGIN_IRC_JOIN_H +enum t_irc_join_sort +{ + IRC_JOIN_SORT_DISABLED = 0, /* no sort */ + IRC_JOIN_SORT_ALPHA, /* alphabetic sort */ + IRC_JOIN_SORT_BUFFER, /* sort by buffer number, then alpha */ + /* number of sort methods */ + IRC_JOIN_NUM_SORT, +}; + struct t_irc_server; struct t_irc_join_channel { - char *name; /* channel name */ - char *key; /* channel key */ + char *name; /* channel name */ + char *key; /* channel key */ }; extern struct t_arraylist *irc_join_split (struct t_irc_server *server, const char *join, - int sort); + enum t_irc_join_sort sort); extern char *irc_join_build_string (struct t_arraylist *arraylist); extern int irc_join_has_channel (struct t_irc_server *server, const char *join, const char *channel_name); @@ -58,7 +67,9 @@ extern void irc_join_rename_channel_in_autojoin (struct t_irc_server *server, const char *new_channel_name); extern void irc_join_save_channels_to_autojoin (struct t_irc_server *server); extern char *irc_join_sort_channels (struct t_irc_server *server, - const char *join); -extern void irc_join_sort_autojoin (struct t_irc_server *server); + const char *join, + enum t_irc_join_sort sort); +extern void irc_join_sort_autojoin (struct t_irc_server *server, + enum t_irc_join_sort sort); #endif /* WEECHAT_PLUGIN_IRC_JOIN_H */ |