summaryrefslogtreecommitdiff
path: root/pidgin/gtkroomlist.c
diff options
context:
space:
mode:
authorDaniel Atallah <datallah@pidgin.im>2008-07-29 03:40:47 +0000
committerDaniel Atallah <datallah@pidgin.im>2008-07-29 03:40:47 +0000
commitdfe463cfed15fac349d9e358fbe0be6320f3d7e5 (patch)
tree511dedfed4f8d973a4f85c8b4550d69dbe342fe6 /pidgin/gtkroomlist.c
parent63f88a5e7e66c24159a13faf3b0c4b876c1f666e (diff)
downloadpidgin-dfe463cfed15fac349d9e358fbe0be6320f3d7e5.tar.gz
Fix a race related to closing the roomlist window and do some minor cleanup.
The relevant changes are in delete_win_cb(). Fixes #6134
Diffstat (limited to 'pidgin/gtkroomlist.c')
-rw-r--r--pidgin/gtkroomlist.c73
1 files changed, 30 insertions, 43 deletions
diff --git a/pidgin/gtkroomlist.c b/pidgin/gtkroomlist.c
index 937f6cbf2c..0798943cae 100644
--- a/pidgin/gtkroomlist.c
+++ b/pidgin/gtkroomlist.c
@@ -53,7 +53,6 @@ typedef struct _PidginRoomlistDialog {
PurpleRoomlist *roomlist;
gboolean pg_needs_pulse;
- gboolean pg_to_active;
guint pg_update_to;
} PidginRoomlistDialog;
@@ -84,32 +83,34 @@ static GList *roomlists = NULL;
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);
- }
- }
- /* free stuff here */
- if (dialog->roomlist)
+ if (rl)
+ rl->dialog = NULL;
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 @@ selection_changed_cb(GtkTreeSelection *selection, PidginRoomlist *grl) {
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 @@ static void add_room_to_blist_cb(GtkButton *button, PidginRoomlistDialog *dialog
{
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 @@ static void join_button_cb(GtkButton *button, PidginRoomlistDialog *dialog)
{
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 @@ pidgin_roomlist_create_tooltip(GtkWidget *widget, GtkTreePath *path,
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 @@ static PidginRoomlistDialog *
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 @@ pidgin_roomlist_dialog_new_with_account(PurpleAccount *account)
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 @@ void pidgin_roomlist_dialog_show(void)
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 @@ static gboolean pidgin_progress_bar_pulse(gpointer data)
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 @@ static void pidgin_roomlist_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *r
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_add_room(PurpleRoomlist *list, PurpleRoomlistRoom *r
}
}
-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_in_progress(PurpleRoomlist *list, gboolean flag)
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);