# HG changeset patch # User Christian Hammond # Date 1042009441 0 # Node ID 3ea14f99c35cfb13601e2193dce1f51c7f59fcaf # Parent 2a2d6d21f1d73f9b76cc1d20ff997b0ced8b20c3 [gaim-migrate @ 4497] Fixed the "Clicking the close button on a file transfer send crashes gaim" bug. It turns out everything was mapped to ft_cancel(), which accepted a struct file_transfer *, but all those signal handlers had different params, so all kinds of bad, evil things happened. Tsk tsk. And now, back to work on my Instant Massage prpl. committer: Tailor Script diff -r 2a2d6d21f1d7 -r 3ea14f99c35c src/ft.c --- a/src/ft.c Wed Jan 08 06:56:31 2003 +0000 +++ b/src/ft.c Wed Jan 08 07:04:01 2003 +0000 @@ -85,6 +85,8 @@ static void ft_nextfile(struct file_transfer *xfer); static int ft_mkdir(const char *name); static int ft_mkdir_help(char *dir); +static gboolean ft_choose_file_close(GtkWidget *widget, GdkEvent *event, + gpointer user_data); static struct file_transfer *ft_new(int type, struct gaim_connection *gc, const char *who) @@ -95,6 +97,7 @@ xfer->gc = gc; xfer->who = g_strdup(who); xfer->filesdone = 0; + xfer->w = NULL; return xfer; } @@ -166,6 +169,8 @@ */ static void ft_cancel(struct file_transfer *xfer) { + debug_printf("** ft_cancel\n"); + /* Make sure we weren't aborted while waiting for * confirmation from the user. */ @@ -232,8 +237,8 @@ * destroy the dialog window first. */ if (xfer->w) { - gtk_signal_disconnect_by_func(GTK_OBJECT(xfer->w), - G_CALLBACK(ft_cancel), xfer); + g_signal_handlers_disconnect_by_func(G_OBJECT(xfer->w), + G_CALLBACK(ft_choose_file_close), xfer); gtk_widget_destroy(xfer->w); xfer->w = NULL; } @@ -367,6 +372,20 @@ return 0; } +static gboolean +ft_choose_file_close(GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + ft_cancel((struct file_transfer *)user_data); + + return FALSE; +} + +static void +ft_cancel_button_cb(GtkButton *button, gpointer user_data) +{ + ft_cancel((struct file_transfer *)user_data); +} + static int ft_choose_file(struct file_transfer *xfer) { char *curdir = g_get_current_dir(); /* should be freed */ @@ -401,12 +420,13 @@ initstr); g_free(initstr); - g_signal_connect(GTK_OBJECT(xfer->w), "delete_event", - G_CALLBACK(ft_cancel), xfer); - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), - "clicked", G_CALLBACK(ft_cancel), xfer); - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), - "clicked", G_CALLBACK(ft_choose_ok), xfer); + g_signal_connect(G_OBJECT(xfer->w), "delete_event", + G_CALLBACK(ft_choose_file_close), xfer); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), "clicked", + G_CALLBACK(ft_cancel_button_cb), xfer); + g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), "clicked", + G_CALLBACK(ft_choose_ok), xfer); + gtk_widget_show(xfer->w); return 0;