41 #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE) 44 #include <glib/gi18n.h> 58 #define REMMINA_PLUGIN_SSH_FEATURE_TOOL_COPY 1 59 #define REMMINA_PLUGIN_SSH_FEATURE_TOOL_PASTE 2 60 #define REMMINA_PLUGIN_SSH_FEATURE_TOOL_SELECT_ALL 3 62 #define GET_PLUGIN_DATA(gp) (RemminaPluginSshData *)g_object_get_data(G_OBJECT(gp), "plugin-data"); 65 #define PALETTE_SIZE 16 75 { 0.666667, 0, 0, 1 },
76 { 0, 0.666667, 0, 1 },
77 { 0.666667, 0.333333, 0, 1 },
78 { 0, 0, 0.666667, 1 },
79 { 0.666667, 0, 0.666667, 1 },
80 { 0, 0.666667, 0.666667, 1 },
81 { 0.666667, 0.666667, 0.666667, 1 },
82 { 0.333333, 0.333333, 0.333333, 1 },
83 { 1, 0.333333, 0.333333, 1 },
84 { 0.333333, 1, 0.333333, 1 },
85 { 1, 1, 0.333333, 1 },
86 { 0.333333, 0.333333, 1, 1 },
87 { 1, 0.333333, 1, 1 },
88 { 0.333333, 1, 1, 1 },
95 { 0.305882, 0.603922, 0.023529, 1 },
96 { 0.768627, 0.627451, 0, 1 },
97 { 0.203922, 0.396078, 0.643137, 1 },
98 { 0.458824, 0.313725, 0.482353, 1 },
99 { 0.0235294, 0.596078, 0.603922, 1 },
100 { 0.827451, 0.843137, 0.811765, 1 },
101 { 0.333333, 0.341176, 0.32549, 1 },
102 { 0.937255, 0.160784, 0.160784, 1 },
103 { 0.541176, 0.886275, 0.203922, 1 },
104 { 0.988235, 0.913725, 0.309804, 1 },
105 { 0.447059, 0.623529, 0.811765, 1 },
106 { 0.678431, 0.498039, 0.658824, 1 },
107 { 0.203922, 0.886275, 0.886275, 1 },
108 { 0.933333, 0.933333, 0.92549, 1 }
112 { 0.156863, 0.156863, 0.156863, 1.000000 },
113 { 0.800000, 0.141176, 0.113725, 1.000000 },
114 { 0.596078, 0.592157, 0.101961, 1.000000 },
115 { 0.843137, 0.600000, 0.129412, 1.000000 },
116 { 0.270588, 0.521569, 0.533333, 1.000000 },
117 { 0.694118, 0.384314, 0.525490, 1.000000 },
118 { 0.407843, 0.615686, 0.415686, 1.000000 },
119 { 0.658824, 0.600000, 0.517647, 1.000000 },
120 { 0.572549, 0.513725, 0.454902, 1.000000 },
121 { 0.984314, 0.286275, 0.203922, 1.000000 },
122 { 0.721569, 0.733333, 0.149020, 1.000000 },
123 { 0.980392, 0.741176, 0.184314, 1.000000 },
124 { 0.513725, 0.647059, 0.596078, 1.000000 },
125 { 0.827451, 0.525490, 0.607843, 1.000000 },
126 { 0.556863, 0.752941, 0.486275, 1.000000 },
127 { 0.921569, 0.858824, 0.698039, 1.000000 },
131 { 0.027451, 0.211765, 0.258824, 1 },
132 { 0.862745, 0.196078, 0.184314, 1 },
133 { 0.521569, 0.600000, 0.000000, 1 },
134 { 0.709804, 0.537255, 0.000000, 1 },
135 { 0.149020, 0.545098, 0.823529, 1 },
136 { 0.827451, 0.211765, 0.509804, 1 },
137 { 0.164706, 0.631373, 0.596078, 1 },
138 { 0.933333, 0.909804, 0.835294, 1 },
139 { 0.000000, 0.168627, 0.211765, 1 },
140 { 0.796078, 0.294118, 0.086275, 1 },
141 { 0.345098, 0.431373, 0.458824, 1 },
142 { 0.396078, 0.482353, 0.513725, 1 },
143 { 0.513725, 0.580392, 0.588235, 1 },
144 { 0.423529, 0.443137, 0.768627, 1 },
145 { 0.576471, 0.631373, 0.631373, 1 },
146 { 0.992157, 0.964706, 0.890196, 1 }
150 { 0.933333, 0.909804, 0.835294, 1 },
151 { 0.862745, 0.196078, 0.184314, 1 },
152 { 0.521569, 0.600000, 0.000000, 1 },
153 { 0.709804, 0.537255, 0.000000, 1 },
154 { 0.149020, 0.545098, 0.823529, 1 },
155 { 0.827451, 0.211765, 0.509804, 1 },
156 { 0.164706, 0.631373, 0.596078, 1 },
157 { 0.027451, 0.211765, 0.258824, 1 },
158 { 0.992157, 0.964706, 0.890196, 1 },
159 { 0.796078, 0.294118, 0.086275, 1 },
160 { 0.576471, 0.631373, 0.631373, 1 },
161 { 0.513725, 0.580392, 0.588235, 1 },
162 { 0.396078, 0.482353, 0.513725, 1 },
163 { 0.423529, 0.443137, 0.768627, 1 },
164 { 0.345098, 0.431373, 0.458824, 1 },
165 { 0.000000, 0.168627, 0.211765, 1 }
170 { 0.803922, 0, 0, 1 },
171 { 0, 0.803922, 0, 1 },
172 { 0.803922, 0.803922, 0, 1 },
173 { 0.117647, 0.564706, 1, 1 },
174 { 0.803922, 0, 0.803922, 1 },
175 { 0, 0.803922, 0.803922, 1 },
176 { 0.898039, 0.898039, 0.898039, 1 },
177 { 0.298039, 0.298039, 0.298039, 1 },
181 { 0.27451, 0.509804, 0.705882, 1 },
187 #if VTE_CHECK_VERSION(0, 38, 0) 193 #define DEFAULT_PALETTE "linux_palette" 223 TRACE_CALL(__func__);
229 gboolean cont = FALSE;
233 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
236 gpdata = GET_PLUGIN_DATA(gp);
241 if (hostport == NULL) {
246 ssh = g_object_get_data(G_OBJECT(gp),
"user-data");
262 ssh = REMMINA_SSH(shell);
298 gpdata->shell =
shell;
300 gchar *charset = REMMINA_SSH(shell)->charset;
314 TRACE_CALL(__func__);
319 d->
func = FUNC_VTE_TERMINAL_SET_ENCODING_AND_PTY;
328 setlocale(LC_ALL,
"");
329 if (codeset && codeset[0] !=
'\0') {
330 #if VTE_CHECK_VERSION(0, 38, 0) 331 vte_terminal_set_encoding(terminal, codeset, NULL);
333 vte_terminal_set_emulation(terminal,
"xterm");
334 vte_terminal_set_encoding(terminal, codeset);
338 vte_terminal_set_backspace_binding(terminal, VTE_ERASE_ASCII_DELETE);
339 vte_terminal_set_delete_binding(terminal, VTE_ERASE_DELETE_SEQUENCE);
341 #if VTE_CHECK_VERSION(0, 38, 0) 343 vte_terminal_set_pty(terminal, vte_pty_new_foreign_sync(master, NULL, NULL));
345 vte_terminal_set_pty(terminal, master);
352 TRACE_CALL(__func__);
355 gtk_widget_grab_focus(gpdata->
vte);
362 TRACE_CALL(__func__);
366 if (!gtk_widget_get_mapped(widget))
return FALSE;
368 cols = vte_terminal_get_column_count(VTE_TERMINAL(widget));
369 rows = vte_terminal_get_row_count(VTE_TERMINAL(widget));
380 TRACE_CALL(__func__);
385 if (remmina_plugin_service->
file_get_int(remminafile,
"audiblebell", FALSE)) {
386 vte_terminal_set_audible_bell(VTE_TERMINAL(gpdata->
vte), TRUE);
387 g_info(
"audible_bell set to %i", vte_terminal_get_audible_bell(VTE_TERMINAL(gpdata->
vte)));
390 #if !VTE_CHECK_VERSION(0, 38, 0) 393 vte_terminal_set_font(VTE_TERMINAL(gpdata->
vte),
405 TRACE_CALL(__func__);
406 vte_terminal_select_all(VTE_TERMINAL(vte));
413 TRACE_CALL(__func__);
414 #if VTE_CHECK_VERSION(0, 50, 0) 415 vte_terminal_copy_clipboard_format(VTE_TERMINAL(vte), VTE_FORMAT_TEXT);
417 vte_terminal_copy_clipboard(VTE_TERMINAL(vte));
424 TRACE_CALL(__func__);
425 vte_terminal_paste_clipboard(VTE_TERMINAL(vte));
431 TRACE_CALL(__func__);
437 GFileOutputStream *stream = g_file_replace(gpdata->
vte_session_file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, &err);
441 widget = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
442 _(
"Error: %s"), err->message);
443 g_signal_connect(G_OBJECT(widget),
"response", G_CALLBACK(gtk_widget_destroy), NULL);
444 gtk_widget_show(widget);
449 #if VTE_CHECK_VERSION(0, 38, 0) 450 vte_terminal_write_contents_sync(VTE_TERMINAL(gpdata->
vte), G_OUTPUT_STREAM(stream),
451 VTE_WRITE_DEFAULT, NULL, &err);
453 vte_terminal_write_contents(VTE_TERMINAL(gpdata->
vte), G_OUTPUT_STREAM(stream),
454 VTE_TERMINAL_WRITE_DEFAULT, NULL, &err);
459 _(
"Terminal content saved in"),
463 g_object_unref(stream);
470 TRACE_CALL(__func__);
473 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
480 if ((event->type == GDK_BUTTON_PRESS) && (((GdkEventButton *)event)->button == 3)) {
481 #if GTK_CHECK_VERSION(3, 22, 0) 482 gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL);
484 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
485 ((GdkEventButton *)event)->button, gtk_get_current_event_time());
508 TRACE_CALL(__func__);
511 GtkWidget *menu = gtk_menu_new();
513 GtkWidget *select_all = gtk_menu_item_new_with_label(_(
"Select All (Host + A)"));
514 GtkWidget *copy = gtk_menu_item_new_with_label(_(
"Copy (host + C)"));
515 GtkWidget *paste = gtk_menu_item_new_with_label(_(
"Paste (host + V)"));
516 GtkWidget *save = gtk_menu_item_new_with_label(_(
"Save session to file"));
518 gtk_menu_shell_append(GTK_MENU_SHELL(menu), select_all);
519 gtk_menu_shell_append(GTK_MENU_SHELL(menu), copy);
520 gtk_menu_shell_append(GTK_MENU_SHELL(menu), paste);
521 gtk_menu_shell_append(GTK_MENU_SHELL(menu), save);
523 g_signal_connect(G_OBJECT(gpdata->
vte),
"button_press_event",
526 g_signal_connect(G_OBJECT(select_all),
"activate",
528 g_signal_connect(G_OBJECT(copy),
"activate",
530 g_signal_connect(G_OBJECT(paste),
"activate",
532 g_signal_connect(G_OBJECT(save),
"activate",
535 gtk_widget_show_all(menu);
553 TRACE_CALL(__func__);
557 GtkAdjustment *vadjustment;
558 GtkWidget *vscrollbar;
560 GdkRGBA foreground_color;
561 GdkRGBA background_color;
564 #if !VTE_CHECK_VERSION(0, 38, 0) 565 GdkColor foreground_gdkcolor;
566 GdkColor background_gdkcolor;
570 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
572 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
573 gtk_widget_show(hbox);
574 gtk_container_add(GTK_CONTAINER(gp), hbox);
577 vte = vte_terminal_new();
578 gtk_widget_show(vte);
579 vte_terminal_set_size(VTE_TERMINAL(vte), 80, 25);
580 vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(vte), TRUE);
581 #if !VTE_CHECK_VERSION(0, 38, 0) 587 #if VTE_CHECK_VERSION(0, 38, 0) 588 GdkRGBA cp[PALETTE_SIZE];
589 GdkRGBA cursor_color;
597 const gchar *color_name = remmina_plugin_service->
file_get_string(remminafile,
"ssh_color_scheme");
599 gchar *remmina_dir = g_build_path(
"/", g_get_user_config_dir(),
"remmina",
"theme", NULL);
606 if (!g_file_test(remmina_colors_file, G_FILE_TEST_IS_REGULAR)) {
607 GError *error = NULL;
608 const gchar *
const *dirs = g_get_system_data_dirs();
611 for (i = 0; dirs[i] != NULL; ++i) {
612 remmina_dir = g_build_path(
"/", dirs[i],
"remmina",
"theme", NULL);
613 GDir *system_data_dir = g_dir_open(remmina_dir, 0, &error);
619 if (system_data_dir) {
620 g_dir_close(system_data_dir);
621 g_free(remmina_colors_file);
622 remmina_colors_file = g_strdup_printf(
"%s/%s.colors", remmina_dir, color_name);
623 if (g_file_test(remmina_colors_file, G_FILE_TEST_IS_REGULAR))
631 if (g_file_test(remmina_colors_file, G_FILE_TEST_IS_REGULAR)) {
635 gkeyfile = g_key_file_new();
636 g_key_file_load_from_file(gkeyfile, remmina_colors_file, G_KEY_FILE_NONE, NULL);
639 gdk_rgba_parse(&foreground_color, color_pref.
foreground);
640 gdk_rgba_parse(&background_color, color_pref.
background);
641 gdk_rgba_parse(&cursor_color, color_pref.
cursor);
643 gdk_rgba_parse(&cp[0], color_pref.
color0);
644 gdk_rgba_parse(&cp[1], color_pref.
color1);
645 gdk_rgba_parse(&cp[2], color_pref.
color2);
646 gdk_rgba_parse(&cp[3], color_pref.
color3);
647 gdk_rgba_parse(&cp[4], color_pref.
color4);
648 gdk_rgba_parse(&cp[5], color_pref.
color5);
649 gdk_rgba_parse(&cp[6], color_pref.
color6);
650 gdk_rgba_parse(&cp[7], color_pref.
color7);
651 gdk_rgba_parse(&cp[8], color_pref.
color8);
652 gdk_rgba_parse(&cp[9], color_pref.
color9);
653 gdk_rgba_parse(&cp[10], color_pref.
color10);
654 gdk_rgba_parse(&cp[11], color_pref.
color11);
655 gdk_rgba_parse(&cp[12], color_pref.
color12);
656 gdk_rgba_parse(&cp[13], color_pref.
color13);
657 gdk_rgba_parse(&cp[14], color_pref.
color14);
658 gdk_rgba_parse(&cp[15], color_pref.
color15);
660 const GdkRGBA custom_palette[PALETTE_SIZE] = {
661 cp[0], cp[1], cp[2], cp[3],
662 cp[4], cp[5], cp[6], cp[7],
663 cp[8], cp[9], cp[10], cp[11],
664 cp[12], cp[13], cp[14], cp[15]
670 switch (remmina_plugin_service->
file_get_int(remminafile,
"ssh_color_scheme", FALSE)) {
672 gdk_rgba_parse(&foreground_color,
"#ffffff");
673 gdk_rgba_parse(&background_color,
"#000000");
674 gdk_rgba_parse(&cursor_color,
"#ffffff");
678 gdk_rgba_parse(&foreground_color,
"#eeeeec");
679 gdk_rgba_parse(&background_color,
"#2e3436");
680 gdk_rgba_parse(&cursor_color,
"#8ae234");
684 gdk_rgba_parse(&foreground_color,
"#ebdbb2");
685 gdk_rgba_parse(&background_color,
"#282828");
686 gdk_rgba_parse(&cursor_color,
"#d3869b");
690 gdk_rgba_parse(&foreground_color,
"#839496");
691 gdk_rgba_parse(&background_color,
"#002b36");
692 gdk_rgba_parse(&cursor_color,
"#93a1a1");
696 gdk_rgba_parse(&foreground_color,
"#657b83");
697 gdk_rgba_parse(&background_color,
"#fdf6e3");
698 gdk_rgba_parse(&cursor_color,
"#586e75");
702 gdk_rgba_parse(&foreground_color,
"#000000");
703 gdk_rgba_parse(&background_color,
"#ffffff");
704 gdk_rgba_parse(&cursor_color,
"#000000");
729 const GdkRGBA custom_palette[PALETTE_SIZE] = {
730 cp[0], cp[1], cp[2], cp[3],
731 cp[4], cp[5], cp[6], cp[7],
732 cp[8], cp[9], cp[10], cp[11],
733 cp[12], cp[13], cp[14], cp[15]
743 g_free(remmina_colors_file);
744 vte_terminal_set_colors(VTE_TERMINAL(vte), &foreground_color, &background_color,
remminavte.palette, PALETTE_SIZE);
745 vte_terminal_set_color_foreground(VTE_TERMINAL(vte), &foreground_color);
746 vte_terminal_set_color_background(VTE_TERMINAL(vte), &background_color);
747 vte_terminal_set_color_cursor(VTE_TERMINAL(vte), &cursor_color);
750 foreground_gdkcolor.red = (guint16)(foreground_color.red * 0xFFFF);
751 foreground_gdkcolor.green = (guint16)(foreground_color.green * 0xFFFF);
752 foreground_gdkcolor.blue = (guint16)(foreground_color.blue * 0xFFFF);
753 background_gdkcolor.red = (guint16)(background_color.red * 0xFFFF);
754 background_gdkcolor.green = (guint16)(background_color.green * 0xFFFF);
755 background_gdkcolor.blue = (guint16)(background_color.blue * 0xFFFF);
757 vte_terminal_set_colors(VTE_TERMINAL(vte), &foreground_gdkcolor, &background_gdkcolor, NULL, 0);
760 gtk_box_pack_start(GTK_BOX(hbox), vte, TRUE, TRUE, 0);
767 #if VTE_CHECK_VERSION(0, 28, 0) 768 vadjustment = gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(vte));
770 vadjustment = vte_terminal_get_adjustment(VTE_TERMINAL(vc->vte.terminal));
773 vscrollbar = gtk_scrollbar_new(GTK_ORIENTATION_VERTICAL, vadjustment);
775 gtk_widget_show(vscrollbar);
776 gtk_box_pack_start(GTK_BOX(hbox), vscrollbar, FALSE, TRUE, 0);
779 const gchar *sshlogname;
783 rf = g_file_new_for_path(remminafile->filename);
785 if (remmina_plugin_service->
file_get_string(remminafile,
"sshlogfolder") == NULL)
786 dir = g_build_path(
"/", g_get_user_cache_dir(),
"remmina", NULL);
788 dir = remmina_plugin_service->
file_get_string(remminafile,
"sshlogfolder");
790 if (remmina_plugin_service->
file_get_string(remminafile,
"sshlogname") == NULL)
791 sshlogname = g_strconcat(g_file_get_basename(rf),
".",
"log", NULL);
793 sshlogname = remmina_plugin_service->
file_get_string(remminafile,
"sshlogname");
797 fp = g_strconcat(dir,
"/", sshlogname, NULL);
813 TRACE_CALL(__func__);
822 "Failed to initialize pthread. Falling back to non-thread mode…");
834 TRACE_CALL(__func__);
844 pthread_cancel(gpdata->
thread);
849 gpdata->
shell = NULL;
864 TRACE_CALL(__func__);
887 TRACE_CALL(__func__);
890 switch (feature->
id) {
891 case REMMINA_PROTOCOL_FEATURE_TOOL_SSH:
894 NULL, gpdata->
shell, NULL);
896 case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP:
900 NULL, gpdata->
shell, NULL);
902 case REMMINA_PLUGIN_SSH_FEATURE_TOOL_COPY:
903 #if VTE_CHECK_VERSION(0, 50, 0) 904 vte_terminal_copy_clipboard_format(VTE_TERMINAL(gpdata->
vte), VTE_FORMAT_TEXT);
906 vte_terminal_copy_clipboard(VTE_TERMINAL(gpdata->
vte));
909 case REMMINA_PLUGIN_SSH_FEATURE_TOOL_PASTE:
910 vte_terminal_paste_clipboard(VTE_TERMINAL(gpdata->
vte));
912 case REMMINA_PLUGIN_SSH_FEATURE_TOOL_SELECT_ALL:
913 vte_terminal_select_all(VTE_TERMINAL(gpdata->
vte));
922 "1",
N_(
"SSH identity file"),
923 "2",
N_(
"SSH agent"),
924 "3",
N_(
"Public key (automatic)"),
925 "4",
N_(
"Kerberos (GSSAPI)"),
987 "3",
"Solarized Dark",
988 "4",
"Solarized Light",
990 "6",
"Custom (Configured in Remmina preferences)",
1030 N_(
"The filename can use the following placeholders:\n\n" 1031 " • %h is substituted with the server name\n" 1032 " • %t is substituted with the SSH server name\n" 1033 " • %u is substituted with the username\n" 1034 " • %U is substituted with the SSH username\n" 1035 " • %p is substituted with Remmina profile name\n" 1036 " • %g is substituted with Remmina profile group name\n" 1037 " • %d is substituted with local datetime in iso8601 format\n");
1078 N_(
"SSH - Secure Shell"),
1081 "remmina-ssh-symbolic",
1082 "remmina-ssh-symbolic",
1105 return strcmp((gchar *)a, (gchar *)b);
1113 GError *error = NULL;
1114 GList *files = NULL;
1115 unsigned int rec_size = 0;
1120 const gchar *
const *dirs = g_get_system_data_dirs();
1124 for (i = 0; dirs[i] != NULL; ++i) {
1125 GDir *system_data_dir = NULL;
1126 gchar *remmina_dir = g_build_path(
"/", dirs[i],
"remmina",
"theme", NULL);
1127 system_data_dir = g_dir_open(remmina_dir, 0, &error);
1128 g_free(remmina_dir);
1131 g_error_free(error);
1134 if (system_data_dir) {
1135 const gchar *filename;
1136 while ((filename = g_dir_read_name(system_data_dir))) {
1137 if (!g_file_test(filename, G_FILE_TEST_IS_DIR)) {
1138 if (g_str_has_suffix(filename,
".colors")) {
1139 gsize len = strrchr(filename,
'.') - filename;
1140 gchar *menu_str = g_strndup(filename, len);
1141 if (g_list_find_custom(files, menu_str,
compare) == NULL)
1142 files = g_list_insert_sorted(files, menu_str,
compare);
1151 gchar *remmina_dir = g_build_path(
"/", g_get_user_config_dir(),
"remmina",
"theme", NULL);
1152 GDir *user_data_dir;
1153 user_data_dir = g_dir_open(remmina_dir, 0, &error);
1154 g_free(remmina_dir);
1156 g_error_free(error);
1159 if (user_data_dir) {
1160 const gchar *filename;
1161 while ((filename = g_dir_read_name(user_data_dir))) {
1162 if (!g_file_test(filename, G_FILE_TEST_IS_DIR)) {
1163 if (g_str_has_suffix(filename,
".colors")) {
1164 char *menu_str = g_malloc(strlen(filename) + 1);
1165 strcpy(menu_str, filename);
1166 char *t2 = strrchr(menu_str,
'.');
1168 if (g_list_find_custom(files, menu_str,
compare) == NULL)
1169 files = g_list_insert_sorted(files, menu_str,
compare);
1176 rec_size = g_list_length(files) * 2;
1178 gpointer *color_palette = g_malloc((preset_rec_size + rec_size) *
sizeof(gpointer));
1180 unsigned int field_idx = 0;
1181 *ssh_terminal_palette_new = color_palette;
1183 for (; field_idx < preset_rec_size; field_idx++) {
1185 if (!color_palette[field_idx])
1189 GList *l_files = NULL;
1190 for (l_files = g_list_first(files); l_files != NULL; l_files = l_files->next) {
1191 gchar *menu_str = (gchar *)l_files->data;
1193 color_palette[field_idx++] = menu_str;
1194 color_palette[field_idx++] = menu_str;
1198 color_palette[field_idx] = NULL;
1204 TRACE_CALL(__func__);
1215 settings = g_memdup(remmina_ssh_advanced_settings,
sizeof(remmina_ssh_advanced_settings));
1218 gpointer ssh_terminal_palette_new = NULL;
1222 settings[0].
opt1 = ssh_terminal_palette_new;
1227 ssh_threads_set_callbacks(ssh_threads_get_pthread());
1235 TRACE_CALL(__func__);
enum remmina_ssh_auth_result remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *remminafile)
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
RemminaSSHShell * remmina_ssh_shell_new_from_ssh(RemminaSSH *ssh)
void remmina_public_send_notification(const gchar *notification_id, const gchar *notification_title, const gchar *notification_message)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
RemminaFile * remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol)
void(* protocol_plugin_set_width)(RemminaProtocolWidget *gp, gint width)
struct _RemminaPluginSshData RemminaPluginSshData
The SSH plugin implementation.
static gboolean remmina_plugin_ssh_close_connection(RemminaProtocolWidget *gp)
guint vte_shortcutkey_copy
enum remmina_masterthread_exec_data::@10 func
const GdkRGBA tango_palette[PALETTE_SIZE]
const GdkRGBA solarized_light_palette[PALETTE_SIZE]
void(* protocol_plugin_send_keys_signals)(GtkWidget *widget, const guint *keyvals, int length, GdkEventType action)
void(* protocol_plugin_signal_connection_closed)(RemminaProtocolWidget *gp)
struct remmina_masterthread_exec_data::@11::@24 vte_terminal_set_encoding_and_pty
void remmina_plugin_ssh_vte_terminal_set_encoding_and_pty(VteTerminal *terminal, const char *codeset, int master, int slave)
guint vte_shortcutkey_select_all
static RemminaProtocolFeature remmina_plugin_ssh_features[]
Array for available features.
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
static gpointer ssh_charset_list[]
Charset list.
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
gboolean vte_allow_bold_text
static gboolean remmina_plugin_ssh_open_connection(RemminaProtocolWidget *gp)
Initialize the main window properties and the pthread.
void(* protocol_plugin_signal_connection_opened)(RemminaProtocolWidget *gp)
gchar * remmina_file_format_properties(RemminaFile *remminafile, const gchar *setting)
void remmina_debug(const gchar *fmt,...)
Print a string in the Remmina Debug Windows and in the terminal.
static gboolean remmina_plugin_ssh_on_size_allocate(GtkWidget *widget, GtkAllocation *alloc, RemminaProtocolWidget *gp)
void remmina_ssh_shell_free(RemminaSSHShell *shell)
const GdkRGBA gruvbox_palette[PALETTE_SIZE]
void remmina_ssh_plugin_register(void)
gboolean(* register_plugin)(RemminaPlugin *plugin)
gboolean remmina_masterthread_exec_is_main_thread()
static const RemminaProtocolSetting remmina_ssh_basic_settings[]
Array of RemminaProtocolSetting for basic settings.
RemminaPluginService remmina_plugin_manager_service
union remmina_masterthread_exec_data::@11 p
static gint compare(gconstpointer a, gconstpointer b)
gboolean remmina_ssh_plugin_popup_menu(GtkWidget *widget, GdkEvent *event, GtkWidget *menu)
static RemminaPluginService * remmina_plugin_service
gint tunnel_entrance_port
RemminaSSHShell * remmina_ssh_shell_new_from_file(RemminaFile *remminafile)
void remmina_plugin_ssh_popup_ui(RemminaProtocolWidget *gp)
Remmina SSH plugin terminal popup menu.
void remmina_plugin_ssh_vte_save_session(GtkMenuItem *menuitem, RemminaProtocolWidget *gp)
guint vte_shortcutkey_paste
static void remmina_plugin_ssh_init(RemminaProtocolWidget *gp)
Remmina SSH plugin initialization.
static struct @36 remminavte
static RemminaProtocolPlugin remmina_plugin_ssh
SSH Protocol plugin definition and features.
static void remmina_plugin_ssh_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
Functions to call when an entry in the Tool menu in the Remmina Connection Window is clicked...
void remmina_plugin_ssh_vte_select_all(GtkMenuItem *menuitem, gpointer vte)
void remmina_ssh_plugin_load_terminal_palettes(gpointer *ssh_terminal_palette_new)
void(* protocol_plugin_set_expand)(RemminaProtocolWidget *gp, gboolean expand)
static gpointer ssh_terminal_palette[]
gboolean remmina_ssh_shell_open(RemminaSSHShell *shell, RemminaSSHExitFunc exit_callback, gpointer data)
gchar * tunnel_entrance_host
void remmina_masterthread_exec_and_wait(RemminaMTExecData *d)
RemminaFile *(* protocol_plugin_get_file)(RemminaProtocolWidget *gp)
void remmina_plugin_ssh_vte_paste_clipboard(GtkMenuItem *menuitem, gpointer vte)
static gboolean remmina_plugin_ssh_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
Not used by the plugin.
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
const GdkRGBA xterm_palette[PALETTE_SIZE]
const GdkRGBA linux_palette[PALETTE_SIZE]
16 color palettes in GdkRGBA format (red, green, blue, alpha).
static gpointer ssh_auth[]
Array of key/value pairs for SSH auth type.
gchar * remmina_colors_file
void(* protocol_plugin_register_hostkey)(RemminaProtocolWidget *gp, GtkWidget *widget)
static gpointer remmina_plugin_ssh_main_thread(gpointer data)
Remmina protocol plugin main function.
const RemminaProtocolSetting * advanced_settings
const GdkRGBA solarized_dark_palette[PALETTE_SIZE]
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
static gboolean remmina_plugin_ssh_on_focus_in(GtkWidget *widget, GdkEventFocus *event, RemminaProtocolWidget *gp)
void remmina_plugin_ssh_vte_copy_clipboard(GtkMenuItem *menuitem, gpointer vte)
void(* RemminaSSHExitFunc)(gpointer data)
gchar *(* protocol_plugin_start_direct_tunnel)(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
The SSH plugin implementation.
GtkWidget *(* open_connection)(RemminaFile *remminafile, GCallback disconnect_cb, gpointer data, guint *handler)
static void remmina_plugin_ssh_set_vte_pref(RemminaProtocolWidget *gp)
static void remmina_ssh_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
Send a keystroke to the plugin window.
static const RemminaProtocolSetting remmina_ssh_advanced_settings[]
Array of RemminaProtocolSetting for advanced settings.
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
RemminaColorPref color_pref
void remmina_pref_file_load_colors(GKeyFile *gkeyfile, RemminaColorPref *color_pref)
void remmina_ssh_shell_set_size(RemminaSSHShell *shell, gint columns, gint rows)
N_("Unable to connect to VNC server")
gboolean remmina_ssh_init_session(RemminaSSH *ssh)
enum remmina_ssh_auth_result remmina_ssh_auth(RemminaSSH *ssh, const gchar *password, RemminaProtocolWidget *gp, RemminaFile *remminafile)