Mercurial > pidgin
comparison src/ft.c @ 4247:3ea14f99c35c
[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 <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 08 Jan 2003 07:04:01 +0000 |
parents | cd84b0fd63fc |
children | 9c7fcb211886 |
comparison
equal
deleted
inserted
replaced
4246:2a2d6d21f1d7 | 4247:3ea14f99c35c |
---|---|
83 static void ft_delete(struct file_transfer *xfer); | 83 static void ft_delete(struct file_transfer *xfer); |
84 static void ft_callback(gpointer data, gint source, GaimInputCondition condition); | 84 static void ft_callback(gpointer data, gint source, GaimInputCondition condition); |
85 static void ft_nextfile(struct file_transfer *xfer); | 85 static void ft_nextfile(struct file_transfer *xfer); |
86 static int ft_mkdir(const char *name); | 86 static int ft_mkdir(const char *name); |
87 static int ft_mkdir_help(char *dir); | 87 static int ft_mkdir_help(char *dir); |
88 static gboolean ft_choose_file_close(GtkWidget *widget, GdkEvent *event, | |
89 gpointer user_data); | |
88 | 90 |
89 static struct file_transfer *ft_new(int type, struct gaim_connection *gc, | 91 static struct file_transfer *ft_new(int type, struct gaim_connection *gc, |
90 const char *who) | 92 const char *who) |
91 { | 93 { |
92 struct file_transfer *xfer = g_new0(struct file_transfer, 1); | 94 struct file_transfer *xfer = g_new0(struct file_transfer, 1); |
93 xfer->type = type; | 95 xfer->type = type; |
94 xfer->state = FILE_TRANSFER_STATE_ASK; | 96 xfer->state = FILE_TRANSFER_STATE_ASK; |
95 xfer->gc = gc; | 97 xfer->gc = gc; |
96 xfer->who = g_strdup(who); | 98 xfer->who = g_strdup(who); |
97 xfer->filesdone = 0; | 99 xfer->filesdone = 0; |
100 xfer->w = NULL; | |
98 | 101 |
99 return xfer; | 102 return xfer; |
100 } | 103 } |
101 | 104 |
102 struct file_transfer *transfer_in_add(struct gaim_connection *gc, | 105 struct file_transfer *transfer_in_add(struct gaim_connection *gc, |
164 /* We canceled the transfer, either by declining the initial | 167 /* We canceled the transfer, either by declining the initial |
165 * confirmation dialog or canceling the file dialog. | 168 * confirmation dialog or canceling the file dialog. |
166 */ | 169 */ |
167 static void ft_cancel(struct file_transfer *xfer) | 170 static void ft_cancel(struct file_transfer *xfer) |
168 { | 171 { |
172 debug_printf("** ft_cancel\n"); | |
173 | |
169 /* Make sure we weren't aborted while waiting for | 174 /* Make sure we weren't aborted while waiting for |
170 * confirmation from the user. | 175 * confirmation from the user. |
171 */ | 176 */ |
172 if (xfer->state == FILE_TRANSFER_STATE_INTERRUPTED) { | 177 if (xfer->state == FILE_TRANSFER_STATE_INTERRUPTED) { |
173 xfer->state = FILE_TRANSFER_STATE_CLEANUP; | 178 xfer->state = FILE_TRANSFER_STATE_CLEANUP; |
230 else if (xfer->state == FILE_TRANSFER_STATE_CHOOSEFILE) { | 235 else if (xfer->state == FILE_TRANSFER_STATE_CHOOSEFILE) { |
231 /* It's safe to clean up now. Just make sure we | 236 /* It's safe to clean up now. Just make sure we |
232 * destroy the dialog window first. | 237 * destroy the dialog window first. |
233 */ | 238 */ |
234 if (xfer->w) { | 239 if (xfer->w) { |
235 gtk_signal_disconnect_by_func(GTK_OBJECT(xfer->w), | 240 g_signal_handlers_disconnect_by_func(G_OBJECT(xfer->w), |
236 G_CALLBACK(ft_cancel), xfer); | 241 G_CALLBACK(ft_choose_file_close), xfer); |
237 gtk_widget_destroy(xfer->w); | 242 gtk_widget_destroy(xfer->w); |
238 xfer->w = NULL; | 243 xfer->w = NULL; |
239 } | 244 } |
240 } | 245 } |
241 | 246 |
365 *size = xfer->sizes[xfer->filesdone]; | 370 *size = xfer->sizes[xfer->filesdone]; |
366 *name = xfer->names[xfer->filesdone]; | 371 *name = xfer->names[xfer->filesdone]; |
367 return 0; | 372 return 0; |
368 } | 373 } |
369 | 374 |
375 static gboolean | |
376 ft_choose_file_close(GtkWidget *widget, GdkEvent *event, gpointer user_data) | |
377 { | |
378 ft_cancel((struct file_transfer *)user_data); | |
379 | |
380 return FALSE; | |
381 } | |
382 | |
383 static void | |
384 ft_cancel_button_cb(GtkButton *button, gpointer user_data) | |
385 { | |
386 ft_cancel((struct file_transfer *)user_data); | |
387 } | |
388 | |
370 static int ft_choose_file(struct file_transfer *xfer) | 389 static int ft_choose_file(struct file_transfer *xfer) |
371 { | 390 { |
372 char *curdir = g_get_current_dir(); /* should be freed */ | 391 char *curdir = g_get_current_dir(); /* should be freed */ |
373 char *initstr; | 392 char *initstr; |
374 | 393 |
399 | 418 |
400 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xfer->w), | 419 gtk_file_selection_set_filename(GTK_FILE_SELECTION(xfer->w), |
401 initstr); | 420 initstr); |
402 g_free(initstr); | 421 g_free(initstr); |
403 | 422 |
404 g_signal_connect(GTK_OBJECT(xfer->w), "delete_event", | 423 g_signal_connect(G_OBJECT(xfer->w), "delete_event", |
405 G_CALLBACK(ft_cancel), xfer); | 424 G_CALLBACK(ft_choose_file_close), xfer); |
406 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), | 425 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->cancel_button), "clicked", |
407 "clicked", G_CALLBACK(ft_cancel), xfer); | 426 G_CALLBACK(ft_cancel_button_cb), xfer); |
408 g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), | 427 g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(xfer->w)->ok_button), "clicked", |
409 "clicked", G_CALLBACK(ft_choose_ok), xfer); | 428 G_CALLBACK(ft_choose_ok), xfer); |
429 | |
410 gtk_widget_show(xfer->w); | 430 gtk_widget_show(xfer->w); |
411 | 431 |
412 return 0; | 432 return 0; |
413 } | 433 } |
414 | 434 |