38 #include <glib/gi18n.h> 41 #ifdef HAVE_LIBAVAHI_UI 42 #include <avahi-ui/avahi-ui.h> 61 static const gchar *charset_list =
"ASCII,BIG5," 62 "CP437,CP720,CP737,CP775,CP850,CP852,CP855," 63 "CP857,CP858,CP862,CP866,CP874,CP1125,CP1250," 64 "CP1251,CP1252,CP1253,CP1254,CP1255,CP1256," 67 "ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4," 68 "ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8," 69 "ISO-8859-9,ISO-8859-10,ISO-8859-11,ISO-8859-12," 70 "ISO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16," 74 static const gchar *server_tips =
N_(
"<tt><big>" 81 static const gchar *cmd_tips =
N_(
"<tt><big>" 82 "• command in PATH args %h\n" 83 "• /path/to/foo -options %h %u\n" 84 "• %h is substituted with the server name\n" 85 "• %t is substituted with the SSH server name\n" 86 "• %u is substituted with the username\n" 87 "• %U is substituted with the SSH username\n" 88 "• %p is substituted with Remmina profile name\n" 89 "• %g is substituted with Remmina profile group name\n" 90 "• %d is substituted with local datetime in iso8601 format\n" 91 "Do not run in background if you want the command to be executed before connecting.\n" 95 static const gchar *server_tips2 =
N_(
"<tt><big>" 101 "• username@server:port (SSH protocol only)" 105 struct _RemminaFileEditorPriv {
108 const gchar * avahi_service_type;
110 GtkWidget * name_entry;
111 GtkWidget * group_combo;
112 GtkWidget * protocol_combo;
113 GtkWidget * precommand_entry;
114 GtkWidget * postcommand_entry;
115 GtkWidget * save_button;
117 GtkWidget * config_box;
118 GtkWidget * config_scrollable;
119 GtkWidget * config_viewport;
120 GtkWidget * config_container;
122 GtkWidget * server_combo;
123 GtkWidget * resolution_iws_radio;
124 GtkWidget * resolution_auto_radio;
125 GtkWidget * resolution_custom_radio;
126 GtkWidget * resolution_custom_combo;
127 GtkWidget * keymap_combo;
129 GtkWidget * ssh_tunnel_enabled_check;
130 GtkWidget * ssh_tunnel_loopback_check;
131 GtkWidget * ssh_tunnel_server_default_radio;
132 GtkWidget * ssh_tunnel_server_custom_radio;
133 GtkWidget * ssh_tunnel_server_entry;
134 GtkWidget * ssh_tunnel_auth_agent_radio;
135 GtkWidget * ssh_tunnel_auth_password_radio;
136 GtkWidget * ssh_tunnel_auth_password;
137 GtkWidget * ssh_tunnel_passphrase;
138 GtkWidget * ssh_tunnel_auth_publickey_radio;
139 GtkWidget * ssh_tunnel_auth_auto_publickey_radio;
140 GtkWidget * ssh_tunnel_username_entry;
141 GtkWidget * ssh_tunnel_privatekey_chooser;
143 GHashTable * setting_widgets;
148 TRACE_CALL(__func__);
151 #ifdef HAVE_LIBAVAHI_UI 155 TRACE_CALL(__func__);
159 dialog = aui_service_dialog_new(_(
"Choose a Remote Desktop Server"),
161 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
162 _(
"_OK"), GTK_RESPONSE_ACCEPT,
165 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
166 aui_service_dialog_set_resolve_service(AUI_SERVICE_DIALOG(dialog), TRUE);
167 aui_service_dialog_set_resolve_host_name(AUI_SERVICE_DIALOG(dialog), TRUE);
168 aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(dialog),
169 gfe->
priv->avahi_service_type, NULL);
171 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
172 host = g_strdup_printf(
"[%s]:%i",
173 aui_service_dialog_get_host_name(AUI_SERVICE_DIALOG(dialog)),
174 aui_service_dialog_get_port(AUI_SERVICE_DIALOG(dialog)));
178 gtk_widget_destroy(dialog);
181 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gfe->
priv->server_combo))), host);
189 TRACE_CALL(__func__);
191 GtkWidget *defaultwidget;
193 gfe = REMMINA_FILE_EDITOR(widget);
195 defaultwidget = gfe->
priv->server_combo;
198 if (GTK_IS_EDITABLE(defaultwidget))
199 gtk_editable_select_region(GTK_EDITABLE(defaultwidget), 0, -1);
200 gtk_widget_grab_focus(defaultwidget);
206 TRACE_CALL(__func__);
208 g_hash_table_destroy(REMMINA_FILE_EDITOR(widget)->priv->setting_widgets);
209 g_free(REMMINA_FILE_EDITOR(widget)->priv);
214 TRACE_CALL(__func__);
215 gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)));
220 TRACE_CALL(__func__);
222 gfe->
priv->config_container = gtk_notebook_new();
223 gfe->
priv->config_viewport = gtk_viewport_new(NULL, NULL);
224 gfe->
priv->config_scrollable = gtk_scrolled_window_new(NULL, NULL);
225 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_scrollable), 2);
226 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gfe->
priv->config_scrollable),
227 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
228 gtk_widget_show(gfe->
priv->config_scrollable);
230 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_viewport), gfe->
priv->config_container);
231 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_viewport), 2);
232 gtk_widget_show(gfe->
priv->config_viewport);
233 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_scrollable), gfe->
priv->config_viewport);
234 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_container), 2);
235 gtk_widget_show(gfe->
priv->config_container);
237 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_box), gfe->
priv->config_scrollable);
241 const gchar *stock_id,
const gchar *label, gint rows, gint cols)
243 TRACE_CALL(__func__);
249 tablabel = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
250 gtk_widget_show(tablabel);
252 widget = gtk_image_new_from_icon_name(stock_id, GTK_ICON_SIZE_BUTTON);
253 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
254 gtk_widget_show(widget);
256 widget = gtk_label_new(label);
257 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
258 gtk_widget_show(widget);
260 tabbody = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
261 gtk_widget_show(tabbody);
262 gtk_notebook_append_page(GTK_NOTEBOOK(gfe->
priv->config_container), tabbody, tablabel);
264 grid = gtk_grid_new();
265 gtk_widget_show(grid);
266 gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
267 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
268 gtk_container_set_border_width(GTK_CONTAINER(grid), 15);
269 gtk_box_pack_start(GTK_BOX(tabbody), grid, FALSE, FALSE, 0);
278 TRACE_CALL(__func__);
279 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_entry),
280 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check)) &&
281 (gfe->
priv->ssh_tunnel_server_custom_radio == NULL ||
282 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_server_custom_radio)))
288 TRACE_CALL(__func__);
292 b = ((!gfe->
priv->ssh_tunnel_enabled_check ||
293 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check))) &&
294 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_auth_publickey_radio)));
295 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_privatekey_chooser), b);
298 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_privatekey_chooser), s);
304 TRACE_CALL(__func__);
306 gboolean enabled = TRUE;
310 if (gfe->
priv->ssh_tunnel_enabled_check) {
311 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check));
312 if (gfe->
priv->ssh_tunnel_loopback_check)
313 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_loopback_check), enabled);
314 if (gfe->
priv->ssh_tunnel_server_default_radio)
315 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_default_radio), enabled);
316 if (gfe->
priv->ssh_tunnel_server_custom_radio)
317 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_custom_radio), enabled);
321 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_username_entry), enabled);
322 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_agent_radio), enabled);
323 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_password_radio), enabled);
324 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_password), enabled);
325 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_publickey_radio), enabled);
326 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_auto_publickey_radio), enabled);
332 if (gfe->
priv->ssh_tunnel_username_entry)
333 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry)) [0] ==
'\0') {
335 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry), cp ? cp :
"");
338 if (gfe->
priv->ssh_tunnel_auth_password) {
339 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password)) [0] ==
'\0') {
341 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password), cp ? cp :
"");
344 if (gfe->
priv->ssh_tunnel_passphrase) {
345 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase)) [0] ==
'\0') {
347 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase), cp ? cp :
"");
354 TRACE_CALL(__func__);
358 const gchar *ssh_privatekey;
361 widget = gtk_radio_button_new_with_label_from_widget(
362 GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_agent_radio), _(
"SSH identity file"));
363 g_signal_connect(G_OBJECT(widget),
"toggled",
365 priv->ssh_tunnel_auth_publickey_radio = widget;
366 gtk_widget_show(widget);
367 gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 22, 1, 1);
369 dialog = gtk_file_chooser_dialog_new(_(
"SSH identity file"), GTK_WINDOW(gfe), GTK_FILE_CHOOSER_ACTION_OPEN,
370 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
371 _(
"_Open"), GTK_RESPONSE_ACCEPT,
374 widget = gtk_file_chooser_button_new_with_dialog(dialog);
376 s = g_strdup_printf(
"%s/.ssh", g_getenv(
"SNAP_USER_COMMON"));
378 s = g_strdup_printf(
"%s/.ssh", g_get_home_dir());
380 if (g_file_test(s, G_FILE_TEST_IS_DIR))
381 gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widget), s);
383 gtk_widget_show(widget);
384 gtk_grid_attach(GTK_GRID(grid), widget, column + 1, row + 22, 1, 1);
385 priv->ssh_tunnel_privatekey_chooser = widget;
388 if (ssh_privatekey &&
389 g_file_test(ssh_privatekey, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS))
390 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser),
400 TRACE_CALL(__func__);
403 #ifdef HAVE_LIBAVAHI_UI 408 widget = gtk_label_new(_(
"Server"));
409 gtk_widget_show(widget);
410 gtk_widget_set_valign(widget, GTK_ALIGN_START);
411 gtk_widget_set_halign(widget, GTK_ALIGN_START);
412 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, row + 1);
416 gtk_widget_set_hexpand(widget, TRUE);
417 gtk_widget_show(widget);
418 gtk_widget_set_tooltip_markup(widget, _(server_tips));
419 gtk_entry_set_activates_default(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget))), TRUE);
420 gfe->
priv->server_combo = widget;
423 #ifdef HAVE_LIBAVAHI_UI 425 gfe->
priv->avahi_service_type = (
const gchar *)setting->
opt1;
427 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
428 gtk_widget_show(hbox);
429 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
431 widget = gtk_button_new_with_label(
"…");
432 s = g_strdup_printf(_(
"Browse the network to find a %s server"), plugin->
name);
433 gtk_widget_set_tooltip_text(widget, s);
435 gtk_widget_show(widget);
436 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
439 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
443 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
448 gint row, gint col,
const gchar *label,
const gchar *value)
450 TRACE_CALL(__func__);
453 widget = gtk_label_new(label);
454 gtk_widget_show(widget);
455 #if GTK_CHECK_VERSION(3, 12, 0) 456 gtk_widget_set_margin_end(widget, 40);
458 gtk_widget_set_margin_right(widget, 40);
460 gtk_widget_set_valign(widget, GTK_ALIGN_START);
461 gtk_widget_set_halign(widget, GTK_ALIGN_START);
462 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
464 widget = gtk_entry_new();
465 gtk_widget_show(widget);
466 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
467 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
468 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
469 gtk_widget_set_hexpand(widget, TRUE);
470 gtk_entry_set_activates_default(GTK_ENTRY(widget), TRUE);
473 gtk_entry_set_text(GTK_ENTRY(widget), value);
479 TRACE_CALL(__func__);
481 res_str = g_strdup_printf(
"%dx%d",
492 TRACE_CALL(__func__);
498 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
499 gtk_dialog_run(dialog);
503 gtk_widget_destroy(GTK_WIDGET(dialog));
507 GtkWidget *grid, gint row)
509 TRACE_CALL(__func__);
512 int resolution_w, resolution_h;
523 if (resolution_w <= 0 || resolution_h <= 0)
529 res_str = g_strdup_printf(
"%dx%d", resolution_w, resolution_h);
533 widget = gtk_label_new(_(
"Resolution"));
534 gtk_widget_show(widget);
535 gtk_widget_set_valign(widget, GTK_ALIGN_START);
536 gtk_widget_set_halign(widget, GTK_ALIGN_START);
537 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
539 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
540 widget = gtk_radio_button_new_with_label(NULL, _(
"Use initial window size"));
541 gtk_widget_show(widget);
542 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
543 gfe->
priv->resolution_iws_radio = widget;
544 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Use client resolution"));
545 gtk_widget_show(widget);
546 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
547 gfe->
priv->resolution_auto_radio = widget;
548 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
549 gtk_widget_show(hbox);
551 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
552 gtk_widget_show(hbox);
553 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row + 1, 1, 1);
555 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Custom"));
556 gtk_widget_show(widget);
557 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
558 gfe->
priv->resolution_custom_radio = widget;
561 gtk_widget_show(widget);
562 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
563 gfe->
priv->resolution_custom_combo = widget;
565 widget = gtk_button_new_with_label(
"…");
566 gtk_widget_show(widget);
567 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
570 g_signal_connect(G_OBJECT(gfe->
priv->resolution_custom_radio),
"toggled",
574 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio), TRUE);
576 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_auto_radio), TRUE);
578 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_iws_radio), TRUE);
580 gtk_widget_set_sensitive(gfe->
priv->resolution_custom_combo, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio)));
586 gint row, gint col,
const gchar *label,
const gchar *value)
588 TRACE_CALL(__func__);
591 widget = gtk_label_new(label);
592 gtk_widget_show(widget);
593 #if GTK_CHECK_VERSION(3, 12, 0) 594 gtk_widget_set_margin_end(widget, 40);
596 gtk_widget_set_margin_right(widget, 40);
598 gtk_widget_set_valign(widget, GTK_ALIGN_START);
599 gtk_widget_set_halign(widget, GTK_ALIGN_START);
600 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
602 widget = gtk_entry_new();
603 gtk_widget_show(widget);
604 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
605 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
606 gtk_widget_set_hexpand(widget, TRUE);
609 gtk_entry_set_text(GTK_ENTRY(widget), value);
615 gint row, gint col,
const gchar *label,
const gpointer *list,
const gchar *value)
617 TRACE_CALL(__func__);
620 widget = gtk_label_new(label);
621 gtk_widget_show(widget);
622 gtk_widget_set_valign(widget, GTK_ALIGN_START);
623 gtk_widget_set_halign(widget, GTK_ALIGN_START);
624 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
627 gtk_widget_show(widget);
628 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
634 gint row, gint col,
const gchar *label,
const gchar *list,
const gchar *value)
636 TRACE_CALL(__func__);
639 widget = gtk_label_new(label);
640 gtk_widget_show(widget);
641 gtk_widget_set_valign(widget, GTK_ALIGN_START);
642 gtk_widget_set_halign(widget, GTK_ALIGN_START);
643 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
646 gtk_widget_show(widget);
647 gtk_widget_set_hexpand(widget, TRUE);
648 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
654 gint row, gint top,
const gchar *label, gboolean value)
656 TRACE_CALL(__func__);
658 widget = gtk_check_button_new_with_label(label);
659 gtk_widget_show(widget);
660 gtk_grid_set_row_spacing(GTK_GRID(grid), 1);
661 gtk_grid_attach(GTK_GRID(grid), widget, top, row, 1, 1);
664 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
671 const gchar *value, gint type)
673 TRACE_CALL(__func__);
678 widget = gtk_label_new(label);
679 gtk_widget_show(widget);
680 gtk_widget_set_valign(widget, GTK_ALIGN_START);
681 gtk_widget_set_halign(widget, GTK_ALIGN_START);
682 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
684 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
685 gtk_widget_show(hbox);
686 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
688 check = gtk_check_button_new();
689 gtk_widget_show(check);
690 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (value && value[0] ==
'/'));
691 gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
693 widget = gtk_file_chooser_button_new(label, type);
694 gtk_widget_show(widget);
696 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), value);
697 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
708 TRACE_CALL(__func__);
712 gint grid_column = 0;
719 switch (settings->
type) {
726 g_dgettext(priv->plugin->domain, settings->
label),
728 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
741 _(
"Keyboard mapping"), (
const gpointer *)strarr,
749 g_dgettext(priv->plugin->domain, settings->
label),
751 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
753 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
759 g_dgettext(priv->plugin->domain, settings->
label),
760 (
const gpointer *)settings->
opt1,
762 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
764 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
769 g_dgettext(priv->plugin->domain, settings->
label),
770 (
const gchar *)settings->
opt1,
772 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
774 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
779 g_dgettext(priv->plugin->domain, settings->
label),
781 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
783 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
788 g_dgettext(priv->plugin->domain, settings->
label),
790 GTK_FILE_CHOOSER_ACTION_OPEN);
791 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
793 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
798 g_dgettext(priv->plugin->domain, settings->
label),
800 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
801 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
803 gtk_widget_set_tooltip_text(widget, (
const gchar *)settings->
opt2);
815 if (!settings->
compact || grid_column > 1) {
825 TRACE_CALL(__func__);
839 _(
"SSH Tunnel"), 9, 3);
840 widget = gtk_toggle_button_new_with_label(_(
"Enable SSH tunnel"));
841 gtk_widget_set_halign(widget, GTK_ALIGN_START);
842 gtk_grid_attach(GTK_GRID(grid), widget, 0, 0, 1, 1);
843 g_signal_connect(G_OBJECT(widget),
"toggled",
845 priv->ssh_tunnel_enabled_check = widget;
847 widget = gtk_check_button_new_with_label(_(
"Tunnel via loopback address"));
848 gtk_grid_attach(GTK_GRID(grid), widget, 1, 0, 2, 1);
849 priv->ssh_tunnel_loopback_check = widget;
854 switch (ssh_setting) {
856 s = g_strdup_printf(_(
"Same server at port %i"), DEFAULT_SSH_PORT);
857 widget = gtk_radio_button_new_with_label(NULL, s);
859 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 3, 1);
860 priv->ssh_tunnel_server_default_radio = widget;
863 widget = gtk_radio_button_new_with_label_from_widget(
864 GTK_RADIO_BUTTON(priv->ssh_tunnel_server_default_radio), _(
"Custom"));
865 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
866 g_signal_connect(G_OBJECT(widget),
"toggled",
868 priv->ssh_tunnel_server_custom_radio = widget;
870 widget = gtk_entry_new();
871 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
872 gtk_widget_set_tooltip_markup(widget, _(server_tips2));
873 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
874 priv->ssh_tunnel_server_entry = widget;
879 priv->ssh_tunnel_server_default_radio = NULL;
880 priv->ssh_tunnel_server_custom_radio = NULL;
884 gtk_widget_set_tooltip_markup(priv->ssh_tunnel_server_entry, _(server_tips));
889 priv->ssh_tunnel_server_default_radio = NULL;
890 priv->ssh_tunnel_server_custom_radio = NULL;
891 priv->ssh_tunnel_server_entry = NULL;
902 _(
"Startup path"), NULL);
904 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
905 g_hash_table_insert(priv->setting_widgets,
"execpath", widget);
916 priv->ssh_tunnel_username_entry =
918 _(
"Username"), NULL);
921 widget = gtk_radio_button_new_with_label(NULL, _(
"SSH agent (automatic)"));
922 gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 19, 1, 1);
923 priv->ssh_tunnel_auth_agent_radio = widget;
926 widget = gtk_radio_button_new_with_label_from_widget(
927 GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_agent_radio), _(
"Password"));
928 gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 21, 1, 1);
929 priv->ssh_tunnel_auth_password_radio = widget;
931 widget = gtk_entry_new();
932 gtk_grid_attach(GTK_GRID(grid), widget, 1, row + 21, 2, 1);
933 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
934 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
935 gtk_widget_set_hexpand(widget, TRUE);
936 priv->ssh_tunnel_auth_password = widget;
939 widget = gtk_radio_button_new_with_label_from_widget(
940 GTK_RADIO_BUTTON(priv->ssh_tunnel_auth_agent_radio), _(
"Public key (automatic)"));
941 gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 22, 1, 1);
942 priv->ssh_tunnel_auth_auto_publickey_radio = widget;
949 widget = gtk_label_new(_(
"Password to unlock private key"));
950 gtk_grid_attach(GTK_GRID(grid), widget, 0, row + 23, 1, 1);
951 widget = gtk_entry_new();
952 gtk_grid_attach(GTK_GRID(grid), widget, 1, row + 23, 2, 1);
953 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
954 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
955 gtk_widget_set_hexpand(widget, TRUE);
956 priv->ssh_tunnel_passphrase = widget;
962 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
964 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
967 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cs ?
968 priv->ssh_tunnel_server_custom_radio : priv->ssh_tunnel_server_default_radio), TRUE);
969 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
972 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
974 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
976 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
982 g_debug (
"[Editor - tunnel] ssh_tunnel_auth_status is: %d", ssh_tunnel_auth_status);
983 switch (ssh_tunnel_auth_status) {
985 g_debug(
"[Editor - tunnel] Auth set from file to SSH_AUTH_PUBLICKEY");
986 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_publickey_radio), TRUE);
989 g_debug(
"[Editor - tunnel] Auth set from file to SSH_AUTH_AUTO_PUBLICKEY");
990 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_auto_publickey_radio), TRUE);
993 g_debug(
"[Editor - tunnel] Auth set from file to SSH_AUTH_AGENT");
994 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_agent_radio), TRUE);
997 g_debug(
"[Editor - tunnel] Auth set from file to SSH_AUTH_PASSWORD");
998 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_password_radio), TRUE);
1004 gtk_widget_show_all(grid);
1011 TRACE_CALL(__func__);
1024 if (priv->plugin->basic_settings) {
1030 if (priv->plugin->advanced_settings) {
1045 TRACE_CALL(__func__);
1049 if (priv->config_container) {
1050 gtk_widget_destroy(priv->config_container);
1051 priv->config_container = NULL;
1052 gtk_widget_destroy(priv->config_viewport);
1053 priv->config_viewport = NULL;
1054 gtk_widget_destroy(priv->config_scrollable);
1055 priv->config_scrollable = NULL;
1058 priv->server_combo = NULL;
1059 priv->resolution_iws_radio = NULL;
1060 priv->resolution_auto_radio = NULL;
1061 priv->resolution_custom_radio = NULL;
1062 priv->resolution_custom_combo = NULL;
1063 priv->keymap_combo = NULL;
1065 priv->ssh_tunnel_enabled_check = NULL;
1066 priv->ssh_tunnel_loopback_check = NULL;
1067 priv->ssh_tunnel_server_default_radio = NULL;
1068 priv->ssh_tunnel_server_custom_radio = NULL;
1069 priv->ssh_tunnel_server_entry = NULL;
1070 priv->ssh_tunnel_username_entry = NULL;
1071 priv->ssh_tunnel_auth_agent_radio = NULL;
1072 priv->ssh_tunnel_auth_password_radio = NULL;
1073 priv->ssh_tunnel_auth_publickey_radio = NULL;
1074 priv->ssh_tunnel_auth_auto_publickey_radio = NULL;
1075 priv->ssh_tunnel_privatekey_chooser = NULL;
1077 g_hash_table_remove_all(priv->setting_widgets);
1090 TRACE_CALL(__func__);
1092 gboolean ssh_tunnel_enabled;
1093 int ssh_tunnel_auth;
1095 ssh_tunnel_enabled = (priv->ssh_tunnel_enabled_check ?
1096 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check)) : FALSE);
1098 "ssh_tunnel_loopback",
1099 (priv->ssh_tunnel_loopback_check ?
1100 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) :
1104 (ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL));
1107 "ssh_tunnel_server",
1108 (ssh_tunnel_enabled && priv->ssh_tunnel_server_entry
1109 && (priv->ssh_tunnel_server_custom_radio == NULL
1110 || gtk_toggle_button_get_active(
1111 GTK_TOGGLE_BUTTON(priv->ssh_tunnel_server_custom_radio))) ?
1112 gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_server_entry)) : NULL));
1114 ssh_tunnel_auth = (priv->ssh_tunnel_auth_publickey_radio
1115 && gtk_toggle_button_get_active(
1116 GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_publickey_radio)) ?
1118 priv->ssh_tunnel_auth_auto_publickey_radio
1119 && gtk_toggle_button_get_active(
1120 GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_auto_publickey_radio)) ?
1122 priv->ssh_tunnel_auth_agent_radio
1123 && gtk_toggle_button_get_active(
1124 GTK_TOGGLE_BUTTON(priv->ssh_tunnel_auth_agent_radio)) ?
1134 "ssh_tunnel_privatekey",
1135 (priv->ssh_tunnel_privatekey_chooser ?
1136 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser)) : NULL));
1140 "ssh_tunnel_password",
1141 (ssh_tunnel_enabled && (ssh_tunnel_auth ==
SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_auth_password)) : NULL);
1145 "ssh_tunnel_passphrase",
1147 gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_passphrase)) : NULL);
1152 TRACE_CALL(__func__);
1154 GHashTableIter iter;
1155 gpointer key, value;
1157 g_hash_table_iter_init(&iter, priv->setting_widgets);
1158 while (g_hash_table_iter_next(&iter, &key, &value)) {
1159 if (GTK_IS_ENTRY(value)) {
1161 }
else if (GTK_IS_COMBO_BOX(value)) {
1164 }
else if (GTK_IS_FILE_CHOOSER(value)) {
1168 gtk_widget_get_sensitive(GTK_WIDGET(value)) ?
1169 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(value)) :
1171 }
else if (GTK_IS_TOGGLE_BUTTON(value)) {
1173 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(value)));
1180 TRACE_CALL(__func__);
1182 gchar *custom_resolution;
1195 remmina_file_set_string(priv->remmina_file,
"precommand", gtk_entry_get_text(GTK_ENTRY(priv->precommand_entry)));
1196 remmina_file_set_string(priv->remmina_file,
"postcommand", gtk_entry_get_text(GTK_ENTRY(priv->postcommand_entry)));
1201 if (priv->resolution_auto_radio) {
1202 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_auto_radio))) {
1206 }
else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_iws_radio))) {
1217 g_free(custom_resolution);
1224 if (priv->keymap_combo)
1234 TRACE_CALL(__func__);
1258 dialog = gtk_message_dialog_new(GTK_WINDOW(gfe), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK,
1259 _(
"Default settings saved."));
1260 gtk_dialog_run(GTK_DIALOG(dialog));
1261 gtk_widget_destroy(dialog);
1266 TRACE_CALL(__func__);
1274 gtk_widget_destroy(GTK_WIDGET(gfe));
1279 TRACE_CALL(__func__);
1288 gtk_widget_destroy(GTK_WIDGET(gfe));
1289 gf->prevent_saving = TRUE;
1295 TRACE_CALL(__func__);
1309 gtk_widget_destroy(GTK_WIDGET(gfe));
1315 TRACE_CALL(__func__);
1316 gtk_widget_destroy(GTK_WIDGET(gfe));
1321 TRACE_CALL(__func__);
1329 gtk_window_set_title(GTK_WINDOW(gfe), _(
"Remote Desktop Preference"));
1331 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Cancel")), GTK_RESPONSE_CANCEL);
1335 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Save as Default")), GTK_RESPONSE_OK);
1336 gtk_widget_set_tooltip_text(GTK_WIDGET(widget), _(
"Use the current settings as the default for all new connection profiles"));
1339 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save")), GTK_RESPONSE_APPLY);
1341 gtk_widget_set_sensitive(widget, FALSE);
1342 priv->save_button = widget;
1344 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Connect")), GTK_RESPONSE_ACCEPT);
1347 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save and Connect")), GTK_RESPONSE_OK);
1348 gtk_widget_set_can_default(widget, TRUE);
1351 gtk_dialog_set_default_response(GTK_DIALOG(gfe), GTK_RESPONSE_OK);
1352 gtk_window_set_default_size(GTK_WINDOW(gfe), 800, 600);
1357 priv->setting_widgets = g_hash_table_new(g_str_hash, g_str_equal);
1364 TRACE_CALL(__func__);
1366 GtkListStore *store;
1370 store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gfe->
priv->protocol_combo)));
1372 first = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
1374 gtk_list_store_append(store, &iter);
1375 gtk_list_store_set(store, &iter, 0, protocol, 1, g_dgettext(plugin->
domain, plugin->
description), 2,
1379 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gfe->
priv->protocol_combo), &iter);
1386 TRACE_CALL(__func__);
1390 gtk_widget_set_sensitive(priv->group_combo, TRUE);
1391 gtk_widget_set_sensitive(priv->save_button, TRUE);
1396 TRACE_CALL(__func__);
1413 TRACE_CALL(__func__);
1428 TRACE_CALL(__func__);
1437 gfe = REMMINA_FILE_EDITOR(g_object_new(REMMINA_TYPE_FILE_EDITOR, NULL));
1439 priv->remmina_file = remminafile;
1442 gtk_dialog_set_response_sensitive(GTK_DIALOG(gfe), GTK_RESPONSE_APPLY, FALSE);
1445 grid = gtk_grid_new();
1446 gtk_widget_show(grid);
1447 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
1448 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
1449 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
1450 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
1451 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), grid, FALSE, FALSE, 2);
1456 widget = gtk_label_new(_(
"Name"));
1457 gtk_widget_show(widget);
1458 gtk_widget_set_valign(widget, GTK_ALIGN_START);
1459 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1460 gtk_grid_attach(GTK_GRID(grid), widget, 0, 3, 2, 1);
1461 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
1463 widget = gtk_entry_new();
1464 gtk_widget_show(widget);
1465 gtk_grid_attach(GTK_GRID(grid), widget, 1, 3, 3, 1);
1466 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
1467 priv->name_entry = widget;
1470 gtk_entry_set_text(GTK_ENTRY(widget), _(
"Quick Connect"));
1471 #if GTK_CHECK_VERSION(3, 16, 0) 1472 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
1477 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1481 widget = gtk_label_new(_(
"Group"));
1482 gtk_widget_show(widget);
1483 gtk_widget_set_valign(widget, GTK_ALIGN_START);
1484 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1485 gtk_grid_attach(GTK_GRID(grid), widget, 0, 6, 2, 1);
1490 gtk_widget_show(priv->group_combo);
1491 gtk_grid_attach(GTK_GRID(grid), priv->group_combo, 1, 6, 3, 1);
1492 gtk_widget_set_sensitive(priv->group_combo, FALSE);
1494 s = g_strdup_printf(_(
"Use '%s' as subgroup delimiter"),
"/");
1495 gtk_widget_set_tooltip_text(priv->group_combo, s);
1499 widget = gtk_label_new(_(
"Protocol"));
1500 gtk_widget_show(widget);
1501 gtk_widget_set_valign(widget, GTK_ALIGN_START);
1502 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1503 gtk_grid_attach(GTK_GRID(grid), widget, 0, 9, 2, 1);
1506 gtk_widget_show(widget);
1507 gtk_grid_attach(GTK_GRID(grid), widget, 1, 9, 3, 1);
1508 priv->protocol_combo = widget;
1513 widget = gtk_label_new(_(
"Pre-command"));
1514 gtk_widget_show(widget);
1515 gtk_widget_set_valign(widget, GTK_ALIGN_START);
1516 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1517 gtk_grid_attach(GTK_GRID(grid), widget, 0, 12, 3, 1);
1518 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
1520 widget = gtk_entry_new();
1521 gtk_widget_show(widget);
1522 gtk_grid_attach(GTK_GRID(grid), widget, 1, 12, 3, 1);
1523 gtk_entry_set_max_length(GTK_ENTRY(widget), 200);
1524 priv->precommand_entry = widget;
1526 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1527 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"command %h %u %t %U %p %g --option"));
1528 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1531 widget = gtk_label_new(_(
"Post-command"));
1532 gtk_widget_show(widget);
1533 gtk_widget_set_valign(widget, GTK_ALIGN_START);
1534 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1535 gtk_grid_attach(GTK_GRID(grid), widget, 0, 15, 3, 1);
1536 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
1538 widget = gtk_entry_new();
1539 gtk_widget_show(widget);
1540 gtk_grid_attach(GTK_GRID(grid), widget, 1, 15, 3, 1);
1541 gtk_entry_set_max_length(GTK_ENTRY(widget), 200);
1542 priv->postcommand_entry = widget;
1544 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1545 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"/path/to/command -opt1 arg %h %u %t -opt2 %U %p %g"));
1546 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1549 widget = gtk_event_box_new();
1550 gtk_widget_show(widget);
1551 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), widget, TRUE, TRUE, 2);
1552 priv->config_box = widget;
1554 priv->config_container = NULL;
1555 priv->config_scrollable = NULL;
1561 return GTK_WIDGET(gfe);
1566 TRACE_CALL(__func__);
1572 TRACE_CALL(__func__);
1586 TRACE_CALL(__func__);
1595 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1596 _(
"Could not find the file \"%s\"."), filename);
1597 gtk_dialog_run(GTK_DIALOG(dialog));
1598 gtk_widget_destroy(dialog);
1605 TRACE_CALL(__func__);
1613 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
1614 _(
"Could not find the file \"%s\"."), filename);
1615 gtk_dialog_run(GTK_DIALOG(dialog));
1616 gtk_widget_destroy(dialog);
void remmina_public_create_group(GtkGrid *grid, const gchar *group, gint row, gint rows, gint cols)
const gchar * remmina_plugin_manager_get_canonical_setting_name(const RemminaProtocolSetting *setting)
GtkDialog * remmina_string_list_new(gboolean two_columns, const gchar *fields_separator)
void remmina_file_free(RemminaFile *remminafile)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
gchar ** remmina_pref_keymap_groups(void)
static void remmina_file_editor_create_resolution(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
RemminaFile * remmina_file_dup(RemminaFile *remminafile)
GtkWidget * remmina_public_create_combo_entry(const gchar *text, const gchar *def, gboolean descending)
static void remmina_file_editor_on_connect(GtkWidget *button, RemminaFileEditor *gfe)
gchar * remmina_pref_file
void remmina_string_list_set_validation_func(RemminaStringListValidationFunc func)
G_DEFINE_TYPE(RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG)
static void remmina_file_editor_ssh_tunnel_enabled_check_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
const gchar * remmina_file_get_filename(RemminaFile *remminafile)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox *combo, RemminaFileEditor *gfe)
void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data)
static GtkWidget * remmina_file_editor_create_check(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint top, const gchar *label, gboolean value)
static void remmina_file_editor_destroy(GtkWidget *widget, gpointer data)
gchar * remmina_public_combo_get_active_text(GtkComboBox *combo)
gboolean remmina_public_resolution_validation_func(const gchar *new_str, gchar **error)
gchar * remmina_pref_get_recent(const gchar *protocol)
static void remmina_file_editor_create_server(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
void remmina_icon_populate_menu(void)
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
static void remmina_file_editor_init(RemminaFileEditor *gfe)
static GtkWidget * remmina_file_editor_create_chooser(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gint type)
void remmina_file_generate_filename(RemminaFile *remminafile)
const gchar * description
static void remmina_file_editor_create_ssh_privatekey(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint column)
int remmina_public_split_resolution_string(const char *resolution_string, int *w, int *h)
RemminaProtocolWidgetResolutionMode
GtkWidget * remmina_public_create_combo_map(const gpointer *key_value_list, const gchar *def, gboolean use_icon, const gchar *domain)
static void remmina_file_editor_update(RemminaFileEditor *gfe)
void remmina_file_set_filename(RemminaFile *remminafile, const gchar *filename)
void remmina_file_editor_check_profile(RemminaFileEditor *gfe)
GtkWidget * remmina_public_create_combo_text_d(const gchar *text, const gchar *def, const gchar *empty_choice)
struct _RemminaFileEditorPriv RemminaFileEditorPriv
static GtkWidget * remmina_file_editor_create_notebook_tab(RemminaFileEditor *gfe, const gchar *stock_id, const gchar *label, gint rows, gint cols)
GtkWidget * remmina_public_create_combo(gboolean use_icon)
RemminaProtocolSSHSetting
void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value)
void remmina_file_delete(const gchar *filename)
static void remmina_file_editor_entry_on_changed(GtkEditable *editable, RemminaFileEditor *gfe)
static void remmina_file_editor_create_all_settings(RemminaFileEditor *gfe)
static void remmina_file_editor_create_notebook_container(RemminaFileEditor *gfe)
GtkWidget * remmina_file_editor_new_from_file(RemminaFile *remminafile)
void remmina_string_list_set_text(const gchar *text, const gboolean clear_data)
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
static void remmina_file_editor_create_ssh_tunnel_tab(RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
RemminaProtocolSettingType type
RemminaFile * remmina_file_new(void)
void remmina_string_list_set_titles(gchar *title1, gchar *title2)
static void remmina_file_editor_create_settings(RemminaFileEditor *gfe, GtkWidget *grid, const RemminaProtocolSetting *settings)
static void remmina_file_editor_on_save_connect(GtkWidget *button, RemminaFileEditor *gfe)
void rcw_open_from_file(RemminaFile *remminafile)
void remmina_file_editor_file_save(RemminaFileEditor *gfe)
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
GtkWidget * remmina_file_editor_new(void)
static void remmina_file_editor_on_realize(GtkWidget *widget, gpointer user_data)
static void remmina_file_editor_button_on_toggled(GtkToggleButton *togglebutton, GtkWidget *widget)
static GtkWidget * remmina_file_editor_create_select(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gpointer *list, const gchar *value)
static void remmina_file_editor_on_cancel(GtkWidget *button, RemminaFileEditor *gfe)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
static void remmina_file_editor_on_save(GtkWidget *button, RemminaFileEditor *gfe)
static void remmina_file_editor_on_default(GtkWidget *button, RemminaFileEditor *gfe)
static GtkWidget * remmina_file_editor_create_combo(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *list, const gchar *value)
gchar * remmina_file_manager_get_groups(void)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
static GtkWidget * remmina_file_editor_create_text(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value)
void remmina_file_save(RemminaFile *remminafile)
static void remmina_file_editor_browse_resolution(GtkWidget *button, RemminaFileEditor *gfe)
static void remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
RemminaFile * remmina_file_copy(const gchar *filename)
RemminaFile * remmina_file_manager_load_file(const gchar *filename)
static gboolean remmina_file_editor_iterate_protocol(gchar *protocol, RemminaPlugin *plugin, gpointer data)
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
RemminaFileEditorPriv * priv
static void remmina_file_editor_browse_avahi(GtkWidget *button, RemminaFileEditor *gfe)
static void remmina_file_editor_update_settings(RemminaFileEditor *gfe)
static void remmina_file_editor_ssh_tunnel_auth_publickey_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
static GtkWidget * remmina_file_editor_create_password(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value)
void remmina_public_load_combo_text_d(GtkWidget *combo, const gchar *text, const gchar *def, const gchar *empty_choice)
static void remmina_file_editor_update_resolution(GtkWidget *widget, RemminaFileEditor *gfe)
N_("Unable to connect to VNC server")
static void remmina_file_editor_class_init(RemminaFileEditorClass *klass)
static void remmina_file_editor_save_ssh_tunnel_tab(RemminaFileEditor *gfe)
void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting, gchar *value)
gchar * remmina_string_list_get_text(void)