39 #ifdef HAVE_LIBAVAHI_UI 40 #include <avahi-ui/avahi-ui.h> 60 static const gchar *server_tips =
N_(
"<big>" 64 "VNC additional formats\n" 65 "• ID:repeater ID number\n" 66 "• unix:///path/socket.sock" 69 static const gchar *cmd_tips =
N_(
"<big>" 70 "• command in PATH args %h\n" 71 "• /path/to/foo -options %h %u\n" 72 "• %h is substituted with the server name\n" 73 "• %t is substituted with the SSH server name\n" 74 "• %u is substituted with the username\n" 75 "• %U is substituted with the SSH username\n" 76 "• %p is substituted with Remmina profile name\n" 77 "• %g is substituted with Remmina profile group name\n" 78 "• %d is substituted with local date and time in ISO 8601 format\n" 79 "Do not run in background if you want the command to be executed before connecting.\n" 83 static const gchar *server_tips2 =
N_(
"<big>" 87 "• username@server[:port] (SSH protocol only)" 91 struct _RemminaFileEditorPriv {
94 const gchar * avahi_service_type;
96 GtkWidget * name_entry;
97 GtkWidget * labels_entry;
98 GtkWidget * group_combo;
99 GtkWidget * protocol_combo;
100 GtkWidget * save_button;
102 GtkWidget * config_box;
103 GtkWidget * config_scrollable;
104 GtkWidget * config_viewport;
105 GtkWidget * config_container;
107 GtkWidget * server_combo;
108 GtkWidget * resolution_iws_radio;
109 GtkWidget * resolution_auto_radio;
110 GtkWidget * resolution_custom_radio;
111 GtkWidget * resolution_custom_combo;
112 GtkWidget * keymap_combo;
114 GtkWidget * assistance_toggle;
115 GtkWidget * assistance_file;
116 GtkWidget * assistance_password;
117 GtkWidget * assistance_file_label;
118 GtkWidget * assistance_password_label;
120 GtkWidget * behavior_autostart_check;
121 GtkWidget * behavior_precommand_entry;
122 GtkWidget * behavior_postcommand_entry;
123 GtkWidget * behavior_lock_check;
124 GtkWidget * behavior_disconnect;
126 GtkWidget * ssh_tunnel_enabled_check;
127 GtkWidget * ssh_tunnel_loopback_check;
128 GtkWidget * ssh_tunnel_server_default_radio;
129 GtkWidget * ssh_tunnel_server_custom_radio;
130 GtkWidget * ssh_tunnel_server_entry;
131 GtkWidget * ssh_tunnel_auth_agent_radio;
132 GtkWidget * ssh_tunnel_auth_password_radio;
133 GtkWidget * ssh_tunnel_auth_password;
134 GtkWidget * ssh_tunnel_passphrase;
135 GtkWidget * ssh_tunnel_auth_publickey_radio;
136 GtkWidget * ssh_tunnel_auth_auto_publickey_radio;
137 GtkWidget * ssh_tunnel_auth_combo;
138 GtkWidget * ssh_tunnel_username_entry;
139 GtkWidget * ssh_tunnel_privatekey_chooser;
140 GtkWidget * ssh_tunnel_certfile_chooser;
142 GHashTable * setting_widgets;
147 TRACE_CALL(__func__);
166 GtkWidget * failed_widget,
171 g_set_error(&err, 1, 1, _(
"Input is invalid."));
174 if (!gfe || !failed_widget) {
175 g_critical(
"(%s): Parameters RemminaFileEditor 'gfe' or " 176 "GtkWidget* 'failed_widget' are 'NULL'!",
181 gint widget_width = gtk_widget_get_allocated_width(failed_widget);
182 gint widget_height = gtk_widget_get_allocated_height(failed_widget);
184 GtkWidget *err_label = gtk_label_new(
"");
185 GtkWidget *alert_icon = NULL;
186 GtkWindow *err_window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
187 GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
188 GdkWindow *window = gtk_widget_get_window(failed_widget);
190 GtkAllocation allocation;
191 gint failed_widget_x, failed_widget_y;
193 gchar *markup = g_strdup_printf(
"<span size='large'>%s</span>", err->message);
196 gtk_window_set_decorated(err_window, FALSE);
197 gtk_window_set_type_hint(err_window, GDK_WINDOW_TYPE_HINT_TOOLTIP);
198 gtk_window_set_default_size(err_window, widget_width, widget_height);
199 gtk_window_set_title(err_window,
"Error");
200 gtk_window_set_resizable(err_window, TRUE);
203 gtk_window_set_attached_to(err_window, failed_widget);
204 gtk_window_set_transient_for(err_window, GTK_WINDOW(gfe));
205 gdk_window_get_origin(GDK_WINDOW(window), &failed_widget_x, &failed_widget_y);
206 gtk_widget_get_allocation(failed_widget, &allocation);
207 failed_widget_x += allocation.x;
208 failed_widget_y += allocation.y + allocation.height;
209 gtk_window_move(err_window, failed_widget_x, failed_widget_y);
212 gtk_label_set_selectable(GTK_LABEL(err_label), FALSE);
213 gtk_label_set_max_width_chars(GTK_LABEL(err_label), 1);
214 gtk_widget_set_hexpand(GTK_WIDGET(err_label), TRUE);
215 gtk_widget_set_vexpand(GTK_WIDGET(err_label), TRUE);
216 gtk_label_set_ellipsize(GTK_LABEL(err_label), PANGO_ELLIPSIZE_END);
217 gtk_label_set_line_wrap(GTK_LABEL(err_label), TRUE);
218 gtk_label_set_line_wrap_mode(GTK_LABEL(err_label), PANGO_WRAP_WORD_CHAR);
219 gtk_label_set_markup(GTK_LABEL(err_label), markup);
221 alert_icon = gtk_image_new_from_icon_name(
"dialog-warning-symbolic",
225 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(alert_icon), FALSE, FALSE, 0);
226 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(err_label), TRUE, TRUE, 5);
229 gtk_container_add(GTK_CONTAINER(err_window), GTK_WIDGET(box));
232 gtk_widget_show_all(GTK_WIDGET(err_window));
235 g_signal_connect(G_OBJECT(err_window),
"focus-out-event",
236 G_CALLBACK(gtk_window_close), NULL);
237 g_signal_connect(G_OBJECT(err_window),
"button-press-event",
238 G_CALLBACK(gtk_window_close), NULL);
241 #ifdef HAVE_LIBAVAHI_UI 245 TRACE_CALL(__func__);
249 dialog = aui_service_dialog_new(_(
"Choose a Remote Desktop Server"),
251 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
252 _(
"_OK"), GTK_RESPONSE_ACCEPT,
255 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
256 aui_service_dialog_set_resolve_service(AUI_SERVICE_DIALOG(dialog), TRUE);
257 aui_service_dialog_set_resolve_host_name(AUI_SERVICE_DIALOG(dialog), TRUE);
258 aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(dialog),
259 gfe->
priv->avahi_service_type, NULL);
261 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
262 host = g_strdup_printf(
"[%s]:%i",
263 aui_service_dialog_get_host_name(AUI_SERVICE_DIALOG(dialog)),
264 aui_service_dialog_get_port(AUI_SERVICE_DIALOG(dialog)));
268 gtk_widget_destroy(dialog);
271 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gfe->
priv->server_combo))), host);
279 TRACE_CALL(__func__);
281 GtkWidget *defaultwidget;
283 gfe = REMMINA_FILE_EDITOR(widget);
285 defaultwidget = gfe->
priv->server_combo;
288 if (GTK_IS_EDITABLE(defaultwidget))
289 gtk_editable_select_region(GTK_EDITABLE(defaultwidget), 0, -1);
290 gtk_widget_grab_focus(defaultwidget);
296 TRACE_CALL(__func__);
298 g_hash_table_destroy(REMMINA_FILE_EDITOR(widget)->priv->setting_widgets);
299 g_free(REMMINA_FILE_EDITOR(widget)->priv);
304 TRACE_CALL(__func__);
305 gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)));
310 TRACE_CALL(__func__);
312 gfe->
priv->config_container = gtk_notebook_new();
313 gfe->
priv->config_viewport = gtk_viewport_new(NULL, NULL);
314 gfe->
priv->config_scrollable = gtk_scrolled_window_new(NULL, NULL);
315 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_scrollable), 2);
316 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gfe->
priv->config_scrollable),
317 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
318 gtk_widget_show(gfe->
priv->config_scrollable);
320 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_viewport), gfe->
priv->config_container);
321 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_viewport), 2);
322 gtk_widget_show(gfe->
priv->config_viewport);
323 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_scrollable), gfe->
priv->config_viewport);
324 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_container), 2);
325 gtk_widget_show(gfe->
priv->config_container);
327 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_box), gfe->
priv->config_scrollable);
331 const gchar *stock_id,
const gchar *label, gint rows, gint cols)
333 TRACE_CALL(__func__);
339 tablabel = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
340 gtk_widget_show(tablabel);
342 widget = gtk_image_new_from_icon_name(stock_id, GTK_ICON_SIZE_BUTTON);
343 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
344 gtk_widget_show(widget);
346 widget = gtk_label_new(label);
347 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
348 gtk_widget_show(widget);
350 tabbody = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
351 gtk_widget_show(tabbody);
352 gtk_notebook_append_page(GTK_NOTEBOOK(gfe->
priv->config_container), tabbody, tablabel);
354 grid = gtk_grid_new();
355 gtk_widget_show(grid);
356 gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
357 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
358 gtk_container_set_border_width(GTK_CONTAINER(grid), 15);
359 gtk_box_pack_start(GTK_BOX(tabbody), grid, FALSE, FALSE, 0);
368 TRACE_CALL(__func__);
369 gboolean enabled = TRUE;
371 if (gfe->
priv->assistance_toggle) {
372 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->assistance_toggle));
373 if (gfe->
priv->assistance_file)
374 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file), enabled);
375 if (gfe->
priv->assistance_password)
376 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password), enabled);
377 if (gfe->
priv->assistance_file_label)
378 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file_label), enabled);
379 if (gfe->
priv->assistance_password_label)
380 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password_label), enabled);
388 TRACE_CALL(__func__);
389 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_entry),
390 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check)) &&
391 (gfe->
priv->ssh_tunnel_server_custom_radio == NULL ||
392 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_server_custom_radio))));
399 TRACE_CALL(__func__);
401 gboolean enabled = TRUE;
404 const gchar *s = NULL;
406 if (gfe->
priv->ssh_tunnel_enabled_check) {
407 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check));
408 if (gfe->
priv->ssh_tunnel_loopback_check)
409 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_loopback_check), enabled);
410 if (gfe->
priv->ssh_tunnel_server_default_radio)
411 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_default_radio), enabled);
412 if (gfe->
priv->ssh_tunnel_server_custom_radio)
413 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_custom_radio), enabled);
417 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_username_entry), enabled);
418 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_password), enabled);
419 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_combo), enabled);
426 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_privatekey_chooser), s);
429 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_certfile_chooser), s);
431 if (gfe->
priv->ssh_tunnel_username_entry)
432 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry))[0] ==
'\0') {
434 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry), cp ? cp :
"");
437 if (gfe->
priv->ssh_tunnel_auth_password) {
438 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password))[0] ==
'\0') {
440 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password), cp ? cp :
"");
443 if (gfe->
priv->ssh_tunnel_passphrase) {
444 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase))[0] ==
'\0') {
446 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase), cp ? cp :
"");
456 TRACE_CALL(__func__);
459 #ifdef HAVE_LIBAVAHI_UI 464 widget = gtk_label_new(_(
"Server"));
465 gtk_widget_show(widget);
466 gtk_widget_set_valign(widget, GTK_ALIGN_START);
467 gtk_widget_set_halign(widget, GTK_ALIGN_START);
468 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, row + 1);
472 gtk_widget_set_hexpand(widget, TRUE);
473 gtk_widget_show(widget);
474 gtk_widget_set_tooltip_markup(widget, _(server_tips));
475 gtk_entry_set_activates_default(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget))), TRUE);
476 gfe->
priv->server_combo = widget;
479 #ifdef HAVE_LIBAVAHI_UI 481 gfe->
priv->avahi_service_type = (
const gchar *)setting->
opt1;
483 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
484 gtk_widget_show(hbox);
485 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
487 widget = gtk_button_new_with_label(
"…");
488 s = g_strdup_printf(_(
"Browse the network to find a %s server"), plugin->
name);
489 gtk_widget_set_tooltip_text(widget, s);
491 gtk_widget_show(widget);
492 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
495 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
499 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
506 TRACE_CALL(__func__);
509 widget = gtk_label_new(label);
510 gtk_widget_show(widget);
511 #if GTK_CHECK_VERSION(3, 12, 0) 512 gtk_widget_set_margin_end(widget, 40);
514 gtk_widget_set_margin_right(widget, 40);
516 gtk_widget_set_valign(widget, GTK_ALIGN_START);
517 gtk_widget_set_halign(widget, GTK_ALIGN_START);
518 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
520 widget = gtk_entry_new();
521 gtk_widget_show(widget);
522 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
523 gtk_entry_set_max_length(GTK_ENTRY(widget), 0);
524 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
525 gtk_widget_set_hexpand(widget, TRUE);
526 gtk_entry_set_activates_default(GTK_ENTRY(widget), TRUE);
528 gtk_widget_set_name(widget, setting_name);
531 gtk_entry_set_text(GTK_ENTRY(widget), value);
534 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY,
"org.remmina.Remmina-password-reveal-symbolic");
535 gtk_entry_set_icon_activatable(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY, TRUE);
543 TRACE_CALL(__func__);
545 res_str = g_strdup_printf(
"%dx%d",
555 TRACE_CALL(__func__);
561 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
562 gtk_dialog_run(dialog);
566 gtk_widget_destroy(GTK_WIDGET(dialog));
570 GtkWidget *grid, gint row)
572 TRACE_CALL(__func__);
575 int resolution_w, resolution_h;
586 if (resolution_w <= 0 || resolution_h <= 0)
592 res_str = g_strdup_printf(
"%dx%d", resolution_w, resolution_h);
596 widget = gtk_label_new(_(
"Resolution"));
597 gtk_widget_show(widget);
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 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
603 widget = gtk_radio_button_new_with_label(NULL, _(
"Use initial window size"));
604 gtk_widget_show(widget);
605 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
606 gfe->
priv->resolution_iws_radio = widget;
607 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Use client resolution"));
608 gtk_widget_show(widget);
609 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
610 gfe->
priv->resolution_auto_radio = widget;
611 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
612 gtk_widget_show(hbox);
614 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
615 gtk_widget_show(hbox);
616 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row + 1, 1, 1);
618 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Custom"));
619 gtk_widget_show(widget);
620 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
621 gfe->
priv->resolution_custom_radio = widget;
624 gtk_widget_show(widget);
625 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
626 gfe->
priv->resolution_custom_combo = widget;
628 widget = gtk_button_new_with_label(
"…");
629 gtk_widget_show(widget);
630 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
633 g_signal_connect(G_OBJECT(gfe->
priv->resolution_custom_radio),
"toggled",
637 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio), TRUE);
639 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_auto_radio), TRUE);
641 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_iws_radio), TRUE);
643 gtk_widget_set_sensitive(gfe->
priv->resolution_custom_combo, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio)));
650 GtkWidget *grid, gint row)
652 TRACE_CALL(__func__);
657 widget = gtk_toggle_button_new_with_label(_(
"Assistance Mode"));
658 gtk_widget_set_halign(widget, GTK_ALIGN_START);
659 gtk_widget_show(widget);
660 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
661 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
remmina_file_get_int(gfe->
priv->remmina_file,
"assistance_mode", 0));
662 gfe->
priv->assistance_toggle = widget;
666 widget = gtk_label_new(
"Assistance file");
667 gtk_widget_set_halign(widget, GTK_ALIGN_END);
668 gtk_widget_show(widget);
669 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+1, 1, 1);
670 gfe->
priv->assistance_file_label = widget;
672 widget = gtk_entry_new();
673 gtk_widget_set_halign(widget, GTK_ALIGN_START);
674 gtk_widget_show(widget);
676 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+1, 1, 1);
677 gfe->
priv->assistance_file = widget;
679 widget = gtk_label_new(
"Assistance Password");
680 gtk_widget_set_halign(widget, GTK_ALIGN_END);
681 gtk_widget_show(widget);
682 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+2, 1, 1);
683 gfe->
priv->assistance_password_label = widget;
685 widget = gtk_entry_new();
686 gtk_widget_set_halign(widget, GTK_ALIGN_START);
687 gtk_widget_show(widget);
689 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+2, 1, 1);
690 gfe->
priv->assistance_password = widget;
698 gint row, gint col,
const gchar *label,
const gchar *value, gint left,
699 gint right, gchar *setting_name)
701 TRACE_CALL(__func__);
704 widget = gtk_label_new(label);
705 gtk_widget_show(widget);
706 #if GTK_CHECK_VERSION(3, 12, 0) 707 gtk_widget_set_margin_start(widget, left);
708 gtk_widget_set_margin_end(widget, right);
710 gtk_widget_set_margin_left(widget, left);
711 gtk_widget_set_margin_right(widget, right);
713 gtk_widget_set_valign(widget, GTK_ALIGN_START);
714 gtk_widget_set_halign(widget, GTK_ALIGN_START);
715 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
717 widget = gtk_entry_new();
718 gtk_widget_show(widget);
719 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
720 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
721 gtk_widget_set_hexpand(widget, TRUE);
723 gtk_widget_set_name(widget, setting_name);
726 gtk_entry_set_text(GTK_ENTRY(widget), value);
732 gint row, gint col,
const gchar *label,
const gchar *value,
735 TRACE_CALL(__func__);
741 gint row, gint col,
const gchar *label,
const gchar *value,
744 TRACE_CALL(__func__);
747 GtkTextBuffer *buffer;
750 widget = gtk_text_view_new();
751 view = GTK_TEXT_VIEW(widget);
752 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
753 gtk_text_view_set_top_margin(GTK_TEXT_VIEW(view), 20);
754 gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(view), 20);
755 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 20);
756 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 20);
757 gtk_text_view_set_monospace(view, TRUE);
759 gtk_widget_set_name(widget, setting_name);
761 buffer = gtk_text_view_get_buffer(view);
762 gtk_text_buffer_set_text(buffer, value, -1);
763 gtk_text_buffer_get_start_iter(buffer, &start);
764 gtk_text_buffer_place_cursor(buffer, &start);
766 gtk_widget_show(widget);
767 gtk_widget_set_hexpand(widget, TRUE);
768 gtk_widget_set_size_request(GTK_WIDGET(view), 320, 300);
769 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
774 gint row, gint col,
const gchar *label,
const gpointer *list,
775 const gchar *value, gchar *setting_name)
777 TRACE_CALL(__func__);
780 widget = gtk_label_new(label);
781 gtk_widget_show(widget);
782 gtk_widget_set_valign(widget, GTK_ALIGN_START);
783 gtk_widget_set_halign(widget, GTK_ALIGN_START);
785 gtk_widget_set_name(widget, setting_name);
786 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
789 gtk_widget_show(widget);
790 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
796 gint row, gint col,
const gchar *label,
const gchar *list,
797 const gchar *value, gchar *setting_name)
799 TRACE_CALL(__func__);
802 widget = gtk_label_new(label);
803 gtk_widget_show(widget);
804 gtk_widget_set_valign(widget, GTK_ALIGN_START);
805 gtk_widget_set_halign(widget, GTK_ALIGN_START);
806 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
809 gtk_widget_show(widget);
810 gtk_widget_set_hexpand(widget, TRUE);
812 gtk_widget_set_name(widget, setting_name);
813 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
819 gint row, gint top,
const gchar *label, gboolean value,
822 TRACE_CALL(__func__);
824 widget = gtk_check_button_new_with_label(label);
825 gtk_widget_show(widget);
827 gtk_widget_set_name(widget, setting_name);
828 gtk_grid_attach(GTK_GRID(grid), widget, top, row, 1, 1);
831 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
847 const gchar *value, gint type, gchar *setting_name)
849 TRACE_CALL(__func__);
854 widget = gtk_label_new(label);
855 gtk_widget_show(widget);
856 gtk_widget_set_valign(widget, GTK_ALIGN_START);
857 gtk_widget_set_halign(widget, GTK_ALIGN_START);
858 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
860 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
861 gtk_widget_show(hbox);
862 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
864 check = gtk_check_button_new();
865 gtk_widget_show(check);
866 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (value && value[0] ==
'/'));
867 gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
869 widget = gtk_file_chooser_button_new(label, type);
871 gtk_widget_set_name(widget, setting_name);
872 gtk_widget_show(widget);
874 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), value);
875 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
885 gint length, gint *position, gpointer data)
887 for (
int i = 0; i < length; i++) {
888 if (!isdigit(text[i]) && text[i] !=
'-') {
889 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
899 gint length, gint *position, gpointer data)
901 for (
int i = 0; i < length; i++) {
902 if (!isdigit(text[i]) && text[i] !=
'-' && text[i] !=
'.' && text[i] !=
',') {
903 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
910 gint row, gint col,
const gchar *label,
const gint value,
911 gint left, gint right, gchar *setting_name)
913 TRACE_CALL(__func__);
916 widget = gtk_label_new(label);
917 gtk_widget_show(widget);
918 #if GTK_CHECK_VERSION(3, 12, 0) 919 gtk_widget_set_margin_start(widget, left);
920 gtk_widget_set_margin_end(widget, right);
922 gtk_widget_set_margin_left(widget, left);
923 gtk_widget_set_margin_right(widget, right);
925 gtk_widget_set_valign(widget, GTK_ALIGN_START);
926 gtk_widget_set_halign(widget, GTK_ALIGN_START);
927 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
929 widget = gtk_entry_new();
930 gtk_widget_show(widget);
931 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
932 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
933 gtk_widget_set_hexpand(widget, TRUE);
935 gtk_widget_set_name(widget, setting_name);
938 int length = snprintf(NULL, 0,
"%d", value) + 1;
939 char *str = malloc(length);
940 snprintf(str, length,
"%d", value);
942 gtk_entry_set_text(GTK_ENTRY(widget), str);
945 g_signal_connect(G_OBJECT(widget),
"insert-text",
952 GtkWidget *grid, gint row, gint col,
953 const gchar *label, gdouble value, gint left,
954 gint right, gchar *setting_name)
956 TRACE_CALL(__func__);
959 widget = gtk_label_new(label);
960 gtk_widget_show(widget);
961 #if GTK_CHECK_VERSION(3, 12, 0) 962 gtk_widget_set_margin_start(widget, left);
963 gtk_widget_set_margin_end(widget, right);
965 gtk_widget_set_margin_left(widget, left);
966 gtk_widget_set_margin_right(widget, right);
968 gtk_widget_set_valign(widget, GTK_ALIGN_START);
969 gtk_widget_set_halign(widget, GTK_ALIGN_START);
970 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
972 widget = gtk_entry_new();
973 gtk_widget_show(widget);
974 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
975 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
976 gtk_widget_set_hexpand(widget, TRUE);
978 gtk_widget_set_name(widget, setting_name);
981 int length = snprintf(NULL, 0,
"%.8g", value) + 1;
982 char *str = malloc(length);
983 snprintf(str, length,
"%f", value);
985 gtk_entry_set_text(GTK_ENTRY(widget), str);
988 g_signal_connect(G_OBJECT(widget),
"insert-text",
999 TRACE_CALL(__func__);
1003 gint grid_column = 0;
1005 gchar *setting_name;
1006 const gchar *escaped;
1010 switch (settings->
type) {
1017 g_dgettext(priv->plugin->domain, settings->
label),
1020 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1038 _(
"Keyboard mapping"), (
const gpointer *)strarr,
1047 g_dgettext(priv->plugin->domain, settings->
label),
1050 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1052 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1058 escaped = g_uri_unescape_string(escaped, NULL);
1060 g_dgettext(priv->plugin->domain, settings->
label), escaped,
1062 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1068 g_dgettext(priv->plugin->domain, settings->
label),
1069 (
const gpointer *)settings->
opt1,
1072 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1074 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1079 g_dgettext(priv->plugin->domain, settings->
label),
1080 (
const gchar *)settings->
opt1,
1083 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1085 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1090 g_dgettext(priv->plugin->domain, settings->
label),
1093 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1095 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1100 g_dgettext(priv->plugin->domain, settings->
label),
1102 GTK_FILE_CHOOSER_ACTION_OPEN, setting_name);
1103 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1105 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1110 g_dgettext(priv->plugin->domain, settings->
label),
1112 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1114 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1116 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1120 g_dgettext(priv->plugin->domain, settings->
label),
1122 0, 40, setting_name);
1123 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1125 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1130 g_dgettext(priv->plugin->domain, settings->
label),
1132 0, 40, setting_name);
1133 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1135 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1148 if (!settings->
compact || grid_column > 1) {
1158 TRACE_CALL(__func__);
1173 priv->behavior_precommand_entry = widget;
1174 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"command %h %u %t %U %p %g --option"));
1175 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1180 priv->behavior_postcommand_entry = widget;
1181 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"/path/to/command -opt1 arg %h %u %t -opt2 %U %p %g"));
1182 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1209 "0",
N_(
"Password"),
1210 "1",
N_(
"SSH identity file"),
1211 "2",
N_(
"SSH agent"),
1212 "3",
N_(
"Public key (automatic)"),
1213 "4",
N_(
"Kerberos (GSSAPI)"),
1220 TRACE_CALL(__func__);
1235 _(
"SSH Tunnel"), 9, 3);
1236 widget = gtk_toggle_button_new_with_label(_(
"Enable SSH tunnel"));
1237 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1238 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1239 g_signal_connect(G_OBJECT(widget),
"toggled",
1241 priv->ssh_tunnel_enabled_check = widget;
1243 widget = gtk_check_button_new_with_label(_(
"Tunnel via loopback address"));
1244 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1245 priv->ssh_tunnel_loopback_check = widget;
1251 switch (ssh_setting) {
1253 s = g_strdup_printf(_(
"Same server at port %i"), DEFAULT_SSH_PORT);
1254 widget = gtk_radio_button_new_with_label(NULL, s);
1256 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 3, 1);
1257 priv->ssh_tunnel_server_default_radio = widget;
1261 widget = gtk_radio_button_new_with_label_from_widget(
1262 GTK_RADIO_BUTTON(priv->ssh_tunnel_server_default_radio), _(
"Custom"));
1263 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1264 g_signal_connect(G_OBJECT(widget),
"toggled",
1266 priv->ssh_tunnel_server_custom_radio = widget;
1268 widget = gtk_entry_new();
1269 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
1270 gtk_widget_set_tooltip_markup(widget, _(server_tips2));
1271 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1272 priv->ssh_tunnel_server_entry = widget;
1278 priv->ssh_tunnel_server_default_radio = NULL;
1279 priv->ssh_tunnel_server_custom_radio = NULL;
1282 _(
"Server"), NULL,
"ssh_reverse_tunnel_server");
1283 gtk_widget_set_tooltip_markup(priv->ssh_tunnel_server_entry, _(server_tips));
1289 priv->ssh_tunnel_server_default_radio = NULL;
1290 priv->ssh_tunnel_server_custom_radio = NULL;
1291 priv->ssh_tunnel_server_entry = NULL;
1303 _(
"Start-up path"), NULL,
"start-up-path");
1305 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1306 g_hash_table_insert(priv->setting_widgets,
"execpath", widget);
1317 _(
"Authentication type"),
1324 priv->ssh_tunnel_username_entry =
1326 _(
"Username"), NULL,
"ssh_tunnel_username");
1334 "ssh_tunnel_password");
1335 priv->ssh_tunnel_auth_password = widget;
1339 _(
"SSH private key file"),
1341 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_privatekey");
1345 _(
"SSH certificate file"),
1347 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_certfile");
1350 widget = gtk_label_new(_(
"Password to unlock private key"));
1351 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1352 widget = gtk_entry_new();
1353 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1354 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
1355 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
1356 gtk_widget_set_hexpand(widget, TRUE);
1357 priv->ssh_tunnel_passphrase = widget;
1363 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
1365 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
1368 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cs ? priv->ssh_tunnel_server_custom_radio : priv->ssh_tunnel_server_default_radio), TRUE);
1369 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
1372 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
1374 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
1376 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
1381 gtk_widget_show_all(grid);
1388 TRACE_CALL(__func__);
1401 if (priv->plugin->basic_settings) {
1407 if (priv->plugin->advanced_settings) {
1425 TRACE_CALL(__func__);
1429 if (priv->config_container) {
1430 gtk_widget_destroy(priv->config_container);
1431 priv->config_container = NULL;
1432 gtk_widget_destroy(priv->config_viewport);
1433 priv->config_viewport = NULL;
1434 gtk_widget_destroy(priv->config_scrollable);
1435 priv->config_scrollable = NULL;
1438 priv->server_combo = NULL;
1439 priv->resolution_iws_radio = NULL;
1440 priv->resolution_auto_radio = NULL;
1441 priv->resolution_custom_radio = NULL;
1442 priv->resolution_custom_combo = NULL;
1443 priv->keymap_combo = NULL;
1445 priv->ssh_tunnel_enabled_check = NULL;
1446 priv->ssh_tunnel_loopback_check = NULL;
1447 priv->ssh_tunnel_server_default_radio = NULL;
1448 priv->ssh_tunnel_server_custom_radio = NULL;
1449 priv->ssh_tunnel_server_entry = NULL;
1450 priv->ssh_tunnel_username_entry = NULL;
1451 priv->ssh_tunnel_auth_combo = NULL;
1452 priv->ssh_tunnel_auth_password = NULL;
1453 priv->ssh_tunnel_privatekey_chooser = NULL;
1454 priv->ssh_tunnel_certfile_chooser = NULL;
1456 g_hash_table_remove_all(priv->setting_widgets);
1469 TRACE_CALL(__func__);
1472 remmina_file_set_string(priv->remmina_file,
"precommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_precommand_entry)));
1473 remmina_file_set_string(priv->remmina_file,
"postcommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_postcommand_entry)));
1475 gboolean autostart_enabled = (priv->behavior_autostart_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_autostart_check)) : FALSE);
1477 gboolean lock_enabled = (priv->behavior_lock_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_lock_check)) : FALSE);
1479 gboolean disconect_prompt = (priv->behavior_disconnect ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_disconnect)) : FALSE);
1485 TRACE_CALL(__func__);
1487 gboolean ssh_tunnel_enabled;
1488 int ssh_tunnel_auth;
1490 ssh_tunnel_enabled = (priv->ssh_tunnel_enabled_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check)) : FALSE);
1492 "ssh_tunnel_loopback",
1493 (priv->ssh_tunnel_loopback_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) : FALSE));
1498 (ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL));
1501 "ssh_tunnel_server",
1502 (ssh_tunnel_enabled && priv->ssh_tunnel_server_entry && (priv->ssh_tunnel_server_custom_radio == NULL || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_server_custom_radio))) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_server_entry)) : NULL));
1504 ssh_tunnel_auth = gtk_combo_box_get_active(GTK_COMBO_BOX(priv->ssh_tunnel_auth_combo));
1513 if (gtk_widget_get_sensitive(priv->ssh_tunnel_privatekey_chooser)) {
1516 "ssh_tunnel_privatekey",
1517 (priv->ssh_tunnel_privatekey_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser)) : NULL));
1523 if (gtk_widget_get_sensitive(priv->ssh_tunnel_certfile_chooser)) {
1526 "ssh_tunnel_certfile",
1527 (priv->ssh_tunnel_certfile_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_certfile_chooser)) : NULL));
1535 "ssh_tunnel_password",
1536 (ssh_tunnel_enabled && (ssh_tunnel_auth ==
SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_auth_password)) : NULL);
1540 "ssh_tunnel_passphrase",
1545 gchar * setting_name_to_validate,
1546 gconstpointer value,
1549 if (!setting_name_to_validate || !value || !gfe) {
1550 if (!setting_name_to_validate) {
1551 g_critical(_(
"(%s: %i): Can't validate setting '%s' since 'value' or 'gfe' " 1553 __func__, __LINE__, setting_name_to_validate);
1555 g_critical(_(
"(%s: %i): Can't validate user input since " 1556 "'setting_name_to_validate', 'value' or 'gfe' are NULL!"),
1557 __func__, __LINE__);
1559 g_set_error(err, 1, 1, _(
"Internal error."));
1563 if (strcmp(setting_name_to_validate,
"notes_text") == 0) {
1571 protocol_plugin = priv->plugin;
1577 if (setting_iter->
name == NULL) {
1578 g_error(
"Internal error: a setting name in protocol plugin %s is " 1579 "null. Please fix RemminaProtocolSetting struct content.",
1580 protocol_plugin->
name);
1581 }
else if ((gchar *)setting_name_to_validate) {
1582 if (strcmp((gchar *)setting_name_to_validate, setting_iter->
name) == 0) {
1586 GCallback validator = setting_iter->
validator;
1590 GError *err_ret = NULL;
1592 g_debug(
"Checking setting '%s' for validation.", setting_iter->
name);
1593 if (validator != NULL) {
1597 err_ret = ((GError * (*)(gpointer, gconstpointer, gpointer)) validator)(setting_name_to_validate, value, validator_data);
1601 g_debug(
"it has a validator function and it had an error!");
1623 GtkWidget ** failed_widget)
1625 TRACE_CALL(__func__);
1627 GHashTableIter iter;
1630 GtkTextBuffer *buffer;
1631 gchar *escaped, *unescaped;
1632 GtkTextIter start, end;
1635 *failed_widget = NULL;
1637 g_hash_table_iter_init(&iter, priv->setting_widgets);
1638 while (g_hash_table_iter_next(&iter, &key, &widget)) {
1644 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget)) && !GTK_IS_FILE_CHOOSER(widget)) {
1645 g_debug(
"Grayed-out setting-widget '%s' will not be saved.",
1646 gtk_widget_get_name(widget));
1650 if (GTK_IS_ENTRY(widget)) {
1651 const gchar *value = gtk_entry_get_text(GTK_ENTRY(widget));
1656 *failed_widget = widget;
1661 }
else if (GTK_IS_TEXT_VIEW(widget)) {
1662 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
1663 gtk_text_buffer_get_start_iter(buffer, &start);
1664 gtk_text_buffer_get_end_iter(buffer, &end);
1665 unescaped = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1666 escaped = g_uri_escape_string(unescaped, NULL, TRUE);
1671 *failed_widget = widget;
1677 }
else if (GTK_IS_COMBO_BOX(widget)) {
1683 *failed_widget = widget;
1688 }
else if (GTK_IS_FILE_CHOOSER(widget)) {
1689 gchar *value = gtk_widget_get_sensitive(GTK_WIDGET(widget)) ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)) : NULL;
1691 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget))) {
1700 *failed_widget = widget;
1706 }
else if (GTK_IS_TOGGLE_BUTTON(widget)) {
1707 gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
1712 *failed_widget = widget;
1728 GtkWidget ** failed_widget)
1730 TRACE_CALL(__func__);
1732 gchar *custom_resolution;
1750 if (priv->resolution_auto_radio) {
1751 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_auto_radio))) {
1755 }
else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_iws_radio))) {
1766 g_free(custom_resolution);
1773 if (priv->assistance_toggle){
1774 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->assistance_toggle))) {
1775 remmina_file_set_string(priv->remmina_file,
"assistance_file", gtk_entry_get_text(GTK_ENTRY(priv->assistance_file)));
1776 remmina_file_set_string(priv->remmina_file,
"assistance_pass", gtk_entry_get_text(GTK_ENTRY(priv->assistance_password)));
1784 if (priv->keymap_combo)
1795 TRACE_CALL(__func__);
1799 GtkWidget *failed_widget = NULL;
1802 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1825 dialog = gtk_message_dialog_new(GTK_WINDOW(gfe), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
1826 GTK_BUTTONS_OK, _(
"Default settings saved."));
1827 gtk_dialog_run(GTK_DIALOG(dialog));
1828 gtk_widget_destroy(dialog);
1833 TRACE_CALL(__func__);
1835 GtkWidget *failed_widget = NULL;
1838 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1848 gtk_widget_destroy(GTK_WIDGET(gfe));
1853 TRACE_CALL(__func__);
1856 GtkWidget *failed_widget = NULL;
1859 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1868 gtk_widget_destroy(GTK_WIDGET(gfe));
1869 gf->prevent_saving = TRUE;
1875 TRACE_CALL(__func__);
1879 GtkWidget *failed_widget = NULL;
1882 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1896 gtk_widget_destroy(GTK_WIDGET(gfe));
1902 TRACE_CALL(__func__);
1903 gtk_widget_destroy(GTK_WIDGET(gfe));
1908 TRACE_CALL(__func__);
1916 gtk_window_set_title(GTK_WINDOW(gfe), _(
"Remote Connection Profile"));
1918 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Cancel")), GTK_RESPONSE_CANCEL);
1922 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Save as Default")), GTK_RESPONSE_OK);
1923 gtk_widget_set_tooltip_text(GTK_WIDGET(widget), _(
"Use the current settings as the default for all new connection profiles"));
1926 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save")), GTK_RESPONSE_APPLY);
1928 gtk_widget_set_sensitive(widget, FALSE);
1929 priv->save_button = widget;
1931 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Connect")), GTK_RESPONSE_ACCEPT);
1934 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save and Connect")), GTK_RESPONSE_OK);
1935 gtk_widget_set_can_default(widget, TRUE);
1938 gtk_dialog_set_default_response(GTK_DIALOG(gfe), GTK_RESPONSE_OK);
1939 gtk_window_set_default_size(GTK_WINDOW(gfe), 800, 600);
1944 priv->setting_widgets = g_hash_table_new(g_str_hash, g_str_equal);
1951 TRACE_CALL(__func__);
1953 GtkListStore *store;
1957 store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gfe->
priv->protocol_combo)));
1959 first = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
1961 gtk_list_store_append(store, &iter);
1962 gtk_list_store_set(store, &iter, 0, protocol, 1, g_dgettext(plugin->
domain, plugin->
description), 2,
1966 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gfe->
priv->protocol_combo), &iter);
1973 TRACE_CALL(__func__);
1977 gtk_widget_set_sensitive(priv->group_combo, TRUE);
1978 gtk_widget_set_sensitive(priv->save_button, TRUE);
1983 TRACE_CALL(__func__);
2000 TRACE_CALL(__func__);
2014 TRACE_CALL(__func__);
2023 gfe = REMMINA_FILE_EDITOR(g_object_new(REMMINA_TYPE_FILE_EDITOR, NULL));
2025 priv->remmina_file = remminafile;
2028 gtk_dialog_set_response_sensitive(GTK_DIALOG(gfe), GTK_RESPONSE_APPLY, FALSE);
2031 grid = gtk_grid_new();
2032 gtk_widget_show(grid);
2033 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
2034 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
2035 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
2036 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
2037 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), grid, FALSE, FALSE, 2);
2044 widget = gtk_label_new(_(
"Name"));
2045 gtk_widget_show(widget);
2046 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2047 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2048 gtk_grid_attach(GTK_GRID(grid), widget, 0, 3, 2, 1);
2049 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2051 widget = gtk_entry_new();
2052 gtk_widget_show(widget);
2053 gtk_grid_attach(GTK_GRID(grid), widget, 1, 3, 3, 1);
2054 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
2055 priv->name_entry = widget;
2057 if (!profile_file_exists) {
2058 gtk_entry_set_text(GTK_ENTRY(widget), _(
"Quick Connect"));
2059 #if GTK_CHECK_VERSION(3, 16, 0) 2060 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2065 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2069 widget = gtk_label_new(_(
"Group"));
2070 gtk_widget_show(widget);
2071 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2072 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2073 gtk_grid_attach(GTK_GRID(grid), widget, 0, 6, 2, 1);
2078 gtk_widget_show(priv->group_combo);
2079 gtk_grid_attach(GTK_GRID(grid), priv->group_combo, 1, 6, 3, 1);
2080 gtk_widget_set_sensitive(priv->group_combo, FALSE);
2082 s = g_strdup_printf(_(
"Use '%s' as subgroup delimiter"),
"/");
2083 gtk_widget_set_tooltip_text(priv->group_combo, s);
2087 widget = gtk_label_new(_(
"Labels"));
2088 gtk_widget_show(widget);
2089 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2090 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2091 gtk_grid_attach(GTK_GRID(grid), widget, 0, 9, 2, 1);
2092 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2094 widget = gtk_entry_new();
2095 gtk_widget_show(widget);
2096 gtk_grid_attach(GTK_GRID(grid), widget, 1, 9, 3, 1);
2097 gtk_entry_set_max_length(GTK_ENTRY(widget), 255);
2098 priv->labels_entry = widget;
2100 if (!profile_file_exists) {
2101 gtk_widget_set_tooltip_text(widget, _(
"Label1,Label2"));
2102 #if GTK_CHECK_VERSION(3, 16, 0) 2103 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2108 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2112 widget = gtk_label_new(_(
"Protocol"));
2113 gtk_widget_show(widget);
2114 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2115 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2116 gtk_grid_attach(GTK_GRID(grid), widget, 0, 12, 2, 1);
2119 gtk_widget_show(widget);
2120 gtk_grid_attach(GTK_GRID(grid), widget, 1, 12, 3, 1);
2121 priv->protocol_combo = widget;
2126 widget = gtk_event_box_new();
2127 gtk_widget_show(widget);
2128 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), widget, TRUE, TRUE, 2);
2129 priv->config_box = widget;
2131 priv->config_container = NULL;
2132 priv->config_scrollable = NULL;
2138 return GTK_WIDGET(gfe);
2143 TRACE_CALL(__func__);
2149 TRACE_CALL(__func__);
2163 TRACE_CALL(__func__);
2172 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2173 _(
"Could not find the file “%s”."), filename);
2174 gtk_dialog_run(GTK_DIALOG(dialog));
2175 gtk_widget_destroy(dialog);
2182 TRACE_CALL(__func__);
2191 GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2192 _(
"Could not find the file “%s”."), filename);
2193 gtk_dialog_run(GTK_DIALOG(dialog));
2194 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)
@@ -95,15 +95,15 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
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)
+
static void remmina_file_editor_create_resolution(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
-
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 *setting_name)
+
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 *setting_name)
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)
+
static void remmina_file_editor_on_connect(GtkWidget *button, RemminaFileEditor *gfe)
gchar * remmina_pref_file
GtkWindow * remmina_main_get_window()
@@ -112,13 +112,13 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
G_DEFINE_TYPE(RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG)
-
static GtkWidget * remmina_file_editor_create_int(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gint value, gint left, gint right, gchar *setting_name)
-
static void remmina_file_editor_ssh_tunnel_enabled_check_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
+
static GtkWidget * remmina_file_editor_create_int(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gint value, gint left, gint right, gchar *setting_name)
+
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)
-
static GtkWidget * remmina_file_editor_create_double(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, gdouble value, gint left, gint right, gchar *setting_name)
-
static GtkWidget * remmina_file_editor_create_select(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gpointer *list, const gchar *value, gchar *setting_name)
+
static GtkWidget * remmina_file_editor_create_double(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, gdouble value, gint left, gint right, gchar *setting_name)
+
static GtkWidget * remmina_file_editor_create_select(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gpointer *list, const gchar *value, gchar *setting_name)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
-
static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox *combo, RemminaFileEditor *gfe)
+
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)
@@ -132,12 +132,12 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
gchar * remmina_pref_get_recent(const gchar *protocol)
-
static void remmina_file_editor_create_server(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
+
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)
+
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
gdouble remmina_file_get_double(RemminaFile *remminafile, const gchar *setting, gdouble default_value)
-
static void remmina_file_editor_init(RemminaFileEditor *gfe)
+
static void remmina_file_editor_init(RemminaFileEditor *gfe)
void remmina_file_generate_filename(RemminaFile *remminafile)
Generate a new Remmina connection profile file name.
@@ -149,17 +149,17 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
RemminaProtocolWidgetResolutionMode
static void remmina_file_editor_show_validation_error_popup(RemminaFileEditor *gfe, GtkWidget *failed_widget, GError *err)
Shows a tooltip-like window which tells the user what they did wrong to trigger the validation functi...
GtkWidget * remmina_public_create_combo_map(const gpointer *key_value_list, const gchar *def, gboolean use_icon, const gchar *domain)
-
static GtkWidget * remmina_file_editor_create_chooser(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gint type, gchar *setting_name)
Create checkbox + gtk_file_chooser for open files and select folders.
+
static GtkWidget * remmina_file_editor_create_chooser(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gint type, gchar *setting_name)
Create checkbox + gtk_file_chooser for open files and select folders.
-
static GtkWidget * remmina_file_editor_create_password(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
+
static GtkWidget * remmina_file_editor_create_password(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
void remmina_file_set_filename(RemminaFile *remminafile, const gchar *filename)
-
static gpointer ssh_tunnel_auth_list[]
+
static gpointer ssh_tunnel_auth_list[]
-
static GError * remmina_file_editor_update_settings(RemminaFileEditor *gfe, GtkWidget **failed_widget)
+
static GError * remmina_file_editor_update_settings(RemminaFileEditor *gfe, GtkWidget **failed_widget)
-
void remmina_file_editor_check_profile(RemminaFileEditor *gfe)
+
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)
@@ -170,24 +170,24 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
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 GtkWidget * remmina_file_editor_create_text2(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gint left, gint right, gchar *setting_name)
+
static void remmina_file_editor_entry_on_changed(GtkEditable *editable, RemminaFileEditor *gfe)
+
static GtkWidget * remmina_file_editor_create_text2(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gint left, gint right, gchar *setting_name)
const RemminaProtocolSetting * basic_settings
-
static GtkWidget * remmina_file_editor_create_check(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint top, const gchar *label, gboolean value, gchar *setting_name)
-
static void remmina_file_editor_create_all_settings(RemminaFileEditor *gfe)
+
static GtkWidget * remmina_file_editor_create_check(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint top, const gchar *label, gboolean value, gchar *setting_name)
+
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)
+
GtkWidget * remmina_file_editor_new_from_file(RemminaFile *remminafile)
-
void remmina_file_editor_int_setting_filter(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data)
+
void remmina_file_editor_int_setting_filter(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data)
void remmina_string_list_set_text(const gchar *text, const gboolean clear_data)
-
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
+
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
-
static void remmina_file_editor_create_ssh_tunnel_tab(RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
+
static void remmina_file_editor_create_ssh_tunnel_tab(RemminaFileEditor *gfe, RemminaProtocolSSHSetting ssh_setting)
RemminaProtocolSettingType type
@@ -196,58 +196,58 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
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)
+
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)
+
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)
+
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 void remmina_file_editor_on_cancel(GtkWidget *button, RemminaFileEditor *gfe)
+
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 void remmina_file_editor_assistance_enabled_check_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
+
static void remmina_file_editor_on_save(GtkWidget *button, RemminaFileEditor *gfe)
+
static void remmina_file_editor_on_default(GtkWidget *button, RemminaFileEditor *gfe)
+
static void remmina_file_editor_assistance_enabled_check_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
void remmina_main_toggle_password_view(GtkWidget *widget, gpointer data)
-
void remmina_file_editor_double_setting_filter(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data)
+
void remmina_file_editor_double_setting_filter(GtkEditable *editable, const gchar *text, gint length, gint *position, gpointer data)
gchar * remmina_file_manager_get_groups(void)
-
static GtkWidget * remmina_file_editor_create_text(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
+
static GtkWidget * remmina_file_editor_create_text(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
-
static void remmina_file_editor_save_behavior_tab(RemminaFileEditor *gfe)
-
static void remmina_file_editor_create_behavior_tab(RemminaFileEditor *gfe)
+
static void remmina_file_editor_save_behavior_tab(RemminaFileEditor *gfe)
+
static void remmina_file_editor_create_behavior_tab(RemminaFileEditor *gfe)
void remmina_file_save(RemminaFile *remminafile)
-
static void remmina_file_editor_browse_resolution(GtkWidget *button, RemminaFileEditor *gfe)
-
static gboolean remmina_file_editor_validate_settings(RemminaFileEditor *gfe, gchar *setting_name_to_validate, gconstpointer value, GError **err)
-
static void remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
+
static void remmina_file_editor_browse_resolution(GtkWidget *button, RemminaFileEditor *gfe)
+
static gboolean remmina_file_editor_validate_settings(RemminaFileEditor *gfe, gchar *setting_name_to_validate, gconstpointer value, GError **err)
+
static void remmina_file_editor_ssh_tunnel_server_custom_radio_on_toggled(GtkToggleButton *togglebutton, RemminaFileEditor *gfe)
RemminaFile * remmina_file_copy(const gchar *filename)
-
static void remmina_file_editor_create_assistance(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
+
static void remmina_file_editor_create_assistance(RemminaFileEditor *gfe, const RemminaProtocolSetting *setting, GtkWidget *grid, gint row)
RemminaFile * remmina_file_manager_load_file(const gchar *filename)
-
static gboolean remmina_file_editor_iterate_protocol(gchar *protocol, RemminaPlugin *plugin, gpointer data)
-
static GError * remmina_file_editor_update(RemminaFileEditor *gfe, GtkWidget **failed_widget)
+
static gboolean remmina_file_editor_iterate_protocol(gchar *protocol, RemminaPlugin *plugin, gpointer data)
+
static GError * remmina_file_editor_update(RemminaFileEditor *gfe, GtkWidget **failed_widget)
-
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
+
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
RemminaFileEditorPriv * priv
-
static GtkWidget * remmina_file_editor_create_textarea(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
+
static GtkWidget * remmina_file_editor_create_textarea(RemminaFileEditor *gfe, GtkWidget *grid, gint row, gint col, const gchar *label, const gchar *value, gchar *setting_name)
static void remmina_file_editor_browse_avahi(GtkWidget *button, RemminaFileEditor *gfe)
gint remmina_unlock_new(GtkWindow *parent)
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)
+
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)
+
static void remmina_file_editor_save_ssh_tunnel_tab(RemminaFileEditor *gfe)
gchar * remmina_string_list_get_text(void)
diff --git a/public/remmina__file__editor_8h.html b/public/remmina__file__editor_8h.html
index ca3890473..554982706 100644
--- a/public/remmina__file__editor_8h.html
+++ b/public/remmina__file__editor_8h.html
@@ -190,7 +190,7 @@ Functions