diff -r 691b13b22239 -r 1788230a5ef3 pidgin/gtkrequest.c --- a/pidgin/gtkrequest.c Fri Oct 04 03:36:29 2019 +0000 +++ b/pidgin/gtkrequest.c Fri Oct 04 03:46:50 2019 +0000 @@ -44,7 +44,8 @@ PurpleRequestType type; void *user_data; - GtkWidget *dialog; + /* May be GtkWidget or GtkNativeDialog */ + gpointer dialog; GtkWidget *ok_button; @@ -2346,27 +2347,10 @@ } static void -file_yes_no_cb(PidginRequestData *data, gint id) -{ - /* Only call the callback if yes was selected, otherwise the request - * (eg. file transfer) will be cancelled, then when a new filename is chosen - * things go BOOM */ - if (id == 1) { - if (data->cbs[1] != NULL) - ((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); - purple_request_close(data->type, data); - } else { - pidgin_clear_cursor(GTK_WIDGET(data->dialog)); - } -} - -static void file_ok_check_if_exists_cb(GtkWidget *widget, gint response, PidginRequestData *data) { gchar *current_folder; - generic_response_start(data); - if (response != GTK_RESPONSE_ACCEPT) { if (data->cbs[0] != NULL) ((PurpleRequestFileCb)data->cbs[0])(data->user_data, NULL); @@ -2384,16 +2368,10 @@ } g_free(current_folder); } - if ((data->u.file.savedialog == TRUE) && - (g_file_test(data->u.file.name, G_FILE_TEST_EXISTS))) { - purple_request_action(data, NULL, _("That file already exists"), - _("Would you like to overwrite it?"), 0, - NULL, - data, 2, - _("Overwrite"), G_CALLBACK(file_yes_no_cb), - _("Choose New Name"), G_CALLBACK(file_yes_no_cb)); - } else - file_yes_no_cb(data, 1); + if (data->cbs[1] != NULL) { + ((PurpleRequestFileCb)data->cbs[1])(data->user_data, data->u.file.name); + } + purple_request_close(data->type, data); } static void * @@ -2402,7 +2380,7 @@ PurpleRequestCommonParameters *cpar, void *user_data) { PidginRequestData *data; - GtkWidget *filesel; + GtkFileChooserNative *filesel; #ifdef _WIN32 const gchar *current_folder; gboolean folder_set = FALSE; @@ -2417,20 +2395,15 @@ data->cbs[1] = ok_cb; data->u.file.savedialog = savedialog; - filesel = gtk_file_chooser_dialog_new( - title ? title : (savedialog ? _("Save File...") - : _("Open File...")), - NULL, - savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE - : GTK_FILE_CHOOSER_ACTION_OPEN, - _("_Cancel"), GTK_RESPONSE_CANCEL, - savedialog ? _("_Save") - : _("_Open"), - GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(filesel), GTK_RESPONSE_ACCEPT); - - pidgin_request_add_help(GTK_DIALOG(filesel), cpar); + filesel = gtk_file_chooser_native_new( + title ? title + : (savedialog ? _("Save File...") : _("Open File...")), + NULL, + savedialog ? GTK_FILE_CHOOSER_ACTION_SAVE + : GTK_FILE_CHOOSER_ACTION_OPEN, + savedialog ? _("_Save") : _("_Open"), _("_Cancel")); + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(filesel), + TRUE); if ((filename != NULL) && (*filename != '\0')) { if (savedialog) @@ -2466,10 +2439,13 @@ g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(filesel)), "response", G_CALLBACK(file_ok_check_if_exists_cb), data); +#if 0 + /* FIXME: Not implemented for native dialogs. */ pidgin_auto_parent_window(filesel); +#endif data->dialog = filesel; - gtk_widget_show(filesel); + gtk_native_dialog_show(GTK_NATIVE_DIALOG(filesel)); return (void *)data; } @@ -2480,7 +2456,7 @@ void *user_data) { PidginRequestData *data; - GtkWidget *dirsel; + GtkFileChooserNative *dirsel; data = g_new0(PidginRequestData, 1); data->type = PURPLE_REQUEST_FOLDER; @@ -2491,16 +2467,9 @@ data->cbs[1] = ok_cb; data->u.file.savedialog = FALSE; - dirsel = gtk_file_chooser_dialog_new( - title ? title : _("Select Folder..."), - NULL, - GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, - _("_Cancel"), GTK_RESPONSE_CANCEL, - _("_OK"), GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_default_response(GTK_DIALOG(dirsel), GTK_RESPONSE_ACCEPT); - - pidgin_request_add_help(GTK_DIALOG(dirsel), cpar); + dirsel = gtk_file_chooser_native_new( + title ? title : _("Select Folder..."), NULL, + GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, _("_OK"), _("_Cancel")); if ((dirname != NULL) && (*dirname != '\0')) gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dirsel), dirname); @@ -2509,9 +2478,12 @@ G_CALLBACK(file_ok_check_if_exists_cb), data); data->dialog = dirsel; +#if 0 + /* FIXME: Not implemented for native dialogs. */ pidgin_auto_parent_window(dirsel); - - gtk_widget_show(dirsel); +#endif + + gtk_native_dialog_show(GTK_NATIVE_DIALOG(dirsel)); return (void *)data; } @@ -2551,9 +2523,14 @@ g_free(data->cbs); - pidgin_window_detach_children(GTK_WINDOW(data->dialog)); - - gtk_widget_destroy(data->dialog); + if (type == PURPLE_REQUEST_FILE || type == PURPLE_REQUEST_FOLDER) { + /* Will be a GtkNativeDialog, not GtkDialog. */ + g_object_unref(data->dialog); + } else { + pidgin_window_detach_children(GTK_WINDOW(data->dialog)); + + gtk_widget_destroy(data->dialog); + } if (type == PURPLE_REQUEST_FIELDS) purple_request_fields_destroy(data->u.multifield.fields); @@ -2571,6 +2548,13 @@ g_return_val_if_fail( purple_request_is_valid_ui_handle(data, NULL), NULL); + if (data->type == PURPLE_REQUEST_FILE || + data->type == PURPLE_REQUEST_FOLDER) { + /* Not a GtkWidget, but a GtkFileChooserNative. Eventually this function + * should not be needed, once we don't need to auto-parent. */ + return NULL; + } + return GTK_WINDOW(data->dialog); }