1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-02 15:53:12 +02:00

Improve nick completion: complete first by nicks that highlight me, before nicks speaking without highlight

This commit is contained in:
Sebastien Helleu
2008-12-17 15:44:10 +01:00
parent e3b26523a7
commit adb1fe0747
6 changed files with 101 additions and 64 deletions
+56 -35
View File
@@ -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)
+6 -3
View File
@@ -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);
+14 -7
View File
@@ -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);
}
}
}
}
}
+2 -6
View File
@@ -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)
+8 -2
View File
@@ -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));
+15 -11
View File
@@ -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)