diff --git a/ChangeLog b/ChangeLog index 083b9419f..a9843d677 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,10 +1,11 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2007-01-16 +ChangeLog - 2007-01-17 Version 0.2.4 (under dev!): + * fixed crash when closing a buffer opened on many windows * fixed freeze with SSL server when disconnecting after connection loss (bug #18735) diff --git a/src/common/command.c b/src/common/command.c index f56328688..ae28a81ae 100644 --- a/src/common/command.c +++ b/src/common/command.c @@ -1157,10 +1157,10 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, { ptr_channel = channel_search_any (SERVER(buffer), CHANNEL(buffer)->name); - if (ptr_channel) - channel_free (SERVER(buffer), - ptr_channel); + ptr_server = SERVER(buffer); gui_buffer_free (buffer, 1); + if (ptr_channel) + channel_free (ptr_server, ptr_channel); } } else diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 56ff2264c..e3f30e87c 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -466,6 +466,16 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) create_new = (buffer->server || buffer->channel); + if (switch_to_another) + { + for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) + { + if ((buffer == ptr_win->buffer) && + ((buffer->next_buffer) || (buffer->prev_buffer))) + gui_buffer_switch_previous (ptr_win); + } + } + hotlist_remove_buffer (buffer); if (hotlist_initial_buffer == buffer) hotlist_initial_buffer = NULL; @@ -486,16 +496,6 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) ptr_server->saved_buffer = NULL; } - if (switch_to_another) - { - for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) - { - if ((buffer == ptr_win->buffer) && - ((buffer->next_buffer) || (buffer->prev_buffer))) - gui_buffer_switch_previous (ptr_win); - } - } - /* decrease buffer number for all next buffers */ for (ptr_buffer = buffer->next_buffer; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { @@ -546,7 +546,8 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) (void) gui_buffer_new (gui_windows, NULL, NULL, BUFFER_TYPE_STANDARD, 1); - gui_status_draw (gui_current_window->buffer, 1); + if (gui_windows && gui_current_window && gui_current_window->buffer) + gui_status_draw (gui_current_window->buffer, 1); } /* diff --git a/src/gui/gui-window.c b/src/gui/gui-window.c index 5176c6ed7..8d9ab822e 100644 --- a/src/gui/gui-window.c +++ b/src/gui/gui-window.c @@ -294,6 +294,9 @@ gui_window_free (t_gui_window *window) gui_windows = window->next_window; if (last_gui_window == window) last_gui_window = window->prev_window; + + if (gui_current_window == window) + gui_current_window = gui_windows; free (window); } diff --git a/weechat/ChangeLog b/weechat/ChangeLog index 083b9419f..a9843d677 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -1,10 +1,11 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2007-01-16 +ChangeLog - 2007-01-17 Version 0.2.4 (under dev!): + * fixed crash when closing a buffer opened on many windows * fixed freeze with SSL server when disconnecting after connection loss (bug #18735) diff --git a/weechat/src/common/command.c b/weechat/src/common/command.c index f56328688..ae28a81ae 100644 --- a/weechat/src/common/command.c +++ b/weechat/src/common/command.c @@ -1157,10 +1157,10 @@ weechat_cmd_buffer (t_irc_server *server, t_irc_channel *channel, { ptr_channel = channel_search_any (SERVER(buffer), CHANNEL(buffer)->name); - if (ptr_channel) - channel_free (SERVER(buffer), - ptr_channel); + ptr_server = SERVER(buffer); gui_buffer_free (buffer, 1); + if (ptr_channel) + channel_free (ptr_server, ptr_channel); } } else diff --git a/weechat/src/gui/gui-buffer.c b/weechat/src/gui/gui-buffer.c index 56ff2264c..e3f30e87c 100644 --- a/weechat/src/gui/gui-buffer.c +++ b/weechat/src/gui/gui-buffer.c @@ -466,6 +466,16 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) create_new = (buffer->server || buffer->channel); + if (switch_to_another) + { + for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) + { + if ((buffer == ptr_win->buffer) && + ((buffer->next_buffer) || (buffer->prev_buffer))) + gui_buffer_switch_previous (ptr_win); + } + } + hotlist_remove_buffer (buffer); if (hotlist_initial_buffer == buffer) hotlist_initial_buffer = NULL; @@ -486,16 +496,6 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) ptr_server->saved_buffer = NULL; } - if (switch_to_another) - { - for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) - { - if ((buffer == ptr_win->buffer) && - ((buffer->next_buffer) || (buffer->prev_buffer))) - gui_buffer_switch_previous (ptr_win); - } - } - /* decrease buffer number for all next buffers */ for (ptr_buffer = buffer->next_buffer; ptr_buffer; ptr_buffer = ptr_buffer->next_buffer) { @@ -546,7 +546,8 @@ gui_buffer_free (t_gui_buffer *buffer, int switch_to_another) (void) gui_buffer_new (gui_windows, NULL, NULL, BUFFER_TYPE_STANDARD, 1); - gui_status_draw (gui_current_window->buffer, 1); + if (gui_windows && gui_current_window && gui_current_window->buffer) + gui_status_draw (gui_current_window->buffer, 1); } /* diff --git a/weechat/src/gui/gui-window.c b/weechat/src/gui/gui-window.c index 5176c6ed7..8d9ab822e 100644 --- a/weechat/src/gui/gui-window.c +++ b/weechat/src/gui/gui-window.c @@ -294,6 +294,9 @@ gui_window_free (t_gui_window *window) gui_windows = window->next_window; if (last_gui_window == window) last_gui_window = window->prev_window; + + if (gui_current_window == window) + gui_current_window = gui_windows; free (window); }