41 #include <glib/gi18n.h> 56 #ifdef GDK_WINDOWING_WAYLAND 57 #include <gdk/gdkwayland.h> 116 DESKTOP_RESIZE_SIGNAL,
119 UNLOCK_DYNRES_SIGNAL,
133 TRACE_CALL(__func__);
136 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
139 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
142 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
145 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
148 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
151 g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
157 TRACE_CALL(__func__);
165 REMMINA_DEBUG(
"LibSSH support turned off, no need to free SSH tunnel data");
175 TRACE_CALL(__func__);
220 TRACE_CALL(__func__);
223 child = gtk_bin_get_child(GTK_BIN(gp));
226 gtk_widget_set_can_focus(child, TRUE);
227 gtk_widget_grab_focus(child);
233 TRACE_CALL(__func__);
247 TRACE_CALL(__func__);
250 REMMINA_DEBUG(
"Opening connection");
271 if (num_plugin + num_ssh == 0) {
278 feature += num_plugin;
281 REMMINA_DEBUG(
"Have SSH");
284 feature->
id = REMMINA_PROTOCOL_FEATURE_TOOL_SSH;
285 feature->
opt1 = _(
"Connect via SSH from a new terminal");
287 feature->
opt2 =
"utilities-terminal";
289 feature->
opt3 = NULL;
294 feature->
id = REMMINA_PROTOCOL_FEATURE_TOOL_SFTP;
295 feature->
opt1 = _(
"Open SFTP transfer…");
297 feature->
opt2 =
"folder-remote";
299 feature->
opt3 = NULL;
320 TRACE_CALL(__func__);
323 RemminaMessagePanel *mp;
335 s = g_strdup_printf(_(
"Connecting to “%s”…"), (name ? name :
"*"));
347 TRACE_CALL(__func__);
357 g_signal_emit_by_name(G_OBJECT(gp),
"disconnect");
358 return G_SOURCE_REMOVE;
364 TRACE_CALL(__func__);
368 const char* msg =
"Plugin Disconnected";
377 return G_SOURCE_REMOVE;
390 TRACE_CALL(__func__);
397 TRACE_CALL(__func__);
418 g_signal_emit_by_name(G_OBJECT(gp),
"connect");
419 return G_SOURCE_REMOVE;
426 TRACE_CALL(__func__);
432 TRACE_CALL(__func__);
435 g_signal_emit_by_name(G_OBJECT(gp),
"update-align");
436 return G_SOURCE_REMOVE;
442 TRACE_CALL(__func__);
448 TRACE_CALL(__func__);
451 g_signal_emit_by_name(G_OBJECT(gp),
"lock-dynres");
452 return G_SOURCE_REMOVE;
457 TRACE_CALL(__func__);
460 g_signal_emit_by_name(G_OBJECT(gp),
"unlock-dynres");
461 return G_SOURCE_REMOVE;
467 TRACE_CALL(__func__);
474 TRACE_CALL(__func__);
480 TRACE_CALL(__func__);
483 g_signal_emit_by_name(G_OBJECT(gp),
"desktop-resize");
484 return G_SOURCE_REMOVE;
490 TRACE_CALL(__func__);
497 TRACE_CALL(__func__);
502 if (!GTK_IS_WIDGET(gp))
516 g_signal_emit_by_name(G_OBJECT(gp),
"disconnect");
541 TRACE_CALL(__func__);
542 gchar *keystrokes = g_object_get_data(G_OBJECT(widget),
"keystrokes");
545 GdkKeymap *keymap = gdk_keymap_get_for_display(gdk_display_get_default());
552 typedef struct _KeystrokeReplace {
558 KeystrokeReplace keystrokes_replaces[] =
560 {
"\\n",
"\n", GDK_KEY_Return },
561 {
"\\t",
"\t", GDK_KEY_Tab },
562 {
"\\b",
"\b", GDK_KEY_BackSpace },
563 {
"\\e",
"\e", GDK_KEY_Escape },
564 {
"\\\\",
"\\", GDK_KEY_backslash },
571 for (i = 0; keystrokes_replaces[i].replace; i++) {
572 REMMINA_DEBUG(
"Keystrokes before replacement is \'%s\'", keystrokes);
574 keystrokes_replaces[i].search,
575 keystrokes_replaces[i].replace));
576 REMMINA_DEBUG(
"Keystrokes after replacement is \'%s\'", keystrokes);
578 gchar *iter = g_strdup(keystrokes);
579 keyvals = (guint *)g_malloc(strlen(keystrokes));
582 character = g_utf8_get_char_validated(iter, -1);
585 keyval = gdk_unicode_to_keyval(character);
587 for (i = 0; keystrokes_replaces[i].replace; i++) {
588 if (character == keystrokes_replaces[i].replace[0]) {
589 keys = g_new0(GdkKeymapKey, 1);
590 keyval = keystrokes_replaces[i].keyval;
599 if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) {
600 g_warning(
"keyval 0x%04x has no keycode!", keyval);
601 iter = g_utf8_find_next_char(iter, NULL);
608 keyvals[n_keys++] = GDK_KEY_Shift_L;
610 keyvals[n_keys++] = GDK_KEY_Alt_R;
611 keyvals[n_keys++] = keyval;
616 iter = g_utf8_find_next_char(iter, NULL);
632 TRACE_CALL(__func__);
634 gchar *text = g_utf8_normalize(clip_text, -1, G_NORMALIZE_DEFAULT_COMPOSE);
637 GdkKeymap *keymap = gdk_keymap_get_for_display(gdk_display_get_default());
644 typedef struct _KeystrokeReplace {
650 KeystrokeReplace text_replaces[] =
652 {
"\\n",
"\n", GDK_KEY_Return },
653 {
"\\t",
"\t", GDK_KEY_Tab },
654 {
"\\b",
"\b", GDK_KEY_BackSpace },
655 {
"\\e",
"\e", GDK_KEY_Escape },
656 {
"\\\\",
"\\", GDK_KEY_backslash },
663 for (i = 0; text_replaces[i].replace; i++) {
664 REMMINA_DEBUG(
"Text clipboard before replacement is \'%s\'", text);
666 text_replaces[i].search,
667 text_replaces[i].replace));
668 REMMINA_DEBUG(
"Text clipboard after replacement is \'%s\'", text);
670 gchar *iter = g_strdup(text);
671 REMMINA_DEBUG(
"Iter: %s", iter),
672 keyvals = (guint *)g_malloc(strlen(text));
675 character = g_utf8_get_char_validated(iter, -1);
676 REMMINA_DEBUG(
"Char: U+%04" G_GINT32_FORMAT
"X", character);
679 keyval = gdk_unicode_to_keyval(character);
680 REMMINA_DEBUG(
"Keyval: %u", keyval);
682 for (i = 0; text_replaces[i].replace; i++) {
683 if (character == text_replaces[i].replace[0]) {
684 keys = g_new0(GdkKeymapKey, 1);
685 keyval = text_replaces[i].keyval;
686 REMMINA_DEBUG(
"Special Keyval: %u", keyval);
695 if (!gdk_keymap_get_entries_for_keyval(keymap, keyval, &keys, &n_keys)) {
696 REMMINA_WARNING(
"keyval 0x%04x has no keycode!", keyval);
697 iter = g_utf8_find_next_char(iter, NULL);
704 keyvals[n_keys++] = GDK_KEY_Shift_L;
706 keyvals[n_keys++] = GDK_KEY_Alt_R;
712 keyvals[n_keys++] = keyval;
717 iter = g_utf8_find_next_char(iter, NULL);
728 TRACE_CALL(__func__);
729 GtkClipboard *clipboard;
731 clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
736 gtk_clipboard_request_text(clipboard,
742 TRACE_CALL(__func__);
744 REMMINA_DEBUG(
"plugin screenshot function is not implemented, using core Remmina functionality");
753 TRACE_CALL(__func__);
755 REMMINA_DEBUG(
"Map plugin function not implemented");
759 REMMINA_DEBUG(
"Calling plugin mapping function");
765 TRACE_CALL(__func__);
767 REMMINA_DEBUG(
"Unmap plugin function not implemented");
771 REMMINA_DEBUG(
"Calling plugin unmapping function");
777 TRACE_CALL(__func__);
779 REMMINA_DEBUG(
"Emitting signals should be used from the object itself, not from another object");
786 d->
func = FUNC_PROTOCOLWIDGET_EMIT_SIGNAL;
793 g_signal_emit_by_name(G_OBJECT(gp), signal_name);
798 TRACE_CALL(__func__);
804 TRACE_CALL(__func__);
814 if (feature->
type == type)
821 TRACE_CALL(__func__);
827 TRACE_CALL(__func__);
831 if (feature->
type == type && (
id == 0 || feature->
id ==
id)) {
840 TRACE_CALL(__func__);
841 switch (feature->
id) {
843 case REMMINA_PROTOCOL_FEATURE_TOOL_SSH:
852 case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP:
869 TRACE_CALL(__func__);
877 TRACE_CALL(__func__);
886 TRACE_CALL(__func__);
893 TRACE_CALL(__func__);
899 RemminaMessagePanel *mp;
905 d->
func = FUNC_PROTOCOLWIDGET_MPPROGRESS;
928 d->
func = FUNC_PROTOCOLWIDGET_MPDESTROY;
941 printf(
"Remmina: Cancelling an opening tunnel is not implemented\n");
946 TRACE_CALL(__func__);
950 RemminaMessagePanel *mp;
951 gboolean partial = FALSE;
952 gboolean cont = FALSE;
956 REMMINA_DEBUG(
"Creating SSH tunnel to “%s” via SSH…", REMMINA_SSH(tunnel)->server);
958 msg = g_strdup_printf(_(
"Connecting to “%s” via SSH…"), REMMINA_SSH(tunnel)->server);
968 REMMINA_DEBUG(
"SSH Tunnel init session error: %s", REMMINA_SSH(tunnel)->error);
976 REMMINA_DEBUG(
"Tunnel auth returned %d", ret);
979 REMMINA_DEBUG(
"Authentication success");
982 REMMINA_DEBUG(
"Continue with the next auth method");
988 REMMINA_DEBUG(
"Reconnecting…");
989 if (REMMINA_SSH(tunnel)->session) {
990 ssh_disconnect(REMMINA_SSH(tunnel)->session);
991 ssh_free(REMMINA_SSH(tunnel)->session);
992 REMMINA_SSH(tunnel)->session = NULL;
994 g_free(REMMINA_SSH(tunnel)->callback);
999 REMMINA_DEBUG(
"Interrupted by the user");
1004 REMMINA_DEBUG(
"Error during the authentication: %s", REMMINA_SSH(tunnel)->error);
1018 REMMINA_DEBUG(
"Cannot init SSH session with tunnel struct");
1025 REMMINA_DEBUG(
"Tunnel auth returned %d", ret);
1050 printf(
"Remmina: Cancelling start_direct_tunnel is not implemented\n");
1055 TRACE_CALL(__func__);
1059 #if GLIB_CHECK_VERSION(2, 54, 0) 1060 gboolean found = g_ptr_array_find(gp->
priv->
ssh_tunnels, tunnel, &idx);
1063 gboolean found = FALSE;
1072 printf(
"Tunnel %s found at idx = %d\n", found ?
"yes":
"not", idx);
1076 REMMINA_DEBUG(
"[Tunnel with idx %u has been disconnected", idx);
1091 TRACE_CALL(__func__);
1092 const gchar *server;
1093 const gchar *ssh_tunnel_server;
1094 gchar *ssh_tunnel_host, *srv_host, *dest;
1095 gint srv_port, ssh_tunnel_port = 0;
1097 REMMINA_DEBUG(
"SSH tunnel initialization…");
1103 return g_strdup(
"");
1105 if (strstr(g_strdup(server),
"unix:///") != NULL) {
1106 REMMINA_DEBUG(
"%s is a UNIX socket", server);
1107 return g_strdup(server);
1110 REMMINA_DEBUG(
"Calling remmina_public_get_server_port");
1112 REMMINA_DEBUG(
"Calling remmina_public_get_server_port (tunnel)");
1114 REMMINA_DEBUG(
"server: %s, port: %d", srv_host, srv_port);
1116 if (port_plus && srv_port < 100)
1118 srv_port += default_port;
1122 RemminaMessagePanel *mp;
1126 dest = g_strdup_printf(
"[%s]:%i", srv_host, srv_port);
1128 g_free(ssh_tunnel_host);
1135 g_free(ssh_tunnel_host);
1136 REMMINA_DEBUG(
"remmina_protocol_widget_init_tunnel failed with error is %s",
1142 msg = g_strdup_printf(_(
"Connecting to “%s” via SSH…"), server);
1148 g_free(ssh_tunnel_host);
1149 ssh_tunnel_host = NULL;
1150 srv_host = g_strdup(
"127.0.0.1");
1153 REMMINA_DEBUG(
"Starting tunnel to: %s, port: %d", ssh_tunnel_host, ssh_tunnel_port);
1156 g_free(ssh_tunnel_host);
1162 g_free(ssh_tunnel_host);
1175 dest = g_strdup_printf(
"[%s]:%i", srv_host, srv_port);
1177 g_free(ssh_tunnel_host);
1186 printf(
"Remmina: Cancelling start_reverse_tunnel is not implemented\n");
1193 TRACE_CALL(__func__);
1196 RemminaMessagePanel *mp;
1224 TRACE_CALL(__func__);
1227 ssh_channel channel;
1229 gboolean ret = FALSE;
1238 if ((channel = ssh_channel_new(REMMINA_SSH(tunnel)->session)) == NULL)
1241 va_start(args, fmt);
1242 cmd = g_strdup_vprintf(fmt, args);
1245 if (ssh_channel_open_session(channel) == SSH_OK &&
1246 ssh_channel_request_exec(channel, cmd) == SSH_OK) {
1248 ssh_channel_send_eof(channel);
1249 status = ssh_channel_get_exit_status(channel);
1250 ptr = strchr(cmd,
' ');
1251 if (ptr) *ptr =
'\0';
1259 _(
"The “%s” command is not available on the SSH server."), cmd);
1264 _(
"Could not run the “%s” command on the SSH server (status = %i)."), cmd, status);
1276 ssh_channel_close(channel);
1277 ssh_channel_free(channel);
1290 TRACE_CALL(__func__);
1296 REMMINA_DEBUG(
"Calling remmina_public_get_server_port");
1307 TRACE_CALL(__func__);
1313 TRACE_CALL(__func__);
1316 if (REMMINA_SSH(tunnel)->error)
1326 printf(
"Remmina: Cancelling an XPort connection is not implemented\n");
1331 TRACE_CALL(__func__);
1333 gboolean bindlocalhost;
1336 RemminaMessagePanel *mp;
1352 REMMINA_DEBUG(
"Calling remmina_public_get_server_port");
1354 bindlocalhost = (g_strcmp0(REMMINA_SSH(tunnel)->server, server) == 0);
1359 ssh_get_error(REMMINA_SSH(tunnel)->session));
1376 TRACE_CALL(__func__);
1383 tunnel->
localdisplay = g_strdup_printf(
"unix:%i", display);
1389 TRACE_CALL(__func__);
1396 TRACE_CALL(__func__);
1399 REMMINA_DEBUG(
"Multi monitor is set to %d", gp->
priv->
multimon);
1405 TRACE_CALL(__func__);
1412 TRACE_CALL(__func__);
1418 TRACE_CALL(__func__);
1424 TRACE_CALL(__func__);
1430 TRACE_CALL(__func__);
1436 TRACE_CALL(__func__);
1442 TRACE_CALL(__func__);
1448 TRACE_CALL(__func__);
1454 TRACE_CALL(__func__);
1460 TRACE_CALL(__func__);
1467 TRACE_CALL(__func__);
1473 TRACE_CALL(__func__);
1479 TRACE_CALL(__func__);
1490 va_start(args, fmt);
1499 TRACE_CALL(__func__);
1505 TRACE_CALL(__func__);
1532 if (button == GTK_RESPONSE_OK) {
1552 pthread_cond_signal(&d->
pt_cond);
1553 pthread_mutex_unlock(&d->
pt_mutex);
1565 RemminaMessagePanel *mp;
1602 RemminaMessagePanel *
mp;
1610 if (g_main_loop_is_running(mpri->
loop))
1611 g_main_loop_quit(mpri->
loop);
1626 mpri->
response = GTK_RESPONSE_CANCEL;
1635 mpri->
response = GTK_RESPONSE_CANCEL;
1640 const gchar *title,
const gchar *default_username,
const gchar *default_password,
const gchar *default_domain,
1641 const gchar *strpasswordlabel)
1643 TRACE_CALL(__func__);
1651 d->
title = g_strdup(title);
1660 MpRunInfo mpri = { NULL, NULL, GTK_RESPONSE_CANCEL, FALSE };
1662 gulong unmap_handler;
1663 gulong destroy_handler;
1664 gulong response_handler;
1670 if (!gtk_widget_get_visible(GTK_WIDGET(mpri.
mp)))
1671 gtk_widget_show(GTK_WIDGET(mpri.
mp));
1676 g_object_ref(mpri.
mp);
1678 mpri.
loop = g_main_loop_new(NULL, FALSE);
1679 g_main_loop_run(mpri.
loop);
1680 g_main_loop_unref(mpri.
loop);
1683 g_signal_handler_disconnect(mpri.
mp, response_handler);
1684 g_signal_handler_disconnect(mpri.
mp, destroy_handler);
1685 g_signal_handler_disconnect(mpri.
mp, unmap_handler);
1687 g_object_unref(mpri.
mp);
1695 pthread_cond_init(&d->
pt_cond, NULL);
1696 pthread_mutex_init(&d->
pt_mutex, NULL);
1701 pthread_mutex_destroy(&d->
pt_mutex);
1702 pthread_cond_destroy(&d->
pt_cond);
1724 TRACE_CALL(__func__);
1726 default_password, default_domain, password_prompt == NULL ? _(
"Password") : password_prompt);
1731 TRACE_CALL(__func__);
1738 !remminafile->prevent_saving && allow_password_saving)
1745 password, NULL, _(
"Password"));
1785 TRACE_CALL(__func__);
1793 TRACE_CALL(__func__);
1800 rc = GTK_RESPONSE_OK;
1804 s = g_strdup_printf(
1805 "<big>%s</big>\n\n%s %s\n%s %s\n%s %s\n\n<big>%s</big>",
1807 _(
"Certificate details:"),
1809 _(
"Subject:"), subject,
1811 _(
"Issuer:"), issuer,
1813 _(
"Fingerprint:"), fingerprint,
1815 _(
"Accept certificate?"));
1820 return rc == GTK_RESPONSE_YES ? GTK_RESPONSE_OK : rc;
1825 TRACE_CALL(__func__);
1832 rc = GTK_RESPONSE_OK;
1836 s = g_strdup_printf(
1837 "<big>%s</big>\n\n%s %s\n%s %s\n%s %s\n%s %s\n\n<big>%s</big>",
1839 _(
"The certificate changed! Details:"),
1841 _(
"Subject:"), subject,
1843 _(
"Issuer:"), issuer,
1845 _(
"Old fingerprint:"), old_fingerprint,
1847 _(
"New fingerprint:"), new_fingerprint,
1849 _(
"Accept changed certificate?"));
1854 return rc == GTK_RESPONSE_YES ? GTK_RESPONSE_OK : rc;
1859 TRACE_CALL(__func__);
1865 TRACE_CALL(__func__);
1871 TRACE_CALL(__func__);
1877 TRACE_CALL(__func__);
1883 TRACE_CALL(__func__);
1887 return s && s[0] ? g_strdup(s) : NULL;
1892 TRACE_CALL(__func__);
1896 return s && s[0] ? g_strdup(s) : NULL;
1901 TRACE_CALL(__func__);
1905 return s && s[0] ? g_strdup(s) : NULL;
1910 TRACE_CALL(__func__);
1914 return s && s[0] ? g_strdup(s) : NULL;
1919 TRACE_CALL(__func__);
1923 gboolean save = FALSE;
1929 d->
func = FUNC_INIT_SAVE_CRED;
1973 TRACE_CALL(__func__);
1974 RemminaMessagePanel *mp;
1981 d->
func = FUNC_PROTOCOLWIDGET_PANELSHOWLISTEN;
1990 s = g_strdup_printf(
1992 _(
"Listening on port %i for an incoming %s connection…"), port,
2002 TRACE_CALL(__func__);
2003 RemminaMessagePanel *mp;
2009 d->
func = FUNC_PROTOCOLWIDGET_MPSHOWRETRY;
2024 TRACE_CALL(__func__);
2025 printf(
"Remmina: The %s function is not implemented, and is left here only for plugin API compatibility.\n", __func__);
2030 TRACE_CALL(__func__);
2031 printf(
"Remmina: The %s function is not implemented, and is left here only for plugin API compatibility.\n", __func__);
2036 TRACE_CALL(__func__);
2043 TRACE_CALL(__func__);
2048 g_signal_connect_swapped(G_OBJECT(gp->
priv->
chat_window),
"send", G_CALLBACK(on_send), gp);
2051 g_signal_connect_swapped(G_OBJECT(gp->
priv->
chat_window),
"destroy", G_CALLBACK(on_destroy), gp);
2058 TRACE_CALL(__func__);
2065 TRACE_CALL(__func__);
2073 d->
func = FUNC_CHAT_RECEIVE;
2122 return GTK_WIDGET(g_object_new(REMMINA_TYPE_PROTOCOL_WIDGET, NULL));
2131 TRACE_CALL(__func__);
2135 GdkKeymap *keymap = gdk_keymap_get_for_display(gdk_display_get_default());
2137 event.window = gtk_widget_get_window(widget);
2138 event.send_event = TRUE;
2139 event.time = GDK_CURRENT_TIME;
2145 if (action & GDK_KEY_PRESS) {
2147 event.type = GDK_KEY_PRESS;
2148 for (i = 0; i < keyvals_length; i++) {
2149 event.keyval = keyvals[i];
2152 REMMINA_DEBUG(
"Sending keyval: %u, hardware_keycode: %u", event.keyval, event.hardware_keycode);
2153 g_signal_emit_by_name(G_OBJECT(widget),
"key-press-event", &event, &result);
2157 if (action & GDK_KEY_RELEASE) {
2159 event.type = GDK_KEY_RELEASE;
2160 for (i = (keyvals_length - 1); i >= 0; i--) {
2161 event.keyval = keyvals[i];
2164 g_signal_emit_by_name(G_OBJECT(widget),
"key-release-event", &event, &result);
2171 TRACE_CALL(__func__);
2190 if (wfile <= 0 || hfile <= 0)
2199 gtk_widget_get_allocation(GTK_WIDGET(gp), &al);
2201 w = al.width - al.width % 4;
2202 h = al.height - al.height % 4;
2204 printf(
"Remmina warning: %s RemminaProtocolWidget w=%d h=%d are too small, adjusting to 640x480\n", __func__, w, h);
2212 if (h > rect.height)
struct remmina_masterthread_exec_data::@12::@14 init_save_creds
enum remmina_ssh_auth_result remmina_ssh_auth_gui(RemminaSSH *ssh, RemminaProtocolWidget *gp, RemminaFile *remminafile)
const gchar * remmina_file_get_string(RemminaFile *remminafile, const gchar *setting)
RemminaSSHTunnelCallback destroy_func
gboolean remmina_ssh_tunnel_reverse(RemminaSSHTunnel *tunnel, gint port, gint local_port)
void remmina_message_panel_setup_auth(RemminaMessagePanel *mp, RemminaMessagePanelCallback response_callback, gpointer response_callback_data, const gchar *title, const gchar *password_prompt, unsigned flags)
void(* call_feature)(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
void remmina_message_panel_setup_question(RemminaMessagePanel *mp, const gchar *message, RemminaMessagePanelCallback response_callback, gpointer response_callback_data)
gchar * remmina_message_panel_field_get_filename(RemminaMessagePanel *mp, int entryid)
const gchar * remmina_file_get_filename(RemminaFile *remminafile)
void remmina_public_send_notification(const gchar *notification_id, const gchar *notification_title, const gchar *notification_message)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
void rco_show_message_panel(RemminaConnectionObject *cnnobj, RemminaMessagePanel *mp)
Each cnnobj->page can have more than one RemminaMessagePanel, but 0 or 1 are visible.
gpointer destroy_func_callback_data
RemminaFile * remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol)
GtkWidget * rcw_open_from_file_full(RemminaFile *remminafile, GCallback disconnect_cb, gpointer data, guint *handler)
void remmina_message_panel_setup_auth_x509(RemminaMessagePanel *mp, RemminaMessagePanelCallback response_callback, gpointer response_callback_data)
void(* init)(RemminaProtocolWidget *gp)
const RemminaProtocolFeature * features
struct remmina_masterthread_exec_data::@12::@24 protocolwidget_panelshowlisten
void rco_destroy_message_panel(RemminaConnectionObject *cnnobj, RemminaMessagePanel *mp)
Deletes a RemminaMessagePanel from the current cnnobj and if it was visible, make visible the last re...
gboolean(* open_connection)(RemminaProtocolWidget *gp)
void remmina_message_panel_field_set_string(RemminaMessagePanel *mp, int entryid, const gchar *text)
RemminaProtocolWidgetResolutionMode
RemminaSSHTunnelCallback disconnect_func
gchar * remmina_public_str_replace_in_place(gchar *string, const gchar *search, const gchar *replacement)
GtkDialog * remmina_ext_exec_new(RemminaFile *remminafile, const char *remmina_ext_exec_type)
struct remmina_masterthread_exec_data::@12::@21 protocolwidget_mpprogress
void remmina_message_panel_field_set_filename(RemminaMessagePanel *mp, int entryid, const gchar *filename)
GtkWindow * rcw_get_gtkwindow(RemminaConnectionObject *cnnobj)
gboolean remmina_masterthread_exec_is_main_thread()
struct remmina_masterthread_exec_data::@12::@22 protocolwidget_mpdestroy
gboolean(* unmap_event)(RemminaProtocolWidget *gp)
struct remmina_masterthread_exec_data::@12::@23 protocolwidget_mpshowretry
RemminaProtocolFeatureType type
void(* send_keystrokes)(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
void remmina_ssh_set_error(RemminaSSH *ssh, const gchar *fmt)
gboolean remmina_ssh_tunnel_xport(RemminaSSHTunnel *tunnel, gboolean bindlocalhost)
RemminaSSHTunnel * remmina_ssh_tunnel_new_from_file(RemminaFile *remminafile)
RemminaSSHTunnelCallback init_func
void remmina_message_panel_field_set_switch(RemminaMessagePanel *mp, int entryid, gboolean state)
RemminaTypeHint opt1_type_hint
gboolean remmina_pref_get_boolean(const gchar *key)
void remmina_ssh_tunnel_cancel_accept(RemminaSSHTunnel *tunnel)
void remmina_ssh_tunnel_free(RemminaSSHTunnel *tunnel)
RemminaProtocolFeatureType
gboolean(* close_connection)(RemminaProtocolWidget *gp)
void remmina_masterthread_exec_and_wait(RemminaMTExecData *d)
GtkWidget * rcw_get_gtkviewport(RemminaConnectionObject *cnnobj)
void(* RemminaMessagePanelCallback)(void *user_data, int button)
gchar * remmina_message_panel_field_get_string(RemminaMessagePanel *mp, int entryid)
RemminaTypeHint opt2_type_hint
void remmina_message_panel_setup_progress(RemminaMessagePanel *mp, const gchar *message, RemminaMessagePanelCallback response_callback, gpointer response_callback_data)
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
gboolean(* map_event)(RemminaProtocolWidget *gp)
gboolean(* query_feature)(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
guint16 remmina_public_get_keycode_for_keyval(GdkKeymap *keymap, guint keyval)
gpointer RemminaTunnelInitFunc
gboolean remmina_public_get_modifier_for_keycode(GdkKeymap *keymap, guint16 keycode)
struct remmina_masterthread_exec_data::@12::@15 chat_receive
union remmina_masterthread_exec_data::@12 p
struct remmina_masterthread_exec_data::@12::@20 protocolwidget_emit_signal
void remmina_message_panel_setup_message(RemminaMessagePanel *mp, const gchar *message, RemminaMessagePanelCallback response_callback, gpointer response_callback_data)
gboolean(* get_plugin_screenshot)(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
gboolean remmina_message_panel_field_get_switch_state(RemminaMessagePanel *mp, int entryid)
void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void remmina_file_save(RemminaFile *remminafile)
void rco_get_monitor_geometry(RemminaConnectionObject *cnnobj, GdkRectangle *sz)
void remmina_ssh_set_application_error(RemminaSSH *ssh, const gchar *fmt,...)
void remmina_chat_window_receive(RemminaChatWindow *window, const gchar *name, const gchar *text)
void remmina_public_get_server_port(const gchar *server, gint defaultport, gchar **host, gint *port)
gboolean remmina_ssh_tunnel_open(RemminaSSHTunnel *tunnel, const gchar *host, gint port, gint local_port)
GtkWidget * remmina_chat_window_new(GtkWindow *parent, const gchar *chat_with)
enum remmina_masterthread_exec_data::@11 func
gboolean(* RemminaXPortTunnelInitFunc)(RemminaProtocolWidget *gp, gint remotedisplay, const gchar *server, gint port)
void remmina_message_panel_response(RemminaMessagePanel *mp, gint response_id)
RemminaMessagePanel * remmina_message_panel_new()
RemminaTypeHint opt3_type_hint
RemminaSSHTunnelCallback connect_func
gboolean remmina_ssh_init_session(RemminaSSH *ssh)