pidgin/gtkrequest.c

changeset 39932
1788230a5ef3
parent 39897
16b440d4ab36
parent 39930
411f3df51bcd
child 40125
a7acc7b00d79
equal deleted inserted replaced
39927:691b13b22239 39932:1788230a5ef3
42 typedef struct 42 typedef struct
43 { 43 {
44 PurpleRequestType type; 44 PurpleRequestType type;
45 45
46 void *user_data; 46 void *user_data;
47 GtkWidget *dialog; 47 /* May be GtkWidget or GtkNativeDialog */
48 gpointer dialog;
48 49
49 GtkWidget *ok_button; 50 GtkWidget *ok_button;
50 51
51 size_t cb_count; 52 size_t cb_count;
52 GCallback *cbs; 53 GCallback *cbs;
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 =

mercurial