From adb1fe07475624f546c2df2603036cfa9a0caa72 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Wed, 17 Dec 2008 15:44:10 +0100 Subject: [PATCH] Improve nick completion: complete first by nicks that highlight me, before nicks speaking without highlight --- src/plugins/irc/irc-channel.c | 91 ++++++++++++++++++++------------ src/plugins/irc/irc-channel.h | 9 ++-- src/plugins/irc/irc-completion.c | 21 +++++--- src/plugins/irc/irc-nick.c | 8 +-- src/plugins/irc/irc-protocol.c | 10 +++- src/plugins/irc/irc-upgrade.c | 26 +++++---- 6 files changed, 101 insertions(+), 64 deletions(-) diff --git a/src/plugins/irc/irc-channel.c b/src/plugins/irc/irc-channel.c index cdce82167..2f1fce44a 100644 --- a/src/plugins/irc/irc-channel.c +++ b/src/plugins/irc/irc-channel.c @@ -152,7 +152,8 @@ irc_channel_new (struct t_irc_server *server, int channel_type, new_channel->nicks = NULL; new_channel->last_nick = NULL; new_channel->buffer = new_buffer; - new_channel->nicks_speaking = NULL; + new_channel->nicks_speaking[0] = NULL; + new_channel->nicks_speaking[1] = NULL; new_channel->nicks_speaking_time = NULL; new_channel->last_nick_speaking_time = NULL; new_channel->buffer_as_string = NULL; @@ -333,23 +334,30 @@ irc_channel_set_away (struct t_irc_channel *channel, const char *nick, */ void -irc_channel_nick_speaking_add (struct t_irc_channel *channel, const char *nick) +irc_channel_nick_speaking_add (struct t_irc_channel *channel, const char *nick, + int highlight) { int size, to_remove, i; - - if (!channel->nicks_speaking) - channel->nicks_speaking = weechat_list_new (); - weechat_list_add (channel->nicks_speaking, nick, WEECHAT_LIST_POS_END); + if (highlight < 0) + highlight = 0; + if (highlight > 1) + highlight = 1; - size = weechat_list_size (channel->nicks_speaking); + if (!channel->nicks_speaking[highlight]) + channel->nicks_speaking[highlight] = weechat_list_new (); + + weechat_list_add (channel->nicks_speaking[highlight], nick, + WEECHAT_LIST_POS_END); + + size = weechat_list_size (channel->nicks_speaking[highlight]); if (size > IRC_CHANNEL_NICKS_SPEAKING_LIMIT) { to_remove = size - IRC_CHANNEL_NICKS_SPEAKING_LIMIT; for (i = 0; i < to_remove; i++) { - weechat_list_remove (channel->nicks_speaking, - weechat_list_get (channel->nicks_speaking, 0)); + weechat_list_remove (channel->nicks_speaking[highlight], + weechat_list_get (channel->nicks_speaking[highlight], 0)); } } } @@ -364,12 +372,16 @@ irc_channel_nick_speaking_rename (struct t_irc_channel *channel, const char *new_nick) { struct t_weelist_item *ptr_item; + int i; - if (channel->nicks_speaking) + for (i = 0; i < 2; i++) { - ptr_item = weechat_list_search (channel->nicks_speaking, old_nick); - if (ptr_item) - weechat_list_set (ptr_item, new_nick); + if (channel->nicks_speaking[i]) + { + ptr_item = weechat_list_search (channel->nicks_speaking[i], old_nick); + if (ptr_item) + weechat_list_set (ptr_item, new_nick); + } } } @@ -558,8 +570,10 @@ irc_channel_free (struct t_irc_server *server, struct t_irc_channel *channel) irc_nick_free_all (channel); if (channel->away_message) free (channel->away_message); - if (channel->nicks_speaking) - weechat_list_free (channel->nicks_speaking); + if (channel->nicks_speaking[0]) + weechat_list_free (channel->nicks_speaking[0]); + if (channel->nicks_speaking[1]) + weechat_list_free (channel->nicks_speaking[1]); irc_channel_nick_speaking_time_free_all (channel); if (channel->buffer_as_string) free (channel->buffer_as_string); @@ -594,7 +608,7 @@ irc_channel_add_to_infolist (struct t_infolist *infolist, struct t_weelist_item *ptr_list_item; struct t_irc_channel_speaking *ptr_nick; char option_name[64]; - int i; + int i, index; if (!infolist || !channel) return 0; @@ -637,18 +651,22 @@ irc_channel_add_to_infolist (struct t_infolist *infolist, return 0; if (!weechat_infolist_new_var_integer (ptr_item, "nick_completion_reset", channel->nick_completion_reset)) return 0; - if (channel->nicks_speaking) + for (i = 0; i < 2; i++) { - i = 0; - for (ptr_list_item = weechat_list_get (channel->nicks_speaking, 0); - ptr_list_item; - ptr_list_item = weechat_list_next (ptr_list_item)) + if (channel->nicks_speaking[i]) { - snprintf (option_name, sizeof (option_name), "nick_speaking_%05d", i); - if (!weechat_infolist_new_var_string (ptr_item, option_name, - weechat_list_string (ptr_list_item))) - return 0; - i++; + index = 0; + for (ptr_list_item = weechat_list_get (channel->nicks_speaking[i], 0); + ptr_list_item; + ptr_list_item = weechat_list_next (ptr_list_item)) + { + snprintf (option_name, sizeof (option_name), + "nick_speaking%d_%05d", i, index); + if (!weechat_infolist_new_var_string (ptr_item, option_name, + weechat_list_string (ptr_list_item))) + return 0; + index++; + } } } if (channel->nicks_speaking_time) @@ -683,7 +701,7 @@ irc_channel_print_log (struct t_irc_channel *channel) { struct t_weelist_item *ptr_item; struct t_irc_channel_speaking *ptr_nick_speaking; - int i; + int i, index; struct t_irc_nick *ptr_nick; weechat_log_printf (""); @@ -705,16 +723,19 @@ irc_channel_print_log (struct t_irc_channel *channel) weechat_log_printf (" last_nick_speaking_time. : 0x%lx", channel->last_nick_speaking_time); weechat_log_printf (" prev_channel . . . . . . : 0x%lx", channel->prev_channel); weechat_log_printf (" next_channel . . . . . . : 0x%lx", channel->next_channel); - if (channel->nicks_speaking) + for (i = 0; i < 2; i++) { - weechat_log_printf (""); - i = 0; - for (ptr_item = weechat_list_get (channel->nicks_speaking, 0); - ptr_item; ptr_item = weechat_list_next (ptr_item)) + if (channel->nicks_speaking[i]) { - weechat_log_printf (" nick speaking %d: '%s'", - i, weechat_list_string (ptr_item)); - i++; + weechat_log_printf (""); + index = 0; + for (ptr_item = weechat_list_get (channel->nicks_speaking[i], 0); + ptr_item; ptr_item = weechat_list_next (ptr_item)) + { + weechat_log_printf (" nick speaking[%d][%d]: '%s'", + i, index, weechat_list_string (ptr_item)); + index++; + } } } if (channel->nicks_speaking_time) diff --git a/src/plugins/irc/irc-channel.h b/src/plugins/irc/irc-channel.h index 49b109fde..4ae384403 100644 --- a/src/plugins/irc/irc-channel.h +++ b/src/plugins/irc/irc-channel.h @@ -27,7 +27,7 @@ #define IRC_CHANNEL_TYPE_CHANNEL 0 #define IRC_CHANNEL_TYPE_PRIVATE 1 -#define IRC_CHANNEL_NICKS_SPEAKING_LIMIT 32 +#define IRC_CHANNEL_NICKS_SPEAKING_LIMIT 128 struct t_irc_server; @@ -56,7 +56,9 @@ struct t_irc_channel /* there was some join/part on chan */ struct t_irc_nick *nicks; /* nicks on the channel */ struct t_irc_nick *last_nick; /* last nick on the channel */ - struct t_weelist *nicks_speaking; /* for smart completion */ + struct t_weelist *nicks_speaking[2]; /* for smart completion: first */ + /* list is nick speaking, second is */ + /* speaking to me (highlight) */ struct t_irc_channel_speaking *nicks_speaking_time; /* for smart filter */ /* of join/part/quit messages */ struct t_irc_channel_speaking *last_nick_speaking_time; @@ -90,7 +92,8 @@ extern void irc_channel_check_away (struct t_irc_server *server, extern void irc_channel_set_away (struct t_irc_channel *channel, const char *nick, int is_away); extern void irc_channel_nick_speaking_add (struct t_irc_channel *channel, - const char *nick); + const char *nick, + int highlight); extern void irc_channel_nick_speaking_rename (struct t_irc_channel *channel, const char *old_nick, const char *new_nick); diff --git a/src/plugins/irc/irc-completion.c b/src/plugins/irc/irc-completion.c index 45d3a0074..4e1b1b7d3 100644 --- a/src/plugins/irc/irc-completion.c +++ b/src/plugins/irc/irc-completion.c @@ -188,7 +188,7 @@ irc_completion_channel_nicks_cb (void *data, const char *completion_item, { struct t_irc_nick *ptr_nick; const char *nick; - int list_size, i; + int list_size, i, j; IRC_GET_SERVER_CHANNEL(buffer); @@ -210,14 +210,21 @@ irc_completion_channel_nicks_cb (void *data, const char *completion_item, /* add nicks speaking recently on this channel */ if (weechat_config_boolean (irc_config_look_nick_completion_smart)) { - list_size = weechat_list_size (ptr_channel->nicks_speaking); - for (i = 0; i < list_size; i++) + /* 0 => nick speaking ; 1 => nick speaking to me (with highlight) */ + for (i = 0; i < 2; i++) { - nick = weechat_list_string (weechat_list_get (ptr_channel->nicks_speaking, i)); - if (nick && irc_nick_search (ptr_channel, nick)) + if (ptr_channel->nicks_speaking[i]) { - weechat_hook_completion_list_add (completion, nick, - 1, WEECHAT_LIST_POS_BEGINNING); + list_size = weechat_list_size (ptr_channel->nicks_speaking[i]); + for (j = 0; j < list_size; j++) + { + nick = weechat_list_string (weechat_list_get (ptr_channel->nicks_speaking[i], j)); + if (nick && irc_nick_search (ptr_channel, nick)) + { + weechat_hook_completion_list_add (completion, nick, + 1, WEECHAT_LIST_POS_BEGINNING); + } + } } } } diff --git a/src/plugins/irc/irc-nick.c b/src/plugins/irc/irc-nick.c index 236b46245..90cdcdfa2 100644 --- a/src/plugins/irc/irc-nick.c +++ b/src/plugins/irc/irc-nick.c @@ -297,12 +297,8 @@ irc_nick_change (struct t_irc_server *server, struct t_irc_channel *channel, /* update nicks speaking */ nick_is_me = (strcmp (nick->name, server->nick) == 0) ? 1 : 0; - if (!nick_is_me && channel->nicks_speaking) - { - weechat_list_set (weechat_list_search (channel->nicks_speaking, - nick->name), - new_nick); - } + if (!nick_is_me) + irc_channel_nick_speaking_rename (channel, nick->name, new_nick); /* change nickname */ if (nick->name) diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c index b200c7579..02bb7727b 100644 --- a/src/plugins/irc/irc-protocol.c +++ b/src/plugins/irc/irc-protocol.c @@ -1230,7 +1230,10 @@ irc_protocol_cmd_privmsg (struct t_irc_server *server, const char *command, IRC_COLOR_CHAT, pos_args); - irc_channel_nick_speaking_add (ptr_channel, nick); + irc_channel_nick_speaking_add (ptr_channel, + nick, + weechat_string_has_highlight (pos_args, + server->nick)); irc_channel_nick_speaking_time_remove_old (ptr_channel); irc_channel_nick_speaking_time_add (ptr_channel, nick, time (NULL)); @@ -1391,7 +1394,10 @@ irc_protocol_cmd_privmsg (struct t_irc_server *server, const char *command, NULL), pos_args); - irc_channel_nick_speaking_add (ptr_channel, nick); + irc_channel_nick_speaking_add (ptr_channel, + nick, + weechat_string_has_highlight (pos_args, + server->nick)); irc_channel_nick_speaking_time_remove_old (ptr_channel); irc_channel_nick_speaking_time_add (ptr_channel, nick, time (NULL)); diff --git a/src/plugins/irc/irc-upgrade.c b/src/plugins/irc/irc-upgrade.c index 5d5641bfd..76d364c14 100644 --- a/src/plugins/irc/irc-upgrade.c +++ b/src/plugins/irc/irc-upgrade.c @@ -169,7 +169,7 @@ int irc_upgrade_read_cb (int object_id, struct t_infolist *infolist) { - int flags, sock, size, index; + int flags, sock, size, i, index; char *buf, option_name[64]; const char *buffer_name, *str, *nick; struct t_irc_nick *ptr_nick; @@ -271,17 +271,21 @@ irc_upgrade_read_cb (int object_id, irc_upgrade_current_channel->cycle = weechat_infolist_integer (infolist, "cycle"); irc_upgrade_current_channel->display_creation_date = weechat_infolist_integer (infolist, "display_creation_date"); irc_upgrade_current_channel->nick_completion_reset = weechat_infolist_integer (infolist, "nick_completion_reset"); - index = 0; - while (1) + for (i = 0; i < 2; i++) { - snprintf (option_name, sizeof (option_name), - "nick_speaking_%05d", index); - nick = weechat_infolist_string (infolist, option_name); - if (!nick) - break; - irc_channel_nick_speaking_add (irc_upgrade_current_channel, - nick); - index++; + index = 0; + while (1) + { + snprintf (option_name, sizeof (option_name), + "nick_speaking%d_%05d", i, index); + nick = weechat_infolist_string (infolist, option_name); + if (!nick) + break; + irc_channel_nick_speaking_add (irc_upgrade_current_channel, + nick, + i); + index++; + } } index = 0; while (1)