From: Christian H. <ch...@us...> - 2003-03-02 23:02:31
|
Update of /cvsroot/gaim/gaim/src In directory sc8-pr-cvs1:/tmp/cvs-serv1677/src Modified Files: conversation.c Log Message: This should fix the "Closing a window with chats causes gaim to go kab00m" bug. Please test it. Index: conversation.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/conversation.c,v retrieving revision 1.498 retrieving revision 1.499 diff -u -d -r1.498 -r1.499 --- conversation.c 27 Feb 2003 10:05:05 -0000 1.498 +++ conversation.c 2 Mar 2003 23:02:25 -0000 1.499 @@ -40,7 +40,6 @@ { char *name; gaim_conv_placement_fnc fnc; - }; #define SEND_TYPED_TIMEOUT 5000 @@ -464,28 +463,40 @@ ops = gaim_window_get_ui_ops(win); - for (node = g_list_first(gaim_window_get_conversations(win)); - node != NULL; - node = g_list_next(node)) - { - struct gaim_conversation *conv; - - conv = (struct gaim_conversation *)node->data; + /* + * If there are any conversations in this, destroy them all. The last + * conversation will call gaim_window_destroy(), but this time, this + * check will fail and the window will actually be destroyed. + * + * This is needed because chats may not close right away. They may + * wait for notification first. When they get that, the window is + * already destroyed, and gaim either crashes or spits out gtk warnings. + * The problem is fixed with this check. + */ + if (gaim_window_get_conversation_count(win) > 0) { - conv->window = NULL; - gaim_conversation_destroy(conv); + for (node = g_list_first(gaim_window_get_conversations(win)); + node != NULL; + node = g_list_next(node)) + { + struct gaim_conversation *conv; - node->data = NULL; - } + conv = (struct gaim_conversation *)node->data; - if (ops != NULL && ops->destroy_window != NULL) - ops->destroy_window(win); + gaim_conversation_destroy(conv); + } + } + else + { + if (ops != NULL && ops->destroy_window != NULL) + ops->destroy_window(win); - g_list_free(gaim_window_get_conversations(win)); + g_list_free(gaim_window_get_conversations(win)); - windows = g_list_remove(windows, win); + windows = g_list_remove(windows, win); - g_free(win); + g_free(win); + } } void @@ -959,6 +970,7 @@ * * -- ChipX86 */ + if (gc && g_slist_find(gc->buddy_chats, conv) != NULL) { serv_chat_leave(gc, gaim_chat_get_id(GAIM_CHAT(conv))); |