diff options
author | Hiroyuki Tanaka <myheroyuki@outlook.com> | 2023-11-09 15:25:17 +0300 |
---|---|---|
committer | Hiroyuki Tanaka <myheroyuki@outlook.com> | 2023-11-09 15:25:17 +0300 |
commit | 55b9c65e724bc29419ab301d73f9b9f604ff96f1 (patch) | |
tree | 1d18ed16729e035e36e72b3d56f6a83d23c20a17 | |
parent | 5242d210fd98f2d9a3d65321e030f54c55e26af7 (diff) | |
parent | 6c06f87665ca100c23e867df60aeefa244272229 (diff) |
Merge branch 'file-chooser-native' into 'master'
GtkFileChooserNative support
Closes #3009
See merge request Remmina/Remmina!2553
-rw-r--r-- | plugins/rdp/rdp_file.c | 14 | ||||
-rw-r--r-- | src/remmina_ftp_client.c | 14 | ||||
-rw-r--r-- | src/remmina_main.c | 91 |
3 files changed, 83 insertions, 36 deletions
diff --git a/plugins/rdp/rdp_file.c b/plugins/rdp/rdp_file.c index cfd8c3057..fc161e850 100644 --- a/plugins/rdp/rdp_file.c +++ b/plugins/rdp/rdp_file.c @@ -283,25 +283,15 @@ gboolean remmina_rdp_file_export(RemminaFilePlugin *plugin, RemminaFile *remmina { TRACE_CALL(__func__); FILE *fp; - gchar *p; gboolean ret; - p = strrchr(to_file, '.'); - - if (p && (g_strcmp0(p + 1, "rdp") == 0 || g_strcmp0(p + 1, "RDP") == 0)) - p = g_strdup(to_file); - else - p = g_strdup_printf("%s.rdp", to_file); - - fp = g_fopen(p, "w+"); + fp = g_fopen(to_file, "w+"); if (fp == NULL) { - g_print("Failed to export %s\n", p); - g_free(p); + g_print("Failed to export %s\n", to_file); return FALSE; } - g_free(p); ret = remmina_rdp_file_export_channel(remminafile, fp); fclose(fp); diff --git a/src/remmina_ftp_client.c b/src/remmina_ftp_client.c index 3abd4a295..294f2db42 100644 --- a/src/remmina_ftp_client.c +++ b/src/remmina_ftp_client.c @@ -403,21 +403,21 @@ remmina_ftp_client_get_download_dir(RemminaFTPClient *client) { TRACE_CALL(__func__); RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*)client->priv; - GtkWidget *dialog; + GtkFileChooserNative *dialog; gchar *localdir = NULL; - dialog = gtk_file_chooser_dialog_new(_("Choose download location"), + dialog = gtk_file_chooser_native_new(_("Choose download location"), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, - "_Cancel", GTK_RESPONSE_CANCEL, "_OK", GTK_RESPONSE_ACCEPT, NULL); + _("_OK"), _("_Cancel")); if (priv->working_directory) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), priv->working_directory); } - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + if (gtk_native_dialog_run(GTK_NATIVE_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { g_free(priv->working_directory); priv->working_directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); localdir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); } - gtk_widget_destroy(dialog); + gtk_native_dialog_destroy(GTK_NATIVE_DIALOG(dialog)); return localdir; } @@ -604,8 +604,8 @@ static void remmina_ftp_client_action_upload(GObject *object, RemminaFTPClient * struct stat st; dialog = gtk_file_chooser_dialog_new(_("Choose a file to upload"), - GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_FILE_CHOOSER_ACTION_OPEN, "_Cancel", - GTK_RESPONSE_CANCEL, "_OK", GTK_RESPONSE_ACCEPT, NULL); + GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), + GTK_RESPONSE_CANCEL, _("Upload"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); if (priv->working_directory) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), priv->working_directory); diff --git a/src/remmina_main.c b/src/remmina_main.c index f3de6a5c0..b4dd37233 100644 --- a/src/remmina_main.c +++ b/src/remmina_main.c @@ -1219,7 +1219,7 @@ static void remmina_main_import_file_list(GSList *files) remmina_main_load_files(); } -static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint response_id, gpointer user_data) +static void remmina_main_action_tools_import_on_response(GtkNativeDialog *dialog, gint response_id, gpointer user_data) { TRACE_CALL(__func__); GSList *files; @@ -1228,19 +1228,56 @@ static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); remmina_main_import_file_list(files); } - gtk_widget_destroy(GTK_WIDGET(dialog)); + gtk_native_dialog_destroy(dialog); +} + +static void remmina_set_file_chooser_filters(GtkFileChooser *chooser) +{ + GtkFileFilter *filter; + + g_return_if_fail(GTK_IS_FILE_CHOOSER(chooser)); + + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, _("RDP Files")); + gtk_file_filter_add_pattern(filter, "*.rdp"); + gtk_file_filter_add_pattern(filter, "*.rdpx"); + gtk_file_filter_add_pattern(filter, "*.RDP"); + gtk_file_filter_add_pattern(filter, "*.RDPX"); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter); + gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(chooser), filter); + + filter = gtk_file_filter_new(); + gtk_file_filter_set_name(filter, _("All Files")); + gtk_file_filter_add_pattern(filter, "*"); + gtk_file_chooser_add_filter(chooser, filter); } void remmina_main_on_action_tools_import(GSimpleAction *action, GVariant *param, gpointer data) { TRACE_CALL(__func__); - GtkWidget *dialog; + GtkFileChooserNative *chooser; - dialog = gtk_file_chooser_dialog_new(_("Import"), remminamain->window, GTK_FILE_CHOOSER_ACTION_OPEN, "Import", - GTK_RESPONSE_ACCEPT, NULL); - gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); - g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_main_action_tools_import_on_response), NULL); - gtk_widget_show(dialog); + chooser = gtk_file_chooser_native_new(_("Import"), remminamain->window, + GTK_FILE_CHOOSER_ACTION_OPEN, _("Import"), _("_Cancel")); + gtk_native_dialog_set_modal(GTK_NATIVE_DIALOG(chooser), TRUE); + remmina_set_file_chooser_filters(GTK_FILE_CHOOSER(chooser)); + gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser), TRUE); + g_signal_connect(chooser, "response", G_CALLBACK(remmina_main_action_tools_import_on_response), NULL); + gtk_native_dialog_show(GTK_NATIVE_DIALOG(chooser)); +} + +static void on_export_save_response (GtkFileChooserNative *dialog, int response, RemminaFile *remminafile) +{ + if (response == GTK_RESPONSE_ACCEPT) { + RemminaFilePlugin *plugin = remmina_plugin_manager_get_export_file_handler(remminafile); + if (plugin){ + gchar *path = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + plugin->export_func(plugin, remminafile, path); + g_free(path); + } + } + remmina_file_free(remminafile); + gtk_native_dialog_destroy(GTK_NATIVE_DIALOG(dialog)); } void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, gpointer data) @@ -1249,27 +1286,47 @@ void remmina_main_on_action_tools_export(GSimpleAction *action, GVariant *param, RemminaFilePlugin *plugin; RemminaFile *remminafile; GtkWidget *dialog; + GtkFileChooserNative *chooser; + gchar *export_name; - if (!remminamain->priv->selected_filename) + if (!remminamain->priv->selected_filename) { + dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + _("Select the connection profile.")); + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); + gtk_widget_show(dialog); return; + } remminafile = remmina_file_load(remminamain->priv->selected_filename); - if (remminafile == NULL) + if (remminafile == NULL) { + dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, + _("Remmina couldn't export.")); + g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); + gtk_widget_show(dialog); return; + } + plugin = remmina_plugin_manager_get_export_file_handler(remminafile); if (plugin) { - dialog = gtk_file_chooser_dialog_new(plugin->export_hints, remminamain->window, - GTK_FILE_CHOOSER_ACTION_SAVE, _("_Save"), GTK_RESPONSE_ACCEPT, NULL); - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) - plugin->export_func(plugin, remminafile, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))); - gtk_widget_destroy(dialog); - } else { + chooser = gtk_file_chooser_native_new(plugin->export_hints, remminamain->window, + GTK_FILE_CHOOSER_ACTION_SAVE, _("_Save"), _("_Cancel")); + gtk_native_dialog_set_modal(GTK_NATIVE_DIALOG(chooser), TRUE); + remmina_set_file_chooser_filters(GTK_FILE_CHOOSER(chooser)); + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(chooser), TRUE); + export_name = g_strdup_printf("%s.rdp", remminamain->priv->selected_name); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(chooser), export_name); + g_free(export_name); + g_signal_connect(chooser, "response", G_CALLBACK(on_export_save_response), remminafile); + gtk_native_dialog_show(GTK_NATIVE_DIALOG(chooser)); + } else + { + remmina_file_free(remminafile); dialog = gtk_message_dialog_new(remminamain->window, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("This protocol does not support exporting.")); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); + return; } - remmina_file_free(remminafile); } void remmina_main_on_action_application_plugins(GSimpleAction *action, GVariant *param, gpointer data) |