diff --git a/ChangeLog b/ChangeLog index a04a220d4..d8c30f20a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,9 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2006-04-21 +ChangeLog - 2006-04-23 Version 0.1.9 (under dev!): + * fixed crash when multiple pv have same name: now it's forbidden + and pv buffer is not renamed (when a nick changes) if another + exists with same name * command /clear [-all] now clears hotlist * fixed crash after /upgrade if a line in history is empty * fixed many crashes with DCC chat diff --git a/src/common/command.c b/src/common/command.c index 86d729fbe..5d18619ab 100644 --- a/src/common/command.c +++ b/src/common/command.c @@ -1371,7 +1371,8 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, buffer->server = NULL; gui_window_switch_server (window); } - + gui_status_draw (gui_current_window->buffer, 1); + gui_input_draw (gui_current_window->buffer, 1); } else { @@ -1381,8 +1382,8 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, ptr_channel = CHANNEL(buffer); gui_buffer_free (ptr_channel->buffer, 1); channel_free (SERVER(buffer), ptr_channel); - gui_status_draw (buffer, 1); - gui_input_draw (buffer, 1); + gui_status_draw (gui_current_window->buffer, 1); + gui_input_draw (gui_current_window->buffer, 1); } else { @@ -1412,9 +1413,9 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, } else gui_buffer_free (buffer, 1); + gui_status_draw (gui_current_window->buffer, 1); } } - gui_status_draw (buffer, 1); } else if (ascii_strcasecmp (argv[0], "notify") == 0) { diff --git a/src/common/session.c b/src/common/session.c index 3b4829b2e..3f24dc58a 100644 --- a/src/common/session.c +++ b/src/common/session.c @@ -1403,7 +1403,7 @@ session_load_buffer (FILE *file) if (channel_name) { - ptr_channel = channel_search_any (ptr_server, channel_name); + ptr_channel = channel_search_any_without_buffer (ptr_server, channel_name); if (!ptr_channel) { session_crash (file, _("channel not found for buffer")); diff --git a/src/irc/irc-channel.c b/src/irc/irc-channel.c index 3aeb32538..27938510c 100644 --- a/src/irc/irc-channel.c +++ b/src/irc/irc-channel.c @@ -185,6 +185,29 @@ channel_search_any (t_irc_server *server, char *channel_name) return NULL; } +/* + * channel_search_any_without_buffer: returns pointer on a channel with name + * looks only for channels without buffer + */ + +t_irc_channel * +channel_search_any_without_buffer (t_irc_server *server, char *channel_name) +{ + t_irc_channel *ptr_channel; + + if (!server || !channel_name) + return NULL; + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (!ptr_channel->buffer + && (ascii_strcasecmp (ptr_channel->name, channel_name) == 0)) + return ptr_channel; + } + return NULL; +} + /* * channel_search_dcc: returns pointer on a DCC chat channel with name */ diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index b3b9377b1..7e0b1d54c 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -1288,8 +1288,12 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *nick, char *arguments if ((CHANNEL(ptr_buffer)->name) && (ascii_strcasecmp (nick, CHANNEL(ptr_buffer)->name) == 0)) { - free (CHANNEL(ptr_buffer)->name); - CHANNEL(ptr_buffer)->name = strdup (arguments); + ptr_channel = channel_search_any (server, arguments); + if (!ptr_channel) + { + free (CHANNEL(ptr_buffer)->name); + CHANNEL(ptr_buffer)->name = strdup (arguments); + } } } } diff --git a/src/irc/irc.h b/src/irc/irc.h index dfab3e766..a4afde7c3 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -371,6 +371,7 @@ extern void channel_free (t_irc_server *, t_irc_channel *); extern void channel_free_all (t_irc_server *); extern t_irc_channel *channel_search (t_irc_server *, char *); extern t_irc_channel *channel_search_any (t_irc_server *, char *); +extern t_irc_channel *channel_search_any_without_buffer (t_irc_server *, char *); extern t_irc_channel *channel_search_dcc (t_irc_server *, char *); extern int string_is_channel (char *); extern char *channel_get_charset_decode_iso (t_irc_server *, t_irc_channel *); diff --git a/weechat/ChangeLog b/weechat/ChangeLog index a04a220d4..d8c30f20a 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -1,9 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2006-04-21 +ChangeLog - 2006-04-23 Version 0.1.9 (under dev!): + * fixed crash when multiple pv have same name: now it's forbidden + and pv buffer is not renamed (when a nick changes) if another + exists with same name * command /clear [-all] now clears hotlist * fixed crash after /upgrade if a line in history is empty * fixed many crashes with DCC chat diff --git a/weechat/src/common/command.c b/weechat/src/common/command.c index 86d729fbe..5d18619ab 100644 --- a/weechat/src/common/command.c +++ b/weechat/src/common/command.c @@ -1371,7 +1371,8 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, buffer->server = NULL; gui_window_switch_server (window); } - + gui_status_draw (gui_current_window->buffer, 1); + gui_input_draw (gui_current_window->buffer, 1); } else { @@ -1381,8 +1382,8 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, ptr_channel = CHANNEL(buffer); gui_buffer_free (ptr_channel->buffer, 1); channel_free (SERVER(buffer), ptr_channel); - gui_status_draw (buffer, 1); - gui_input_draw (buffer, 1); + gui_status_draw (gui_current_window->buffer, 1); + gui_input_draw (gui_current_window->buffer, 1); } else { @@ -1412,9 +1413,9 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, } else gui_buffer_free (buffer, 1); + gui_status_draw (gui_current_window->buffer, 1); } } - gui_status_draw (buffer, 1); } else if (ascii_strcasecmp (argv[0], "notify") == 0) { diff --git a/weechat/src/common/session.c b/weechat/src/common/session.c index 3b4829b2e..3f24dc58a 100644 --- a/weechat/src/common/session.c +++ b/weechat/src/common/session.c @@ -1403,7 +1403,7 @@ session_load_buffer (FILE *file) if (channel_name) { - ptr_channel = channel_search_any (ptr_server, channel_name); + ptr_channel = channel_search_any_without_buffer (ptr_server, channel_name); if (!ptr_channel) { session_crash (file, _("channel not found for buffer")); diff --git a/weechat/src/irc/irc-channel.c b/weechat/src/irc/irc-channel.c index 3aeb32538..27938510c 100644 --- a/weechat/src/irc/irc-channel.c +++ b/weechat/src/irc/irc-channel.c @@ -185,6 +185,29 @@ channel_search_any (t_irc_server *server, char *channel_name) return NULL; } +/* + * channel_search_any_without_buffer: returns pointer on a channel with name + * looks only for channels without buffer + */ + +t_irc_channel * +channel_search_any_without_buffer (t_irc_server *server, char *channel_name) +{ + t_irc_channel *ptr_channel; + + if (!server || !channel_name) + return NULL; + + for (ptr_channel = server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if (!ptr_channel->buffer + && (ascii_strcasecmp (ptr_channel->name, channel_name) == 0)) + return ptr_channel; + } + return NULL; +} + /* * channel_search_dcc: returns pointer on a DCC chat channel with name */ diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index b3b9377b1..7e0b1d54c 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -1288,8 +1288,12 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *nick, char *arguments if ((CHANNEL(ptr_buffer)->name) && (ascii_strcasecmp (nick, CHANNEL(ptr_buffer)->name) == 0)) { - free (CHANNEL(ptr_buffer)->name); - CHANNEL(ptr_buffer)->name = strdup (arguments); + ptr_channel = channel_search_any (server, arguments); + if (!ptr_channel) + { + free (CHANNEL(ptr_buffer)->name); + CHANNEL(ptr_buffer)->name = strdup (arguments); + } } } } diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index dfab3e766..a4afde7c3 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -371,6 +371,7 @@ extern void channel_free (t_irc_server *, t_irc_channel *); extern void channel_free_all (t_irc_server *); extern t_irc_channel *channel_search (t_irc_server *, char *); extern t_irc_channel *channel_search_any (t_irc_server *, char *); +extern t_irc_channel *channel_search_any_without_buffer (t_irc_server *, char *); extern t_irc_channel *channel_search_dcc (t_irc_server *, char *); extern int string_is_channel (char *); extern char *channel_get_charset_decode_iso (t_irc_server *, t_irc_channel *);