| 2344 |
2345 |
| 2345 return data; |
2346 return data; |
| 2346 } |
2347 } |
| 2347 |
2348 |
| 2348 static void |
2349 static void |
| 2349 file_yes_no_cb(PidginRequestData *data, gint id) |
|
| 2350 { |
|
| 2351 /* Only call the callback if yes was selected, otherwise the request |
|
| 2352 * (eg. file transfer) will be cancelled, then when a new filename is chosen |
|
| 2353 * things go BOOM */ |
|
| 2354 if (id == 1) { |
|
| 2355 if (data->cbs[1] != NULL) |
|
| 2356 ((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); |
|
| 2357 purple_request_close(data->type, data); |
|
| 2358 } else { |
|
| 2359 pidgin_clear_cursor(GTK_WIDGET(data->dialog)); |
|
| 2360 } |
|
| 2361 } |
|
| 2362 |
|
| 2363 static void |
|
| 2364 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data) |
2350 file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data) |
| 2365 { |
2351 { |
| 2366 gchar *current_folder; |
2352 gchar *current_folder; |
| 2367 |
|
| 2368 generic_response_start(data); |
|
| 2369 |
2353 |
| 2370 if (response != GTK_RESPONSE_ACCEPT) { |
2354 if (response != GTK_RESPONSE_ACCEPT) { |
| 2371 if (data->cbs[0] != NULL) |
2355 if (data->cbs[0] != NULL) |
| 2372 ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL); |
2356 ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL); |
| 2373 purple_request_close(data->type, data); |
2357 purple_request_close(data->type, data); |
| 2382 } else { |
2366 } else { |
| 2383 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
2367 purple_prefs_set_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", current_folder); |
| 2384 } |
2368 } |
| 2385 g_free(current_folder); |
2369 g_free(current_folder); |
| 2386 } |
2370 } |
| 2387 if ((data->u.file.savedialog == TRUE) && |
2371 if (data->cbs[1] != NULL) { |
| 2388 (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { |
2372 ((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); |
| 2389 purple_request_action(data, NULL, _("That file already exists"), |
2373 } |
| 2390 _("Would you like to overwrite it?"), 0, |
2374 purple_request_close(data->type, data); |
| 2391 NULL, |
|
| 2392 data, 2, |
|
| 2393 _("Overwrite"), G_CALLBACK(file_yes_no_cb), |
|
| 2394 _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); |
|
| 2395 } else |
|
| 2396 file_yes_no_cb(data, 1); |
|
| 2397 } |
2375 } |
| 2398 |
2376 |
| 2399 static void * |
2377 static void * |
| 2400 pidgin_request_file(const char *title, const char *filename, |
2378 pidgin_request_file(const char *title, const char *filename, |
| 2401 gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, |
2379 gboolean savedialog, GCallback ok_cb, GCallback cancel_cb, |
| 2402 PurpleRequestCommonParameters *cpar, void *user_data) |
2380 PurpleRequestCommonParameters *cpar, void *user_data) |
| 2403 { |
2381 { |
| 2404 PidginRequestData *data; |
2382 PidginRequestData *data; |
| 2405 GtkWidget *filesel; |
2383 GtkFileChooserNative *filesel; |
| 2406 #ifdef _WIN32 |
2384 #ifdef _WIN32 |
| 2407 const gchar *current_folder; |
2385 const gchar *current_folder; |
| 2408 gboolean folder_set = FALSE; |
2386 gboolean folder_set = FALSE; |
| 2409 #endif |
2387 #endif |
| 2410 |
2388 |
| 2415 data->cbs = g_new0(GCallback, 2); |
2393 data->cbs = g_new0(GCallback, 2); |
| 2416 data->cbs[0] = cancel_cb; |
2394 data->cbs[0] = cancel_cb; |
| 2417 data->cbs[1] = ok_cb; |
2395 data->cbs[1] = ok_cb; |
| 2418 data->u.file.savedialog = savedialog; |
2396 data->u.file.savedialog = savedialog; |
| 2419 |
2397 |
| 2420 filesel = gtk_file_chooser_dialog_new( |
2398 filesel = gtk_file_chooser_native_new( |
| 2421 title ? title : (savedialog ? _("Save File...") |
2399 title ? title |
| 2422 : _("Open File...")), |
2400 : (savedialog ? _("Save File...") : _("Open File...")), |
| 2423 NULL, |
2401 NULL, |
| 2424 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
2402 savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE |
| 2425 : GTK_FILE_CHOOSER_ACTION_OPEN, |
2403 : GTK_FILE_CHOOSER_ACTION_OPEN, |
| 2426 _("_Cancel"), GTK_RESPONSE_CANCEL, |
2404 savedialog ? _("_Save") : _("_Open"), _("_Cancel")); |
| 2427 savedialog ? _("_Save") |
2405 gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(filesel), |
| 2428 : _("_Open"), |
2406 TRUE); |
| 2429 GTK_RESPONSE_ACCEPT, |
|
| 2430 NULL); |
|
| 2431 gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT); |
|
| 2432 |
|
| 2433 pidgin_request_add_help(GTK_DIALOG(filesel), cpar); |
|
| 2434 |
2407 |
| 2435 if ((filename != NULL) && (*filename != '\0')) { |
2408 if ((filename != NULL) && (*filename != '\0')) { |
| 2436 if (savedialog) |
2409 if (savedialog) |
| 2437 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename); |
2410 gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(filesel), filename); |
| 2438 else if (g_file_test(filename, G_FILE_TEST_EXISTS)) |
2411 else if (g_file_test(filename, G_FILE_TEST_EXISTS)) |
| 2464 #endif |
2437 #endif |
| 2465 |
2438 |
| 2466 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
2439 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", |
| 2467 G_CALLBACK(file_ok_check_if_exists_cb), data); |
2440 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 2468 |
2441 |
| |
2442 #if 0 |
| |
2443 /* FIXME: Not implemented for native dialogs. */ |
| 2469 pidgin_auto_parent_window(filesel); |
2444 pidgin_auto_parent_window(filesel); |
| |
2445 #endif |
| 2470 |
2446 |
| 2471 data->dialog = filesel; |
2447 data->dialog = filesel; |
| 2472 gtk_widget_show(filesel); |
2448 gtk_native_dialog_show(GTK_NATIVE_DIALOG(filesel)); |
| 2473 |
2449 |
| 2474 return (void *)data; |
2450 return (void *)data; |
| 2475 } |
2451 } |
| 2476 |
2452 |
| 2477 static void * |
2453 static void * |
| 2478 pidgin_request_folder(const char *title, const char *dirname, GCallback ok_cb, |
2454 pidgin_request_folder(const char *title, const char *dirname, GCallback ok_cb, |
| 2479 GCallback cancel_cb, PurpleRequestCommonParameters *cpar, |
2455 GCallback cancel_cb, PurpleRequestCommonParameters *cpar, |
| 2480 void *user_data) |
2456 void *user_data) |
| 2481 { |
2457 { |
| 2482 PidginRequestData *data; |
2458 PidginRequestData *data; |
| 2483 GtkWidget *dirsel; |
2459 GtkFileChooserNative *dirsel; |
| 2484 |
2460 |
| 2485 data = g_new0(PidginRequestData, 1); |
2461 data = g_new0(PidginRequestData, 1); |
| 2486 data->type = PURPLE_REQUEST_FOLDER; |
2462 data->type = PURPLE_REQUEST_FOLDER; |
| 2487 data->user_data = user_data; |
2463 data->user_data = user_data; |
| 2488 data->cb_count = 2; |
2464 data->cb_count = 2; |
| 2489 data->cbs = g_new0(GCallback, 2); |
2465 data->cbs = g_new0(GCallback, 2); |
| 2490 data->cbs[0] = cancel_cb; |
2466 data->cbs[0] = cancel_cb; |
| 2491 data->cbs[1] = ok_cb; |
2467 data->cbs[1] = ok_cb; |
| 2492 data->u.file.savedialog = FALSE; |
2468 data->u.file.savedialog = FALSE; |
| 2493 |
2469 |
| 2494 dirsel = gtk_file_chooser_dialog_new( |
2470 dirsel = gtk_file_chooser_native_new( |
| 2495 title ? title : _("Select Folder..."), |
2471 title ? title : _("Select Folder..."), NULL, |
| 2496 NULL, |
2472 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_OK"), _("_Cancel")); |
| 2497 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, |
|
| 2498 _("_Cancel"), GTK_RESPONSE_CANCEL, |
|
| 2499 _("_OK"), GTK_RESPONSE_ACCEPT, |
|
| 2500 NULL); |
|
| 2501 gtk_dialog_set_default_response(GTK_DIALOG(dirsel), GTK_RESPONSE_ACCEPT); |
|
| 2502 |
|
| 2503 pidgin_request_add_help(GTK_DIALOG(dirsel), cpar); |
|
| 2504 |
2473 |
| 2505 if ((dirname != NULL) && (*dirname != '\0')) |
2474 if ((dirname != NULL) && (*dirname != '\0')) |
| 2506 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
2475 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); |
| 2507 |
2476 |
| 2508 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
2477 g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(dirsel)), "response", |
| 2509 G_CALLBACK(file_ok_check_if_exists_cb), data); |
2478 G_CALLBACK(file_ok_check_if_exists_cb), data); |
| 2510 |
2479 |
| 2511 data->dialog = dirsel; |
2480 data->dialog = dirsel; |
| |
2481 #if 0 |
| |
2482 /* FIXME: Not implemented for native dialogs. */ |
| 2512 pidgin_auto_parent_window(dirsel); |
2483 pidgin_auto_parent_window(dirsel); |
| 2513 |
2484 #endif |
| 2514 gtk_widget_show(dirsel); |
2485 |
| |
2486 gtk_native_dialog_show(GTK_NATIVE_DIALOG(dirsel)); |
| 2515 |
2487 |
| 2516 return (void *)data; |
2488 return (void *)data; |
| 2517 } |
2489 } |
| 2518 |
2490 |
| 2519 /* if request callback issues another request, it should be attached to the |
2491 /* if request callback issues another request, it should be attached to the |
| 2549 { |
2521 { |
| 2550 PidginRequestData *data = (PidginRequestData *)ui_handle; |
2522 PidginRequestData *data = (PidginRequestData *)ui_handle; |
| 2551 |
2523 |
| 2552 g_free(data->cbs); |
2524 g_free(data->cbs); |
| 2553 |
2525 |
| 2554 pidgin_window_detach_children(GTK_WINDOW(data->dialog)); |
2526 if (type == PURPLE_REQUEST_FILE || type == PURPLE_REQUEST_FOLDER) { |
| 2555 |
2527 /* Will be a GtkNativeDialog, not GtkDialog. */ |
| 2556 gtk_widget_destroy(data->dialog); |
2528 g_object_unref(data->dialog); |
| |
2529 } else { |
| |
2530 pidgin_window_detach_children(GTK_WINDOW(data->dialog)); |
| |
2531 |
| |
2532 gtk_widget_destroy(data->dialog); |
| |
2533 } |
| 2557 |
2534 |
| 2558 if (type == PURPLE_REQUEST_FIELDS) |
2535 if (type == PURPLE_REQUEST_FIELDS) |
| 2559 purple_request_fields_destroy(data->u.multifield.fields); |
2536 purple_request_fields_destroy(data->u.multifield.fields); |
| 2560 else if (type == PURPLE_REQUEST_FILE) |
2537 else if (type == PURPLE_REQUEST_FILE) |
| 2561 g_free(data->u.file.name); |
2538 g_free(data->u.file.name); |
| 2568 { |
2545 { |
| 2569 PidginRequestData *data = ui_handle; |
2546 PidginRequestData *data = ui_handle; |
| 2570 |
2547 |
| 2571 g_return_val_if_fail( |
2548 g_return_val_if_fail( |
| 2572 purple_request_is_valid_ui_handle(data, NULL), NULL); |
2549 purple_request_is_valid_ui_handle(data, NULL), NULL); |
| |
2550 |
| |
2551 if (data->type == PURPLE_REQUEST_FILE || |
| |
2552 data->type == PURPLE_REQUEST_FOLDER) { |
| |
2553 /* Not a GtkWidget, but a GtkFileChooserNative. Eventually this function |
| |
2554 * should not be needed, once we don't need to auto-parent. */ |
| |
2555 return NULL; |
| |
2556 } |
| 2573 |
2557 |
| 2574 return GTK_WINDOW(data->dialog); |
2558 return GTK_WINDOW(data->dialog); |
| 2575 } |
2559 } |
| 2576 |
2560 |
| 2577 static PurpleRequestUiOps ops = |
2561 static PurpleRequestUiOps ops = |