# HG changeset patch # User Daniel Atallah # Date 1217302847 0 # Node ID e97ff340bbf3dc1cf5855f0a6487be55f6284575 # Parent d1d32f318ce9c0e8f305ecd5bc89c71d181f84b2 Fix a race related to closing the roomlist window and do some minor cleanup. The relevant changes are in delete_win_cb(). Fixes #6134 diff -r d1d32f318ce9 -r e97ff340bbf3 pidgin/gtkroomlist.c --- a/pidgin/gtkroomlist.c Mon Jul 28 04:49:39 2008 +0000 +++ b/pidgin/gtkroomlist.c Tue Jul 29 03:40:47 2008 +0000 @@ -53,7 +53,6 @@ PurpleRoomlist *roomlist; gboolean pg_needs_pulse; - gboolean pg_to_active; guint pg_update_to; } PidginRoomlistDialog; @@ -84,32 +83,34 @@ static gint delete_win_cb(GtkWidget *w, GdkEventAny *e, gpointer d) { - PidginRoomlistDialog *dialog; - - dialog = (PidginRoomlistDialog *) d; + PidginRoomlistDialog *dialog = d; if (dialog->roomlist && purple_roomlist_get_in_progress(dialog->roomlist)) purple_roomlist_cancel_get_list(dialog->roomlist); + if (dialog->pg_update_to > 0) + purple_timeout_remove(dialog->pg_update_to); + if (dialog->roomlist) { - if (dialog->pg_to_active) { - purple_timeout_remove(dialog->pg_update_to); - dialog->pg_to_active = FALSE; + PidginRoomlist *rl = dialog->roomlist->ui_data; + + if (dialog->pg_update_to > 0) /* yes, that's right, unref it twice. */ purple_roomlist_unref(dialog->roomlist); - } + + if (rl) + rl->dialog = NULL; + purple_roomlist_unref(dialog->roomlist); } - /* free stuff here */ - if (dialog->roomlist) - purple_roomlist_unref(dialog->roomlist); + dialog->progress = NULL; g_free(dialog); return FALSE; } static void dialog_select_account_cb(GObject *w, PurpleAccount *account, - PidginRoomlistDialog *dialog) + PidginRoomlistDialog *dialog) { dialog->account = account; } @@ -186,9 +187,7 @@ GValue val; PurpleRoomlistRoom *room; static struct _menu_cb_info *info; - PidginRoomlistDialog *dialog; - - dialog = grl->dialog; + PidginRoomlistDialog *dialog = grl->dialog; if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { val.g_type = 0; @@ -239,9 +238,7 @@ { PurpleRoomlist *rl = dialog->roomlist; PidginRoomlist *grl = rl->ui_data; - struct _menu_cb_info *info; - - info = (struct _menu_cb_info*)g_object_get_data(G_OBJECT(button), "room-info"); + struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info"); if(info != NULL) do_add_room_cb(grl->tree, info); @@ -256,9 +253,7 @@ { PurpleRoomlist *rl = dialog->roomlist; PidginRoomlist *grl = rl->ui_data; - struct _menu_cb_info *info; - - info = (struct _menu_cb_info*)g_object_get_data(G_OBJECT(button), "room-info"); + struct _menu_cb_info *info = g_object_get_data(G_OBJECT(button), "room-info"); if(info != NULL) do_join_cb(grl->tree, info); @@ -490,12 +485,13 @@ static gboolean account_filter_func(PurpleAccount *account) { - PurpleConnection *gc = purple_account_get_connection(account); + PurpleConnection *conn = purple_account_get_connection(account); PurplePluginProtocolInfo *prpl_info = NULL; - prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl); + if (conn) + prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(conn->prpl); - return (prpl_info->roomlist_get_list != NULL); + return (prpl_info && prpl_info->roomlist_get_list != NULL); } gboolean @@ -518,10 +514,7 @@ pidgin_roomlist_dialog_new_with_account(PurpleAccount *account) { PidginRoomlistDialog *dialog; - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *bbox; + GtkWidget *window, *vbox, *vbox2, *bbox; dialog = g_new0(PidginRoomlistDialog, 1); dialog->account = account; @@ -611,9 +604,8 @@ void pidgin_roomlist_dialog_show_with_account(PurpleAccount *account) { - PidginRoomlistDialog *dialog; + PidginRoomlistDialog *dialog = pidgin_roomlist_dialog_new_with_account(account); - dialog = pidgin_roomlist_dialog_new_with_account(account); if (!dialog) return; @@ -627,9 +619,7 @@ static void pidgin_roomlist_new(PurpleRoomlist *list) { - PidginRoomlist *rl; - - rl = g_new0(PidginRoomlist, 1); + PidginRoomlist *rl = g_new0(PidginRoomlist, 1); list->ui_data = rl; @@ -802,7 +792,7 @@ if (!rl || !rl->dialog || !rl->dialog->pg_needs_pulse) { if (rl && rl->dialog) - rl->dialog->pg_to_active = FALSE; + rl->dialog->pg_update_to = 0; purple_roomlist_unref(list); return FALSE; } @@ -827,15 +817,14 @@ rl->num_rooms++; if (rl->dialog) { - if (!rl->dialog->pg_to_active) { - rl->dialog->pg_to_active = TRUE; + if (rl->dialog->pg_update_to == 0) { purple_roomlist_ref(list); rl->dialog->pg_update_to = g_timeout_add(100, pidgin_progress_bar_pulse, list); gtk_progress_bar_pulse(GTK_PROGRESS_BAR(rl->dialog->progress)); - } else { + } else rl->dialog->pg_needs_pulse = TRUE; - } } + if (room->parent) { parentrr = g_hash_table_lookup(rl->cats, room->parent); path = gtk_tree_row_reference_get_path(parentrr); @@ -881,14 +870,14 @@ } } -static void pidgin_roomlist_in_progress(PurpleRoomlist *list, gboolean flag) +static void pidgin_roomlist_in_progress(PurpleRoomlist *list, gboolean in_progress) { PidginRoomlist *rl = list->ui_data; if (!rl || !rl->dialog) return; - if (flag) { + if (in_progress) { if (rl->dialog->account_widget) gtk_widget_set_sensitive(rl->dialog->account_widget, FALSE); gtk_widget_set_sensitive(rl->dialog->stop_button, TRUE); @@ -905,12 +894,10 @@ static void pidgin_roomlist_destroy(PurpleRoomlist *list) { - PidginRoomlist *rl; + PidginRoomlist *rl = list->ui_data; roomlists = g_list_remove(roomlists, list); - rl = list->ui_data; - g_return_if_fail(rl != NULL); g_hash_table_destroy(rl->cats);