From 6a9cfd1ad023b90c48deaea3e75d8ab27c66da5d Mon Sep 17 00:00:00 2001
From: Antenore Gatta
Date: Mon, 17 Jul 2023 15:40:05 +0000
Subject: Automatic doc build by remmina-ci
---
public/rdp__plugin_8c.html | 108 ++++++++++++++--------------
public/rdp__plugin_8c_source.html | 74 +++++++++----------
public/remmina__exec_8c_source.html | 4 +-
public/remmina__file__editor_8c.html | 88 +++++++++++------------
public/remmina__file__editor_8c_source.html | 90 +++++++++++------------
public/remmina__file__editor_8h.html | 14 ++--
public/remmina__file__editor_8h_source.html | 14 ++--
public/remmina__main_8c_source.html | 6 +-
public/vnc__plugin_8c.html | 66 ++++++++---------
public/vnc__plugin_8c_source.html | 32 ++++-----
10 files changed, 248 insertions(+), 248 deletions(-)
diff --git a/public/rdp__plugin_8c.html b/public/rdp__plugin_8c.html
index 64afc5e8c..4efc41b7d 100644
--- a/public/rdp__plugin_8c.html
+++ b/public/rdp__plugin_8c.html
@@ -264,7 +264,7 @@ Variables
@@ -292,7 +292,7 @@ Variables
@@ -340,7 +340,7 @@ Variables
@@ -428,7 +428,7 @@ Variables
@@ -456,7 +456,7 @@ Variables
@@ -615,7 +615,7 @@ Variables
- Todo:
- we should lock FreeRDP subthread to update rfi->primary_buffer, rfi->gdi and w/h, from here to memcpy, but… how ?
-
Definition at line 2621 of file rdp_plugin.c.
+
Definition at line 2622 of file rdp_plugin.c.
@@ -693,7 +693,7 @@ Variables
@@ -737,7 +737,7 @@ Variables
@@ -873,7 +873,7 @@ Variables
@@ -901,7 +901,7 @@ Variables
@@ -1024,7 +1024,7 @@ Variables
@@ -1693,7 +1693,7 @@ Variables
@@ -1719,7 +1719,7 @@ Variables
Initial value:=
N_(
"Options for redirection of audio output:\n" " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n"
" [channel:<channel>] Audio output\n"
" • sys:pulse\n"
" • format:1\n"
" • sys:oss,dev:1,format:1\n"
" • sys:alsa")
N_("Unable to connect to VNC server")
-
Definition at line 2776 of file rdp_plugin.c.
+
Definition at line 2777 of file rdp_plugin.c.
@@ -1744,7 +1744,7 @@ Variables
Initial value:=
N_(
"2600 (Windows XP), 7601 (Windows Vista/7), 9600 (Windows 8 and newer)")
N_("Unable to connect to VNC server")
-
Definition at line 2756 of file rdp_plugin.c.
+
Definition at line 2757 of file rdp_plugin.c.
@@ -1769,7 +1769,7 @@ Variables
Initial value:=
N_(
"Used i.a. by terminal services in a smart card channel to distinguish client capabilities:\n" " • < 4034: Windows XP base smart card functions\n"
" • 4034-7064: Windows Vista/7: SCardReadCache(),\n"
" SCardWriteCache(), SCardGetTransmitCount()\n"
" • >= 7065: Windows 8 and newer: SCardGetReaderIcon(),\n"
" SCardGetDeviceTypeId()")
N_("Unable to connect to VNC server")
-
Definition at line 2759 of file rdp_plugin.c.
+
Definition at line 2760 of file rdp_plugin.c.
@@ -1794,7 +1794,7 @@ Variables
Initial value:=
{
"99",
N_(
"Automatic (32 bpp) (Server chooses its best format)"),
"66",
N_(
"GFX AVC444 (32 bpp)"),
"65",
N_(
"GFX AVC420 (32 bpp)"),
"64",
N_(
"GFX RFX (32 bpp)"),
"63",
N_(
"GFX RFX Progressive (32 bpp)"),
"0",
N_(
"RemoteFX (32 bpp)"),
"32",
N_(
"True colour (32 bpp)"),
"24",
N_(
"True colour (24 bpp)"),
"16",
N_(
"High colour (16 bpp)"),
"15",
N_(
"High colour (15 bpp)"),
"8",
N_(
"256 colours (8 bpp)"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2661 of file rdp_plugin.c.
+
Definition at line 2662 of file rdp_plugin.c.
@@ -1819,7 +1819,7 @@ Variables
Initial value:=
N_(
"Redirect directory <path> as named share <name>.\n" " • <name>,<fullpath>[;<name>,<fullpath>[;…]]\n"
" • MyHome,/home/remminer\n"
" • /home/remminer\n"
" • MyHome,/home/remminer;SomePath,/path/to/somepath\n"
"Hotplug support is enabled with:\n"
" • hotplug,*\n"
"\n")
N_("Unable to connect to VNC server")
-
Definition at line 2814 of file rdp_plugin.c.
+
Definition at line 2815 of file rdp_plugin.c.
@@ -1867,7 +1867,7 @@ Variables
Initial value:=
{
"http", "HTTP",
"rpc", "RPC",
"auto", "Auto",
NULL
}
-
Definition at line 2736 of file rdp_plugin.c.
+
Definition at line 2737 of file rdp_plugin.c.
@@ -1891,7 +1891,7 @@ Variables
Initial value:=
{
"INFO", "INFO",
"FATAL", "FATAL",
"ERROR", "ERROR",
"WARN", "WARN",
"DEBUG", "DEBUG",
"TRACE", "TRACE",
"OFF", "OFF",
NULL
}
-
Definition at line 2679 of file rdp_plugin.c.
+
Definition at line 2680 of file rdp_plugin.c.
@@ -1916,7 +1916,7 @@ Variables
Initial value:=
N_(
"Options for redirection of audio input:\n" " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n"
" [channel:<channel>] Audio input (microphone)\n"
" • sys:pulse\n"
" • format:1\n"
" • sys:oss,dev:1,format:1\n"
" • sys:alsa")
N_("Unable to connect to VNC server")
-
Definition at line 2767 of file rdp_plugin.c.
+
Definition at line 2768 of file rdp_plugin.c.
@@ -1941,7 +1941,7 @@ Variables
Initial value:=
N_(
"Comma-separated list of monitor IDs and desktop orientations:\n" " • [<id>:<orientation-in-degrees>,]\n"
" • 0,1,2,3\n"
" • 0:270,1:90\n"
"Orientations are specified in degrees, valid values are:\n"
" • 0 (landscape)\n"
" • 90 (portrait)\n"
" • 180 (landscape flipped)\n"
" • 270 (portrait flipped)\n"
"\n")
N_("Unable to connect to VNC server")
-
Definition at line 2802 of file rdp_plugin.c.
+
Definition at line 2803 of file rdp_plugin.c.
@@ -1966,7 +1966,7 @@ Variables
Initial value:=
{
"autodetect",
N_(
"Auto-detect"),
"broadband-low",
N_(
"Low performance broadband"),
"satellite",
N_(
"Satellite"),
"broadband-high",
N_(
"High performance broadband"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2703 of file rdp_plugin.c.
+
Definition at line 2704 of file rdp_plugin.c.
@@ -1991,7 +1991,7 @@ Variables
Initial value:=
N_(
"Performance optimisations based on the network connection type:\n" "Using auto-detection is advised.\n"
"If “Auto-detect” fails, choose the most appropriate option in the list.\n")
N_("Unable to connect to VNC server")
-
Definition at line 2797 of file rdp_plugin.c.
+
Definition at line 2798 of file rdp_plugin.c.
@@ -2016,7 +2016,7 @@ Variables
Initial value:=
{
"0",
N_(
"Poor (fastest)"),
"9",
N_(
"Best (slowest)"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2693 of file rdp_plugin.c.
+
Definition at line 2694 of file rdp_plugin.c.
@@ -2040,7 +2040,7 @@ Variables
@@ -2079,24 +2079,24 @@ Variables
-
Initial value:=
{
"RDP",
N_(
"RDP - Remote Desktop Protocol"),
GETTEXT_PACKAGE,
"org.remmina.Remmina-rdp-symbolic",
"org.remmina.Remmina-rdp-ssh-symbolic",
}
static gboolean remmina_rdp_open_connection(RemminaProtocolWidget *gp)
+
Initial value:=
{
"RDP",
N_(
"RDP - Remote Desktop Protocol"),
GETTEXT_PACKAGE,
"org.remmina.Remmina-rdp-symbolic",
"org.remmina.Remmina-rdp-ssh-symbolic",
}
static gboolean remmina_rdp_open_connection(RemminaProtocolWidget *gp)
gboolean remmina_rdp_event_on_unmap(RemminaProtocolWidget *gp)
-
static gboolean remmina_rdp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
+
static gboolean remmina_rdp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
-
static const RemminaProtocolSetting remmina_rdp_advanced_settings[]
-
static void remmina_rdp_init(RemminaProtocolWidget *gp)
+
static const RemminaProtocolSetting remmina_rdp_advanced_settings[]
+
static void remmina_rdp_init(RemminaProtocolWidget *gp)
-
static const RemminaProtocolFeature remmina_rdp_features[]
-
static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
-
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget *gp)
-
static char remmina_plugin_rdp_version[256]
-
static const RemminaProtocolSetting remmina_rdp_basic_settings[]
-
static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
+
static const RemminaProtocolFeature remmina_rdp_features[]
+
static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
+
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget *gp)
+
static char remmina_plugin_rdp_version[256]
+
static const RemminaProtocolSetting remmina_rdp_basic_settings[]
+
static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp)
-
static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
+
static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
N_("Unable to connect to VNC server")
-
Definition at line 2953 of file rdp_plugin.c.
+
Definition at line 2954 of file rdp_plugin.c.
@@ -2120,7 +2120,7 @@ Variables
@@ -2144,21 +2144,21 @@ Variables
Initial value:=
{
}
-
static gchar network_tooltip[]
+
static gchar network_tooltip[]
-
static gpointer network_list[]
+
static gpointer network_list[]
-
static gpointer colordepth_list[]
-
static gchar monitorids_tooltip[]
+
static gpointer colordepth_list[]
+
static gchar monitorids_tooltip[]
-
static gchar drive_tooltip[]
+
static gchar drive_tooltip[]
N_("Unable to connect to VNC server")
-
Definition at line 2841 of file rdp_plugin.c.
+
Definition at line 2842 of file rdp_plugin.c.
@@ -2190,7 +2190,7 @@ Variables
N_("Unable to connect to VNC server")
-Definition at line 2936 of file rdp_plugin.c.
+Definition at line 2937 of file rdp_plugin.c.
@@ -2217,11 +2217,11 @@ Variables
gboolean remmina_rdp_file_import_test(RemminaFilePlugin *plugin, const gchar *from_file)
gboolean remmina_rdp_file_export(RemminaFilePlugin *plugin, RemminaFile *remminafile, const gchar *to_file)
-static char remmina_plugin_rdp_version[256]
+static char remmina_plugin_rdp_version[256]
N_("Unable to connect to VNC server")
RemminaFile * remmina_rdp_file_import(RemminaFilePlugin *plugin, const gchar *from_file)
-Definition at line 2978 of file rdp_plugin.c.
+Definition at line 2979 of file rdp_plugin.c.
@@ -2246,10 +2246,10 @@ Variables
Initial value:=
{
"RDPS",
GETTEXT_PACKAGE,
"RDP",
}
GtkWidget * remmina_rdp_settings_new(RemminaPrefPlugin *plugin)
-
static char remmina_plugin_rdp_version[256]
+
static char remmina_plugin_rdp_version[256]
N_("Unable to connect to VNC server")
-
Definition at line 2993 of file rdp_plugin.c.
+
Definition at line 2994 of file rdp_plugin.c.
@@ -2274,7 +2274,7 @@ Variables
Initial value:=
{
"",
N_(
"Automatic negotiation"),
"nla",
N_(
"NLA protocol security"),
"tls",
N_(
"TLS protocol security"),
"rdp",
N_(
"RDP protocol security"),
"ext",
N_(
"NLA extended protocol security"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2726 of file rdp_plugin.c.
+
Definition at line 2727 of file rdp_plugin.c.
@@ -2299,7 +2299,7 @@ Variables
@@ -2324,7 +2324,7 @@ Variables
Initial value:=
N_(
"Advanced setting for high latency links:\n" "Adjusts the connection timeout. Use if your connection times out.\n"
"The highest possible value is 600000 ms (10 minutes).\n")
N_("Unable to connect to VNC server")
-
Definition at line 2792 of file rdp_plugin.c.
+
Definition at line 2793 of file rdp_plugin.c.
@@ -2349,7 +2349,7 @@ Variables
Initial value:=
{
"0",
N_(
"0 — Windows 7 compatible"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2744 of file rdp_plugin.c.
+
Definition at line 2745 of file rdp_plugin.c.
@@ -2374,7 +2374,7 @@ Variables
Initial value:=
N_(
"Options for redirection of USB device:\n" " • [dbg,][id:<vid>:<pid>#…,][addr:<bus>:<addr>#…,][auto]\n"
" • auto\n"
" • id:054c:0268#4669:6e6b,addr:04:0c")
N_("Unable to connect to VNC server")
-
Definition at line 2786 of file rdp_plugin.c.
+
Definition at line 2787 of file rdp_plugin.c.
diff --git a/public/rdp__plugin_8c_source.html b/public/rdp__plugin_8c_source.html
index ca69ef883..3d3117479 100644
--- a/public/rdp__plugin_8c_source.html
+++ b/public/rdp__plugin_8c_source.html
@@ -86,22 +86,22 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
rdp_plugin.c
-
Go to the documentation of this file. 55 #ifdef GDK_WINDOWING_X11 56 #include <cairo/cairo-xlib.h> 58 #include <cairo/cairo.h> 60 #include <freerdp/addin.h> 61 #include <freerdp/assistance.h> 62 #include <freerdp/settings.h> 63 #include <freerdp/freerdp.h> 64 #include <freerdp/constants.h> 65 #include <freerdp/client/cliprdr.h> 66 #include <freerdp/client/channels.h> 67 #include <freerdp/client/cmdline.h> 68 #include <freerdp/error.h> 69 #include <freerdp/event.h> 70 #include <winpr/memory.h> 71 #include <winpr/cmdline.h> 75 #include <cups/cups.h> 81 #ifdef GDK_WINDOWING_X11 83 #include <X11/XKBlib.h> 85 #elif defined(GDK_WINDOWING_WAYLAND) 86 #include <gdk/gdkwayland.h> 89 #if defined(__FreeBSD__) 90 #include <pthread_np.h> 93 #include <freerdp/locale/keyboard.h> 95 #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 96 #define REMMINA_RDP_FEATURE_SCALE 2 97 #define REMMINA_RDP_FEATURE_UNFOCUS 3 98 #define REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL 4 99 #define REMMINA_RDP_FEATURE_DYNRESUPDATE 5 100 #define REMMINA_RDP_FEATURE_MULTIMON 6 101 #define REMMINA_RDP_FEATURE_VIEWONLY 7 103 #define REMMINA_CONNECTION_TYPE_NONE 0 106 #define CLPARAM const char 125 TRACE_CALL(__func__);
126 #if FREERDP_CHECK_VERSION(2, 0, 0) 127 return (CLPARAM **)CommandLineParseCommaSeparatedValuesEx(name, list, count);
145 size_t len = strlen(name);
146 p = (
char **)calloc(2UL + len,
sizeof(
char *));
149 char *dst = (
char *)&p[1];
151 sprintf_s(dst, len + 1,
"%s", name);
161 const char *it = list;
163 while ((it = strchr(it,
',')) != NULL) {
174 prefix = (nArgs + 1UL) *
sizeof(
char *);
176 p = (
char **)calloc(len + prefix + 1,
sizeof(
char *));
181 str = &((
char *)p)[prefix];
182 memcpy(str, list, len);
187 for (index = name ? 1 : 0; index < nArgs; index++) {
188 char *comma = strchr(str,
',');
204 TRACE_CALL(__func__);
213 TRACE_CALL(__func__);
218 DISPLAY_CONTROL_MONITOR_LAYOUT *dcml;
219 CLIPRDR_FORMAT_DATA_RESPONSE response = { 0 };
230 switch (event->
type) {
232 flags =
event->key_event.extended ? KBD_FLAGS_EXTENDED : 0;
233 flags |=
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
234 input->KeyboardEvent(input, flags, event->
key_event.key_code);
241 flags =
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
242 input->UnicodeKeyboardEvent(input, flags, event->
key_event.unicode_code);
247 input->ExtendedMouseEvent(input, event->
mouse_event.flags,
260 response.msgFlags = (
event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL;
261 response.dataLen =
event->clipboard_formatdataresponse.size;
262 response.requestedFormatData =
event->clipboard_formatdataresponse.data;
267 REMMINA_PLUGIN_DEBUG(
"Sending client FormatDataRequest to server");
274 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
275 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
277 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
278 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
280 dcml = calloc(freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount),
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
281 REMMINA_PLUGIN_DEBUG(
"REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT:");
285 const rdpMonitor *base = freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
286 for (gint i = 0; i < freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount); ++i) {
287 const rdpMonitor *current = &base[i];
288 REMMINA_PLUGIN_DEBUG(
"Sending display layout for monitor n° %d", i);
289 dcml[i].Flags = (current->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0);
290 REMMINA_PLUGIN_DEBUG(
"Monitor %d is primary: %d", i, dcml[i].Flags);
291 dcml[i].Left = current->x;
292 REMMINA_PLUGIN_DEBUG(
"Monitor %d x: %d", i, dcml[i].Left);
293 dcml[i].Top = current->y;
294 REMMINA_PLUGIN_DEBUG(
"Monitor %d y: %d", i, dcml[i].Top);
295 dcml[i].Width = current->width;
296 REMMINA_PLUGIN_DEBUG(
"Monitor %d width: %d", i, dcml[i].Width);
297 dcml[i].Height = current->height;
298 REMMINA_PLUGIN_DEBUG(
"Monitor %d height: %d", i, dcml[i].Height);
299 dcml[i].PhysicalWidth = current->attributes.physicalWidth;
300 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical width: %d", i, dcml[i].PhysicalWidth);
301 dcml[i].PhysicalHeight = current->attributes.physicalHeight;
302 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical height: %d", i, dcml[i].PhysicalHeight);
303 if (current->attributes.orientation)
304 dcml[i].Orientation = current->attributes.orientation;
306 dcml[i].Orientation =
event->monitor_layout.desktopOrientation;
307 REMMINA_PLUGIN_DEBUG(
"Monitor %d orientation: %d", i, dcml[i].Orientation);
308 dcml[i].DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
309 dcml[i].DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
314 dcml = g_malloc0(
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
316 dcml->Flags = DISPLAY_CONTROL_MONITOR_PRIMARY;
317 dcml->Width =
event->monitor_layout.width;
318 dcml->Height =
event->monitor_layout.height;
319 dcml->Orientation =
event->monitor_layout.desktopOrientation;
320 dcml->DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
321 dcml->DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
329 freerdp_abort_connect(rfi->
instance);
341 TRACE_CALL(__func__);
357 REMMINA_PLUGIN_DEBUG(
"Tunnel init");
359 if (hostport == NULL)
367 REMMINA_PLUGIN_DEBUG(
"protocol_plugin_start_direct_tunnel() returned %s", hostport);
376 freerdp_settings_set_string(rfi->
settings, FreeRDP_ServerHostname, host);
378 if (cert_port == 3389) {
379 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, cert_host);
381 s = g_strdup_printf(
"%s:%d", cert_host, cert_port);
382 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, s);
387 REMMINA_PLUGIN_DEBUG(
"Tunnel has been optionally initialized. Now connecting to %s:%d", host, port);
389 if (cert_host != host) g_free(cert_host);
393 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ServerPort, port);
400 TRACE_CALL(__func__);
401 rdpSettings *settings = rfi->
instance->settings;
414 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
415 REMMINA_PLUGIN_DEBUG(
"maxattempts from default: %d", maxattempts);
417 if ((cval = remmina_plugin_service->
pref_get_value(
"rdp_reconnect_attempts")) != NULL)
418 maxattempts = atoi(cval);
419 REMMINA_PLUGIN_DEBUG(
"maxattempts from general preferences: %d", maxattempts);
421 maxattempts = remmina_plugin_service->
file_get_int(remminafile,
"rdp_reconnect_attempts", maxattempts);
422 REMMINA_PLUGIN_DEBUG(
"maxattempts from general plugin: %d", maxattempts);
424 if (maxattempts <= 0)
425 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
426 freerdp_settings_set_uint32(settings, FreeRDP_AutoReconnectMaxRetries, maxattempts);
427 REMMINA_PLUGIN_DEBUG(
"maxattempts set to: %d", maxattempts);
433 switch (freerdp_error_info(rfi->
instance)) {
434 case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED:
437 case ERRINFO_SUCCESS:
445 if (!freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled)) {
452 REMMINA_PLUGIN_DEBUG(
"[%s] network disconnection detected, initiating reconnection attempt",
453 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
469 REMMINA_PLUGIN_DEBUG(
"[%s] maximum number of reconnection attempts exceeded.",
470 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
475 REMMINA_PLUGIN_DEBUG(
"[%s] reconnect request loop interrupted by user.",
476 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
481 REMMINA_PLUGIN_DEBUG(
"[%s] reconnection, attempt #%d of %d",
488 treconn = time(NULL);
492 REMMINA_PLUGIN_DEBUG(
"[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.",
493 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
495 if (freerdp_reconnect(rfi->
instance)) {
497 REMMINA_PLUGIN_DEBUG(
"[%s] reconnected.", freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
504 while (time(NULL) - treconn < 5) {
517 TRACE_CALL(__func__);
524 if (!gdi || !gdi->primary || !gdi->primary->hdc || !gdi->primary->hdc->hwnd)
532 TRACE_CALL(__func__);
543 if (gdi == NULL || gdi->primary == NULL || gdi->primary->hdc == NULL || gdi->primary->hdc->hwnd == NULL)
546 if (gdi->primary->hdc->hwnd->invalid->null)
549 if (gdi->primary->hdc->hwnd->ninvalid < 1)
552 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
553 cinvalid = gdi->primary->hdc->hwnd->cinvalid;
555 for (i = 0; i < ninvalid; i++) {
556 reg[i].
x = cinvalid[i].x;
557 reg[i].
y = cinvalid[i].y;
558 reg[i].
w = cinvalid[i].w;
559 reg[i].
h = cinvalid[i].h;
564 ui->
reg.ninvalid = ninvalid;
570 gdi->primary->hdc->hwnd->invalid->null = TRUE;
571 gdi->primary->hdc->hwnd->ninvalid = 0;
579 TRACE_CALL(__func__);
588 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
589 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
600 gdi_resize(((rdpContext *)rfi)->gdi, w, h);
615 static BOOL
rf_play_sound(rdpContext *context,
const PLAY_SOUND_UPDATE *play_sound)
617 TRACE_CALL(__func__);
625 disp = gtk_widget_get_display(GTK_WIDGET(gp));
626 gdk_display_beep(disp);
633 TRACE_CALL(__func__);
640 disp = gtk_widget_get_display(GTK_WIDGET(gp));
642 #ifdef GDK_WINDOWING_X11 643 if (GDK_IS_X11_DISPLAY(disp)) {
645 Display *x11_display;
646 x11_display = gdk_x11_display_get_xdisplay(disp);
647 XkbLockModifiers(x11_display, XkbUseCoreKbd,
649 ((led_flags & KBD_SYNC_CAPS_LOCK) ? LockMask : 0) |
650 ((led_flags & KBD_SYNC_NUM_LOCK) ? Mod2Mask : 0)
663 TRACE_CALL(__func__);
674 TRACE_CALL(__func__);
675 rdpChannels *channels;
676 rdpSettings *settings;
677 rdpContext *context = instance->context;
679 settings = instance->settings;
680 channels = context->channels;
681 freerdp_settings_set_uint32(settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNIX);
682 freerdp_settings_set_uint32(settings, FreeRDP_OsMinorType, OSMINORTYPE_UNSPECIFIED);
683 freerdp_settings_set_bool(settings, FreeRDP_BitmapCacheEnabled, TRUE);
684 freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, 1);
686 PubSub_SubscribeChannelConnected(instance->context->pubSub,
688 PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
691 if (!freerdp_client_load_addins(channels, settings))
699 TRACE_CALL(__func__);
703 UINT32 freerdp_local_color_format;
711 rfi->
srcBpp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth);
713 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) == FALSE)
718 REMMINA_PLUGIN_DEBUG(
"bpp: %d", rfi->
bpp);
721 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
722 freerdp_local_color_format = PIXEL_FORMAT_BGRX32;
730 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
731 freerdp_local_color_format = PIXEL_FORMAT_BGRA32;
735 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB16_565");
736 freerdp_local_color_format = PIXEL_FORMAT_RGB16;
741 if (!gdi_init(instance, freerdp_local_color_format)) {
746 if (instance->context->codecs->h264 == NULL && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
774 TRACE_CALL(__func__);
775 gchar *s_username, *s_password, *s_domain;
780 gboolean disablepasswordstoring;
786 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
790 _(
"Enter RDP authentication credentials"),
795 if (ret == GTK_RESPONSE_OK) {
797 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, s_username);
800 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s_password);
803 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, s_domain);
805 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
806 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
813 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
815 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
819 if (s_username) g_free(s_username);
820 if (s_password) g_free(s_password);
821 if (s_domain) g_free(s_domain);
833 TRACE_CALL(__func__);
834 gchar *s_username, *s_password, *s_domain;
839 gboolean disablepasswordstoring;
840 gboolean basecredforgw;
847 if (!remmina_plugin_service->
file_get_string(remminafile,
"gateway_server"))
849 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
850 basecredforgw = remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE);
855 _(
"Enter RDP authentication credentials"),
863 _(
"Enter RDP gateway authentication credentials"),
864 remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"),
865 remmina_plugin_service->
file_get_string(remminafile,
"gateway_password"),
866 remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"),
871 if (ret == GTK_RESPONSE_OK) {
873 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, s_username);
876 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s_password);
879 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, s_domain);
884 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
885 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
887 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
889 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
891 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", s_username);
892 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", s_domain);
894 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", s_password);
896 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
899 if (s_username) g_free(s_username);
900 if (s_password) g_free(s_password);
901 if (s_domain) g_free(s_domain);
912 const char *common_name,
const char *subject,
913 const char *issuer,
const char *fingerprint, DWORD flags)
915 TRACE_CALL(__func__);
925 if (status == GTK_RESPONSE_OK)
932 remmina_rdp_verify_certificate(freerdp *instance,
const char *common_name,
const char *subject,
const char *issuer,
const char *fingerprint, BOOL host_mismatch) __attribute__ ((unused));
935 const char *issuer,
const char *fingerprint, BOOL host_mismatch)
937 TRACE_CALL(__func__);
947 if (status == GTK_RESPONSE_OK)
954 const char *common_name,
const char *subject,
955 const char *issuer,
const char *fingerprint,
956 const char *old_subject,
const char *old_issuer,
957 const char *old_fingerprint, DWORD flags)
959 TRACE_CALL(__func__);
969 if (status == GTK_RESPONSE_OK)
977 TRACE_CALL(__func__);
979 if (!instance || !instance->context)
982 PubSub_UnsubscribeChannelConnected(instance->context->pubSub,
984 PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub,
992 TRACE_CALL(__func__);
997 while (!freerdp_shall_disconnect(rfi->
instance)) {
998 HANDLE handles[64]={0};
999 DWORD nCount = freerdp_get_event_handles(rfi->
instance->context, &handles[0], 64);
1003 handles[nCount++] = rfi->
instance->context->abortEvent;
1006 fprintf(stderr,
"freerdp_get_event_handles failed\n");
1010 status = WaitForMultipleObjects(nCount, handles, FALSE, 100);
1012 if (status == WAIT_FAILED) {
1013 fprintf(stderr,
"WaitForMultipleObjects failed with %lu\n", (
unsigned long)status);
1019 fprintf(stderr,
"Could not process local keyboard/mouse event queue\n");
1022 if (read(rfi->
event_pipe[0], buf,
sizeof(buf))) {
1027 if (WaitForSingleObject(rfi->
instance->context->abortEvent, 0) == WAIT_OBJECT_0)
1031 if (!freerdp_check_event_handles(rfi->
instance->context)) {
1037 if (freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS)
1038 fprintf(stderr,
"Could not check FreeRDP file descriptor\n");
1042 const gchar *host = freerdp_settings_get_string (rfi->
settings, FreeRDP_ServerHostname);
1044 REMMINA_PLUGIN_AUDIT(_(
"Disconnected from %s via RDP"), host);
1046 REMMINA_PLUGIN_DEBUG(
"RDP client disconnected");
1051 TRACE_CALL(__func__);
1052 PVIRTUALCHANNELENTRY entry = NULL;
1053 PVIRTUALCHANNELENTRYEX entryEx = NULL;
1055 entryEx = (PVIRTUALCHANNELENTRYEX)(
void *)freerdp_load_channel_addin_entry(
1056 name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC | FREERDP_ADDIN_CHANNEL_ENTRYEX);
1059 entry = freerdp_load_channel_addin_entry(name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC);
1062 if (freerdp_channels_client_load_ex(channels, settings, entryEx, data) == 0) {
1063 fprintf(stderr,
"loading channel %s\n", name);
1067 if (freerdp_channels_client_load(channels, settings, entry, data) == 0) {
1068 fprintf(stderr,
"loading channel %s\n", name);
1087 S_WAITSEMICOLON } state = S_WAITPR;
1090 while ((c = *smap++) != 0) {
1093 if (c !=
'\"')
return NULL;
1094 state = S_INPRINTER;
1099 if (matching && c == *p && *p != 0) {
1101 }
else if (c ==
'\"') {
1104 state = S_WAITCOLON;
1112 state = S_WAITDRIVER;
1125 state = S_WAITSEMICOLON;
1128 case S_WAITSEMICOLON:
1139 p = (
char *)malloc(sz);
1171 const gchar *s = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
1173 RDPDR_PRINTER *printer;
1174 printer = (RDPDR_PRINTER *)calloc(1,
sizeof(RDPDR_PRINTER));
1176 #ifdef WITH_FREERDP3 1178 pdev = &(printer->device);
1180 RDPDR_PRINTER *pdev;
1184 pdev->Type = RDPDR_DTYP_PRINT;
1185 REMMINA_PLUGIN_DEBUG(
"Printer Type: %d", pdev->Type);
1187 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectPrinters, TRUE);
1188 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
1190 REMMINA_PLUGIN_DEBUG(
"Destination: %s", dest->name);
1191 if (!(pdev->Name = _strdup(dest->name))) {
1196 REMMINA_PLUGIN_DEBUG(
"Printer Name: %s", pdev->Name);
1201 printer->DriverName = strdup(d);
1202 REMMINA_PLUGIN_DEBUG(
"Printer DriverName set to: %s", printer->DriverName);
1216 printer->DriverName = _strdup(
"MS Publisher Imagesetter");
1219 REMMINA_PLUGIN_DEBUG(
"Printer Driver: %s", printer->DriverName);
1220 if (!freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)printer)) {
1221 free(printer->DriverName);
1234 TRACE_CALL(__func__);
1235 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
1239 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
1244 freerdp_settings_set_uint32(settings, FreeRDP_ConnectionType, type);
1246 if (type == CONNECTION_TYPE_MODEM) {
1247 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1248 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1249 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1250 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1251 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1252 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, TRUE);
1253 }
else if (type == CONNECTION_TYPE_BROADBAND_LOW) {
1254 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1255 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1256 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1257 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1258 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1259 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1260 }
else if (type == CONNECTION_TYPE_SATELLITE) {
1261 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1262 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1263 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1264 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1265 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1266 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1267 }
else if (type == CONNECTION_TYPE_BROADBAND_HIGH) {
1268 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1269 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1270 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1271 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1272 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1273 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1274 }
else if (type == CONNECTION_TYPE_WAN) {
1275 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1276 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1277 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1278 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1279 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1280 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1281 }
else if (type == CONNECTION_TYPE_LAN) {
1282 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1283 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1284 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1285 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1286 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1287 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1288 }
else if (type == CONNECTION_TYPE_AUTODETECT) {
1289 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1290 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1291 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1292 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1293 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1294 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1295 freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, TRUE);
1298 #ifdef WITH_GFX_H264 1302 freerdp_settings_set_bool(settings, FreeRDP_RemoteFxCodec, TRUE);
1303 freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1304 }
else if (type == REMMINA_CONNECTION_TYPE_NONE) {
1313 #ifdef GDK_WINDOWING_X11 1314 #if FREERDP_CHECK_VERSION(2, 3, 0) 1317 TRACE_CALL(__func__);
1320 gchar *rdp_kbd_remap = NULL;
1326 return rdp_kbd_remap;
1327 rdp_kbd_remap = g_malloc0(512);
1328 display = XOpenDisplay(0);
1329 for (i = 0; table[i] > 0; i += 2) {
1330 g_snprintf(keys,
sizeof(keys),
"0x%02x=0x%02x", freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i])),
1331 freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i + 1])));
1333 g_strlcat(rdp_kbd_remap,
",", 512);
1334 g_strlcat(rdp_kbd_remap, keys, 512);
1336 XCloseDisplay(display);
1338 return rdp_kbd_remap;
1345 TRACE_CALL(__func__);
1352 rdpChannels *channels;
1353 gchar *gateway_host;
1355 gchar *datapath = NULL;
1356 gboolean status = TRUE;
1357 #ifdef GDK_WINDOWING_X11 1358 gchar *rdp_kbd_remap;
1362 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
1364 channels = rfi->
instance->context->channels;
1368 datapath = g_build_path(
"/",
1372 REMMINA_PLUGIN_DEBUG(
"RDP data path is %s", datapath);
1374 if ((datapath != NULL) && (datapath[0] !=
'\0'))
1375 if (access(datapath, W_OK) == 0)
1376 freerdp_settings_set_string(rfi->
settings, FreeRDP_ConfigPath, datapath);
1379 if (remmina_plugin_service->
file_get_int(remminafile,
"assistance_mode", 0)){
1380 rdpAssistanceFile* file = freerdp_assistance_file_new();
1382 REMMINA_PLUGIN_DEBUG(
"Could not allocate assistance file structure");
1386 if (remmina_plugin_service->
file_get_string(remminafile,
"assistance_file") == NULL ||
1387 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass") == NULL ){
1389 REMMINA_PLUGIN_DEBUG(
"Assistance file and password are not set while assistance mode is on");
1393 status = freerdp_assistance_parse_file(file,
1394 remmina_plugin_service->
file_get_string(remminafile,
"assistance_file"),
1395 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass"));
1398 REMMINA_PLUGIN_DEBUG(
"Could not parse assistance file");
1403 if (!freerdp_assistance_populate_settings_from_assistance_file(file, rfi->
settings))
1404 REMMINA_PLUGIN_DEBUG(
"Could not populate settings from assistance file");
1409 #if defined(PROXY_TYPE_IGNORE) 1410 if (!remmina_plugin_service->
file_get_int(remminafile,
"useproxyenv", FALSE) ? TRUE : FALSE) {
1411 REMMINA_PLUGIN_DEBUG(
"Not using system proxy settings");
1412 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1419 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, (remmina_plugin_service->
file_get_int(remminafile,
"disableautoreconnect", FALSE) ? FALSE : TRUE));
1421 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1422 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, FALSE);
1424 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 99));
1426 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SoftwareGdi, TRUE);
1430 if (!
gfx_h264_available && (freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth) == 65 || freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth == 66)))
1431 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 64);
1433 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 0) {
1435 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1436 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, FALSE);
1437 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1438 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 63) {
1440 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1441 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1442 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1443 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1444 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 64) {
1446 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1447 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1448 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1449 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1450 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1451 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 65) {
1453 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1454 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1456 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1457 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 66) {
1459 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1460 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1463 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 99) {
1465 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1466 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1467 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1472 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) ||
1473 freerdp_settings_get_bool(rfi->
settings, FreeRDP_NSCodec) ||
1474 freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1475 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1476 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FrameMarkerCommandEnabled, TRUE);
1477 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1486 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, w);
1487 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, h);
1488 REMMINA_PLUGIN_DEBUG(
"Resolution set by the user: %dx%d", w, h);
1492 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline) &&
1493 freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
1494 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) <
1495 AVC_MIN_DESKTOP_WIDTH)
1496 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth,
1497 AVC_MIN_DESKTOP_WIDTH);
1498 if (freerdp_settings_get_uint32(rfi->
settings,
1499 FreeRDP_DesktopHeight) <
1500 AVC_MIN_DESKTOP_HEIGHT)
1501 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight,
1502 AVC_MIN_DESKTOP_HEIGHT);
1508 if ((freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) & 1) != 0) {
1509 UINT32 tmp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1510 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, tmp - 1);
1516 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1517 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
1518 REMMINA_PLUGIN_DEBUG(
"Resolution set after workarounds: %dx%d", w, h);
1522 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, remmina_plugin_service->
file_get_string(remminafile,
"username"));
1525 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, remmina_plugin_service->
file_get_string(remminafile,
"domain"));
1528 if (s) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s);
1530 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoLogonEnabled, TRUE);
1536 gchar *proxy_type = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_type"));
1537 gchar *proxy_username = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_username"));
1538 gchar *proxy_password = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_password"));
1539 gchar *proxy_hostname = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_hostname"));
1540 gint proxy_port = remmina_plugin_service->
file_get_int(remminafile,
"proxy_port", 80);
1541 REMMINA_PLUGIN_DEBUG(
"proxy_type: %s", proxy_type);
1542 REMMINA_PLUGIN_DEBUG(
"proxy_username: %s", proxy_username);
1543 REMMINA_PLUGIN_DEBUG(
"proxy_password: %s", proxy_password);
1544 REMMINA_PLUGIN_DEBUG(
"proxy_hostname: %s", proxy_hostname);
1545 REMMINA_PLUGIN_DEBUG(
"proxy_port: %d", proxy_port);
1546 if (proxy_type && proxy_hostname) {
1547 if (g_strcmp0(proxy_type,
"no_proxy") == 0)
1548 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1549 else if (g_strcmp0(proxy_type,
"http") == 0)
1550 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_HTTP);
1551 else if (g_strcmp0(proxy_type,
"socks5") == 0)
1552 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_SOCKS);
1554 g_warning(
"Invalid proxy protocol, at the moment only no_proxy, HTTP and SOCKS5 are supported");
1555 REMMINA_PLUGIN_DEBUG(
"ProxyType set to: %" PRIu32, freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ProxyType));
1556 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyHostname, proxy_hostname);
1558 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyUsername, proxy_username);
1560 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyPassword, proxy_password);
1562 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_ProxyPort, proxy_port);
1564 g_free(proxy_hostname);
1565 g_free(proxy_username);
1566 g_free(proxy_password);
1568 if (remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE)) {
1570 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", NULL);
1571 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", NULL);
1572 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
1576 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, FALSE);
1577 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_server");
1579 cs = remmina_plugin_service->
file_get_string(remminafile,
"gwtransp");
1580 #if FREERDP_CHECK_VERSION(2, 3, 1) 1581 if (remmina_plugin_service->
file_get_int(remminafile,
"websockets", FALSE))
1582 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, TRUE);
1584 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, FALSE);
1586 if (g_strcmp0(cs,
"http") == 0) {
1587 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, FALSE);
1588 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1589 }
else if (g_strcmp0(cs,
"rpc") == 0) {
1590 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1591 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, FALSE);
1592 }
else if (g_strcmp0(cs,
"auto") == 0) {
1593 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1594 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1596 remmina_plugin_service->
get_server_port(s, 443, &gateway_host, &gateway_port);
1597 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayHostname, gateway_host);
1598 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GatewayPort, gateway_port);
1599 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, TRUE);
1600 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, TRUE);
1603 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain")) {
1604 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"));
1605 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1608 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_username")) {
1609 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"));
1610 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1613 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_password");
1615 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s);
1616 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1620 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled) && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials)) {
1621 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, freerdp_settings_get_string(rfi->
settings, FreeRDP_Domain));
1622 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, freerdp_settings_get_string(rfi->
settings, FreeRDP_Username));
1623 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, freerdp_settings_get_string(rfi->
settings, FreeRDP_Password));
1626 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled))
1627 freerdp_set_gateway_usage_method(rfi->
settings,
1628 remmina_plugin_service->
file_get_int(remminafile,
"gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT);
1630 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayAccessToken,
1631 remmina_plugin_service->
file_get_string(remminafile,
"gatewayaccesstoken"));
1633 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->
file_get_int(
1634 remminafile,
"authentication level", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_AuthenticationLevel)));
1637 freerdp_settings_set_bool(rfi->
settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->
file_get_int(remminafile,
"cert_ignore", 0));
1638 freerdp_settings_set_bool(rfi->
settings, FreeRDP_OldLicenseBehaviour, remmina_plugin_service->
file_get_int(remminafile,
"old-license", 0));
1639 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AllowUnanouncedOrdersFromServer, remmina_plugin_service->
file_get_int(remminafile,
"relax-order-checks", 0));
1640 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GlyphSupportLevel, (remmina_plugin_service->
file_get_int(remminafile,
"glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE));
1642 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientname")))
1643 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, cs);
1645 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, g_get_host_name());
1648 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientbuild"))) {
1650 UINT32 val = strtoul(cs, NULL, 0);
1651 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ClientBuild, val);
1656 if (remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo")) {
1657 char *tmp = strdup(remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo"));
1658 rfi->
settings->LoadBalanceInfo = (BYTE *)tmp;
1660 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_LoadBalanceInfoLength, strlen(tmp));
1664 freerdp_settings_set_string(rfi->
settings, FreeRDP_AlternateShell, remmina_plugin_service->
file_get_string(remminafile,
"exec"));
1667 freerdp_settings_set_string(rfi->
settings, FreeRDP_ShellWorkingDirectory, remmina_plugin_service->
file_get_string(remminafile,
"execpath"));
1669 sm = g_strdup_printf(
"rdp_quality_%i", remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0));
1673 if (value && value[0]) {
1674 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, strtoul(value, NULL, 16));
1676 switch (remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0)) {
1678 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_9);
1682 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_2);
1686 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_1);
1691 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_0);
1697 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"network"))) {
1700 if (g_strcmp0(cs,
"modem") == 0)
1701 type = CONNECTION_TYPE_MODEM;
1702 else if (g_strcmp0(cs,
"broadband") == 0)
1703 type = CONNECTION_TYPE_BROADBAND_HIGH;
1704 else if (g_strcmp0(cs,
"broadband-low") == 0)
1705 type = CONNECTION_TYPE_BROADBAND_LOW;
1706 else if (g_strcmp0(cs,
"broadband-high") == 0)
1707 type = CONNECTION_TYPE_BROADBAND_HIGH;
1708 else if (g_strcmp0(cs,
"wan") == 0)
1709 type = CONNECTION_TYPE_WAN;
1710 else if (g_strcmp0(cs,
"lan") == 0)
1711 type = CONNECTION_TYPE_LAN;
1712 else if ((g_strcmp0(cs,
"autodetect") == 0))
1713 type = CONNECTION_TYPE_AUTODETECT;
1714 else if ((g_strcmp0(cs,
"none") == 0))
1715 type = REMMINA_CONNECTION_TYPE_NONE;
1717 type = REMMINA_CONNECTION_TYPE_NONE;
1720 REMMINA_PLUGIN_DEBUG(
"Network settings not set");
1727 freerdp_performance_flags_split(rfi->
settings);
1729 #ifdef GDK_WINDOWING_X11 1730 #if FREERDP_CHECK_VERSION(2, 3, 0) 1732 if (rdp_kbd_remap != NULL) {
1733 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap);
1734 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1735 g_free(rdp_kbd_remap);
1738 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->
pref_get_value(
"rdp_kbd_remap"));
1739 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1746 if (remmina_plugin_service->
file_get_int(remminafile,
"console", FALSE))
1747 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1749 if (remmina_plugin_service->
file_get_int(remminafile,
"restricted-admin", FALSE)) {
1750 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1751 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1755 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1756 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1757 freerdp_settings_set_string(rfi->
settings, FreeRDP_PasswordHash, remmina_plugin_service->
file_get_string(remminafile,
"pth"));
1758 remmina_plugin_service->
file_set_int(remminafile,
"restricted-admin", TRUE);
1761 cs = remmina_plugin_service->
file_get_string(remminafile,
"security");
1762 if (g_strcmp0(cs,
"rdp") == 0) {
1763 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, TRUE);
1764 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1765 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1766 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1767 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseRdpSecurityLayer, TRUE);
1768 }
else if (g_strcmp0(cs,
"tls") == 0) {
1769 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1770 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, TRUE);
1771 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1772 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1773 }
else if (g_strcmp0(cs,
"nla") == 0) {
1774 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1775 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1776 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, TRUE);
1777 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1778 }
else if (g_strcmp0(cs,
"ext") == 0) {
1779 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1780 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1781 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1782 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, TRUE);
1785 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NegotiateSecurityLayer, TRUE);
1788 cs = remmina_plugin_service->
file_get_string(remminafile,
"tls-seclevel");
1789 if (cs && g_strcmp0(cs,
"")!=0) {
1791 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TlsSecLevel, i);
1794 freerdp_settings_set_bool(rfi->
settings, FreeRDP_CompressionEnabled, TRUE);
1795 if (remmina_plugin_service->
file_get_int(remminafile,
"disable_fastpath", FALSE)) {
1796 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, FALSE);
1797 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, FALSE);
1799 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, TRUE);
1800 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1806 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_DesktopOrientation, desktopOrientation);
1807 if (desktopScaleFactor != 0 && deviceScaleFactor != 0) {
1808 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopScaleFactor, desktopScaleFactor);
1809 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DeviceScaleFactor, deviceScaleFactor);
1815 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportDisplayControl, TRUE);
1817 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportDisplayControl)) {
1823 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1826 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1833 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1838 if (g_strcmp0(cs,
"remote") == 0) {
1839 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, TRUE);
1840 }
else if (g_str_has_prefix(cs,
"local")) {
1841 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, TRUE);
1842 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1845 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, FALSE);
1846 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, FALSE);
1849 cs = remmina_plugin_service->
file_get_string(remminafile,
"microphone");
1850 if (cs != NULL && cs[0] !=
'\0') {
1851 if (g_strcmp0(cs,
"0") == 0) {
1852 REMMINA_PLUGIN_DEBUG(
"“microphone” was set to 0, setting to \"\"");
1853 remmina_plugin_service->
file_set_string(remminafile,
"microphone",
"");
1855 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1856 REMMINA_PLUGIN_DEBUG(
"“microphone” set to “%s”", cs);
1862 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1867 cs = remmina_plugin_service->
file_get_string(remminafile,
"audio-output");
1868 if (cs != NULL && cs[0] !=
'\0') {
1869 REMMINA_PLUGIN_DEBUG(
"audio output set to %s", cs);
1874 status = freerdp_client_add_static_channel(rfi->
settings, count, p);
1876 status = freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1881 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_level");
1882 if (cs != NULL && cs[0] !=
'\0')
1883 REMMINA_PLUGIN_DEBUG(
"Log level set to to %s", cs);
1885 cs = g_strdup(
"INFO");
1886 wLog *root = WLog_GetRoot();
1887 WLog_SetStringLogLevel(root, cs);
1889 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_filters");
1890 if (cs != NULL && cs[0] !=
'\0') {
1891 REMMINA_PLUGIN_DEBUG(
"Log filters set to to %s", cs);
1892 WLog_AddStringLogFilters(cs);
1894 WLog_AddStringLogFilters(NULL);
1899 if (cs != NULL && cs[0] !=
'\0') {
1903 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1908 if (cs != NULL && cs[0] !=
'\0') {
1912 freerdp_client_add_static_channel(rfi->
settings, count, p);
1917 if (cs != NULL && cs[0] !=
'\0') {
1921 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1926 if (cs != NULL && cs[0] !=
'\0') {
1927 g_free(rfi->
settings->RDP2TCPArgs);
1928 rfi->
settings->RDP2TCPArgs = g_strdup(cs);
1929 REMMINA_PLUGIN_DEBUG(
"rdp2tcp set to %s", rfi->
settings->RDP2TCPArgs);
1933 int vermaj, vermin, verrev;
1934 freerdp_get_version(&vermaj, &vermin, &verrev);
1936 #if FREERDP_CHECK_VERSION(2, 1, 0) 1938 if (cs != NULL && cs[0] !=
'\0') {
1939 const gchar *endptr = NULL;
1940 guint64 val = g_ascii_strtoull(cs, (gchar **)&endptr, 10);
1941 if (val > 600000 || val <= 0)
1943 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TcpAckTimeout, (UINT32)val);
1947 if (remmina_plugin_service->
file_get_int(remminafile,
"preferipv6", FALSE) ? TRUE : FALSE)
1948 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PreferIPv6OverIPv4, TRUE);
1950 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectClipboard, remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ? FALSE : TRUE);
1952 cs = remmina_plugin_service->
file_get_string(remminafile,
"sharefolder");
1953 if (cs != NULL && cs[0] !=
'\0') {
1954 gchar *ccs = g_strdup(cs);
1955 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrating] - Old sharefolder %s to \"drive \"", ccs);
1957 remmina_plugin_service->
file_set_string(remminafile,
"drive", g_strdup(ccs));
1958 remmina_plugin_service->
file_set_string(remminafile,
"sharefolder", NULL);
1959 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrated] - drive set to %s", g_strdup(ccs));
1969 if (cs != NULL && cs[0] !=
'\0') {
1970 REMMINA_PLUGIN_DEBUG(
"Redirect directory set to %s", cs);
1974 gchar **folders = g_strsplit(cs,
";", -1);
1975 for (i = 0; folders[i] != NULL; i++) {
1976 REMMINA_PLUGIN_DEBUG(
"Parsing folder %s", folders[i]);
1978 status = freerdp_client_add_device_channel(rfi->
settings, count, p);
1981 g_strfreev(folders);
1984 if (remmina_plugin_service->
file_get_int(remminafile,
"shareprinter", FALSE)) {
1986 REMMINA_PLUGIN_DEBUG(
"Sharing printers");
1987 const gchar *po = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
1988 if (po && po[0] != 0) {
1991 REMMINA_PLUGIN_DEBUG(
"All printers have been shared");
1993 REMMINA_PLUGIN_DEBUG(
"Cannot share printers, are there any available?");
2000 freerdp_client_add_device_channel(rfi->
settings, dcount, d);
2005 if (remmina_plugin_service->
file_get_int(remminafile,
"span", FALSE)) {
2006 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SpanMonitors, TRUE);
2007 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2008 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2009 remmina_plugin_service->
file_set_int(remminafile,
"multimon", 1);
2012 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2013 guint32 maxwidth = 0;
2014 guint32 maxheight = 0;
2017 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2019 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2020 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2022 gchar *monitorids_string = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"monitorids"));
2027 if (monitorids_string != NULL && monitorids_string[0] !=
'\0') {
2028 if (g_strstr_len(monitorids_string, -1,
",") != NULL) {
2029 if (g_strstr_len(monitorids_string, -1,
":") != NULL) {
2030 rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
2034 temp_items = g_strsplit(monitorids_string,
",", -1);
2035 for (i = 0; i < g_strv_length(temp_items); i++) {
2036 rot_items = g_strsplit(temp_items[i],
":", -1);
2037 rdpMonitor *current = &base[atoi(rot_items[0])];
2039 monitorids = g_strdup(rot_items[0]);
2041 monitorids = g_strdup_printf(
"%s,%s", monitorids, rot_items[0]);
2042 current->attributes.orientation = atoi(rot_items[1]);
2043 REMMINA_PLUGIN_DEBUG(
"Monitor n %d orientation: %d", i, current->attributes.orientation);
2046 monitorids = g_strdup(monitorids_string);
2049 monitorids = g_strdup(monitorids_string);
2052 monitorids = g_strdup(monitorids_string);
2055 if (monitorids != NULL && monitorids[0] !=
'\0') {
2056 UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorIds);
2058 items = g_strsplit(monitorids,
",", -1);
2059 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_NumMonitorIds, g_strv_length(items));
2060 REMMINA_PLUGIN_DEBUG(
"NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_NumMonitorIds));
2061 for (i = 0; i < g_strv_length(items); i++) {
2062 UINT32 *current = &base[i];
2063 *current = atoi(items[i]);
2064 REMMINA_PLUGIN_DEBUG(
"Added monitor with ID %" PRIu32, *current);
2069 if (maxwidth && maxheight) {
2070 REMMINA_PLUGIN_DEBUG(
"Setting DesktopWidth and DesktopHeight to: %dx%d", maxwidth, maxheight);
2071 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, maxwidth);
2072 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, maxheight);
2073 REMMINA_PLUGIN_DEBUG(
"DesktopWidth and DesktopHeight set to: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2075 REMMINA_PLUGIN_DEBUG(
"Cannot set Desktop Size, we are using the previously set values: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2081 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"smartcardname");
2082 if (remmina_plugin_service->
file_get_int(remminafile,
"sharesmartcard", FALSE) ||
2083 (sn != NULL && sn[0] !=
'\0')) {
2084 RDPDR_SMARTCARD *smartcard;
2085 smartcard = (RDPDR_SMARTCARD *)calloc(1,
sizeof(RDPDR_SMARTCARD));
2087 #ifdef WITH_FREERDP3 2089 sdev = &(smartcard->device);
2091 RDPDR_SMARTCARD *sdev;
2095 sdev->Type = RDPDR_DTYP_SMARTCARD;
2097 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2099 if (sn != NULL && sn[0] !=
'\0')
2100 sdev->Name = _strdup(sn);
2102 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSmartCards, TRUE);
2104 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)smartcard);
2107 if (remmina_plugin_service->
file_get_int(remminafile,
"passwordispin", FALSE))
2110 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PasswordIsSmartcardPin, TRUE);
2113 if (remmina_plugin_service->
file_get_int(remminafile,
"shareserial", FALSE)) {
2114 RDPDR_SERIAL *serial;
2115 serial = (RDPDR_SERIAL *)calloc(1,
sizeof(RDPDR_SERIAL));
2117 #ifdef WITH_FREERDP3 2119 sdev = &(serial->device);
2125 sdev->Type = RDPDR_DTYP_SERIAL;
2127 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2129 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"serialname");
2130 if (sn != NULL && sn[0] !=
'\0')
2131 sdev->Name = _strdup(sn);
2133 const gchar *sd = remmina_plugin_service->
file_get_string(remminafile,
"serialdriver");
2134 if (sd != NULL && sd[0] !=
'\0')
2135 serial->Driver = _strdup(sd);
2137 const gchar *sp = remmina_plugin_service->
file_get_string(remminafile,
"serialpath");
2138 if (sp != NULL && sp[0] !=
'\0')
2139 serial->Path = _strdup(sp);
2141 if (remmina_plugin_service->
file_get_int(remminafile,
"serialpermissive", FALSE))
2142 serial->Permissive = _strdup(
"permissive");
2144 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSerialPorts, TRUE);
2146 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)serial);
2149 if (remmina_plugin_service->
file_get_int(remminafile,
"shareparallel", FALSE)) {
2150 RDPDR_PARALLEL *parallel;
2151 parallel = (RDPDR_PARALLEL *)calloc(1,
sizeof(RDPDR_PARALLEL));
2153 #ifdef WITH_FREERDP3 2155 pdev = &(parallel->device);
2157 RDPDR_PARALLEL *pdev;
2161 pdev->Type = RDPDR_DTYP_PARALLEL;
2163 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2165 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectParallelPorts, TRUE);
2167 const gchar *pn = remmina_plugin_service->
file_get_string(remminafile,
"parallelname");
2168 if (pn != NULL && pn[0] !=
'\0')
2169 pdev->Name = _strdup(pn);
2170 const gchar *dp = remmina_plugin_service->
file_get_string(remminafile,
"parallelpath");
2171 if (dp != NULL && dp[0] !=
'\0')
2172 parallel->Path = _strdup(dp);
2174 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)parallel);
2180 if (remmina_plugin_service->
file_get_int(remminafile,
"multitransport", FALSE)) {
2181 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2182 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportMultitransport, TRUE);
2183 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags,
2184 (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED));
2186 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags, 0);
2193 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, NULL);
2194 freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, NULL);
2195 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, NULL);
2197 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, NULL);
2198 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, NULL);
2199 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, NULL);
2201 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
2206 if (!freerdp_connect(rfi->
instance)) {
2211 e = freerdp_get_last_error(rfi->
instance->context);
2214 case FREERDP_ERROR_AUTHENTICATION_FAILED:
2215 case STATUS_LOGON_FAILURE:
2216 #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE 2217 case FREERDP_ERROR_CONNECT_LOGON_FAILURE:
2222 case STATUS_ACCOUNT_LOCKED_OUT:
2223 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT 2224 case FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT:
2227 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2229 case STATUS_ACCOUNT_EXPIRED:
2230 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED 2231 case FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED:
2234 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2236 case STATUS_PASSWORD_EXPIRED:
2237 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED 2238 case FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED:
2241 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2243 case STATUS_ACCOUNT_DISABLED:
2244 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED 2245 case FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED:
2248 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2250 #ifdef FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES 2252 case FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES:
2253 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nInsufficient user privileges."),
2254 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2257 case STATUS_ACCOUNT_RESTRICTION:
2258 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION 2259 case FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION:
2262 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2265 case STATUS_PASSWORD_MUST_CHANGE:
2266 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE 2267 case FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE:
2269 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nChange user password before connecting."),
2270 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2273 case FREERDP_ERROR_CONNECT_FAILED:
2274 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Lost connection to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2276 case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
2277 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not find the address for the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2279 case FREERDP_ERROR_TLS_CONNECT_FAILED:
2281 _(
"Could not connect to the RDP server “%s” via TLS. See the DEBUG traces from a terminal for more information."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2283 case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
2285 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Unable to establish a connection to the RDP server “%s”. Check “Security protocol negotiation”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2287 #ifdef FREERDP_ERROR_POST_CONNECT_FAILED 2288 case FREERDP_ERROR_POST_CONNECT_FAILED:
2291 case REMMINA_POSTCONNECT_ERROR_OK:
2293 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2295 case REMMINA_POSTCONNECT_ERROR_GDI_INIT:
2298 case REMMINA_POSTCONNECT_ERROR_NO_H264:
2299 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"You requested a H.264 GFX mode for the server “%s”, but your libfreerdp does not support H.264. Please use a non-AVC colour depth setting."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2304 #ifdef FREERDP_ERROR_SERVER_DENIED_CONNECTION 2305 case FREERDP_ERROR_SERVER_DENIED_CONNECTION:
2306 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The “%s” server refused the connection."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2311 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The Remote Desktop Gateway “%s” denied the user “%s\\%s” access due to policy."),
2312 freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayHostname), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayDomain), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayUsername));
2315 case FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS:
2320 g_printf(
"libfreerdp returned code is %08X\n", e);
2321 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the “%s” RDP server."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2329 if (GET_PLUGIN_DATA(rfi->
protocol_widget) == NULL) orphaned =
true;
else orphaned =
false;
2330 if (!orphaned && freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS && !rfi->
user_cancelled)
2351 freerdp_abort_connect(instance);
2357 RDP_CLIENT_ENTRY_POINTS *pEntryPoints = instance->pClientEntryPoints;
2359 IFCALL(pEntryPoints->GlobalUninit);
2360 free(instance->pClientEntryPoints);
2361 freerdp_context_free(instance);
2362 freerdp_free(instance);
2368 TRACE_CALL(__func__);
2379 if (GET_PLUGIN_DATA(gp) == NULL) orphaned =
true;
else orphaned =
false;
2384 if (!orphaned) g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2393 return G_SOURCE_REMOVE;
2398 TRACE_CALL(__func__);
2402 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
2407 rfi = GET_PLUGIN_DATA(gp);
2425 TRACE_CALL(__func__);
2429 instance = freerdp_new();
2440 instance->ContextSize =
sizeof(
rfContext);
2441 freerdp_context_new(instance);
2444 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", rfi, free);
2448 rfi->
settings = instance->settings;
2454 freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
2461 TRACE_CALL(__func__);
2464 const gchar *profile_name, *p;
2465 gchar thname[16], c;
2475 "Could not start pthread.");
2483 profile_name = remmina_plugin_service->
file_get_string(remminafile,
"name");
2485 strcpy(thname,
"RemmRDP:");
2487 nthname = strlen(thname);
2488 while ((c = *p) != 0 && nthname <
sizeof(thname) - 1) {
2490 thname[nthname++] = c;
2494 strcat(thname,
"<NONAM>");
2495 nthname = strlen(thname);
2497 thname[nthname] = 0;
2498 #if defined(__linux__) 2500 #elif defined(__FreeBSD__) 2509 TRACE_CALL(__func__);
2511 REMMINA_PLUGIN_DEBUG(
"Requesting to close the connection");
2516 g_warning(
"WARNING: %s called on a subthread, which may not work or crash Remmina.", __func__);
2524 g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2531 REMMINA_PLUGIN_DEBUG(
"[RDP] requesting clipboard transfer to abort");
2551 TRACE_CALL(__func__);
2557 TRACE_CALL(__func__);
2560 switch (feature->
id) {
2561 case REMMINA_RDP_FEATURE_UNFOCUS:
2565 case REMMINA_RDP_FEATURE_SCALE:
2570 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_SCALE");
2574 case REMMINA_RDP_FEATURE_MULTIMON:
2577 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2578 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2580 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2581 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2585 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_MULTIMON");
2589 case REMMINA_RDP_FEATURE_DYNRESUPDATE:
2592 case REMMINA_RDP_FEATURE_TOOL_REFRESH:
2598 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_TOOL_REFRESH");
2601 case REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL:
2613 TRACE_CALL(__func__);
2617 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
2627 UINT32 bytesPerPixel;
2628 UINT32 bitsPerPixel;
2633 gdi = ((rdpContext *)rfi)->gdi;
2635 bytesPerPixel = GetBytesPerPixel(gdi->hdc->format);
2636 bitsPerPixel = GetBitsPerPixel(gdi->hdc->format);
2641 szmem = gdi->width * gdi->height * bytesPerPixel;
2643 REMMINA_PLUGIN_DEBUG(
"allocating %zu bytes for a full screenshot", szmem);
2644 rpsd->
buffer = malloc(szmem);
2646 REMMINA_PLUGIN_DEBUG(
"could not set aside %zu bytes for a full screenshot", szmem);
2649 rpsd->
width = gdi->width;
2650 rpsd->
height = gdi->height;
2654 memcpy(rpsd->
buffer, gdi->primary_buffer, szmem);
2664 "99",
N_(
"Automatic (32 bpp) (Server chooses its best format)"),
2665 "66",
N_(
"GFX AVC444 (32 bpp)"),
2666 "65",
N_(
"GFX AVC420 (32 bpp)"),
2667 "64",
N_(
"GFX RFX (32 bpp)"),
2668 "63",
N_(
"GFX RFX Progressive (32 bpp)"),
2669 "0",
N_(
"RemoteFX (32 bpp)"),
2670 "32",
N_(
"True colour (32 bpp)"),
2671 "24",
N_(
"True colour (24 bpp)"),
2672 "16",
N_(
"High colour (16 bpp)"),
2673 "15",
N_(
"High colour (15 bpp)"),
2674 "8",
N_(
"256 colours (8 bpp)"),
2695 "0",
N_(
"Poor (fastest)"),
2698 "9",
N_(
"Best (slowest)"),
2706 "autodetect",
N_(
"Auto-detect"),
2707 "modem",
N_(
"Modem"),
2708 "broadband-low",
N_(
"Low performance broadband"),
2709 "satellite",
N_(
"Satellite"),
2710 "broadband-high",
N_(
"High performance broadband"),
2720 "local",
N_(
"Local"),
2721 "remote",
N_(
"Remote"),
2728 "",
N_(
"Automatic negotiation"),
2729 "nla",
N_(
"NLA protocol security"),
2730 "tls",
N_(
"TLS protocol security"),
2731 "rdp",
N_(
"RDP protocol security"),
2732 "ext",
N_(
"NLA extended protocol security"),
2747 "0",
N_(
"0 — Windows 7 compatible"),
2757 N_(
"2600 (Windows XP), 7601 (Windows Vista/7), 9600 (Windows 8 and newer)");
2760 N_(
"Used i.a. by terminal services in a smart card channel to distinguish client capabilities:\n" 2761 " • < 4034: Windows XP base smart card functions\n" 2762 " • 4034-7064: Windows Vista/7: SCardReadCache(),\n" 2763 " SCardWriteCache(), SCardGetTransmitCount()\n" 2764 " • >= 7065: Windows 8 and newer: SCardGetReaderIcon(),\n" 2765 " SCardGetDeviceTypeId()");
2768 N_(
"Options for redirection of audio input:\n" 2769 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2770 " [channel:<channel>] Audio input (microphone)\n" 2773 " • sys:oss,dev:1,format:1\n" 2777 N_(
"Options for redirection of audio output:\n" 2778 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2779 " [channel:<channel>] Audio output\n" 2782 " • sys:oss,dev:1,format:1\n" 2787 N_(
"Options for redirection of USB device:\n" 2788 " • [dbg,][id:<vid>:<pid>#…,][addr:<bus>:<addr>#…,][auto]\n" 2790 " • id:054c:0268#4669:6e6b,addr:04:0c");
2793 N_(
"Advanced setting for high latency links:\n" 2794 "Adjusts the connection timeout. Use if your connection times out.\n" 2795 "The highest possible value is 600000 ms (10 minutes).\n");
2798 N_(
"Performance optimisations based on the network connection type:\n" 2799 "Using auto-detection is advised.\n" 2800 "If “Auto-detect” fails, choose the most appropriate option in the list.\n");
2803 N_(
"Comma-separated list of monitor IDs and desktop orientations:\n" 2804 " • [<id>:<orientation-in-degrees>,]\n" 2807 "Orientations are specified in degrees, valid values are:\n" 2808 " • 0 (landscape)\n" 2809 " • 90 (portrait)\n" 2810 " • 180 (landscape flipped)\n" 2811 " • 270 (portrait flipped)\n" 2815 N_(
"Redirect directory <path> as named share <name>.\n" 2816 " • <name>,<fullpath>[;<name>,<fullpath>[;…]]\n" 2817 " • MyHome,/home/remminer\n" 2818 " • /home/remminer\n" 2819 " • MyHome,/home/remminer;SomePath,/path/to/somepath\n" 2820 "Hotplug support is enabled with:\n" 2893 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"printer_overrides",
N_(
"Override printer drivers"), FALSE, NULL,
N_(
"\"Samsung_CLX-3300_Series\":\"Samsung CLX-3300 Series PS\";\"Canon MF410\":\"Canon MF410 Series UFR II\"") },
2904 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"rdp_reconnect_attempts",
N_(
"Reconnect attempts number"), FALSE, NULL,
N_(
"The maximum number of reconnect attempts upon an RDP disconnect (default: 20)") },
2919 #if defined(PROXY_TYPE_IGNORE) 2927 #if FREERDP_CHECK_VERSION(2, 3, 1) 2957 N_(
"RDP - Remote Desktop Protocol"),
2960 "org.remmina.Remmina-rdp-symbolic",
2961 "org.remmina.Remmina-rdp-ssh-symbolic",
2982 N_(
"RDP - RDP File Handler"),
2997 N_(
"RDP - Preferences"),
3006 TRACE_CALL(__func__);
3010 p = strcasestr(bc, option);
3014 if (p > bc && *(p - 1) >
' ')
3017 n = p + strlen(option);
3026 int vermaj, vermin, verrev;
3028 TRACE_CALL(__func__);
3029 remmina_plugin_service = service;
3033 freerdp_get_version(&vermaj, &vermin, &verrev);
3034 if (vermaj < FREERDP_REQUIRED_MAJOR ||
3035 (vermaj == FREERDP_REQUIRED_MAJOR && (vermin < FREERDP_REQUIRED_MINOR ||
3036 (vermin == FREERDP_REQUIRED_MINOR && verrev < FREERDP_REQUIRED_REVISION)))) {
3037 g_printf(
"Upgrade your FreeRDP library version from %d.%d.%d to at least libfreerdp %d.%d.%d " 3038 "to run the RDP plugin.\n",
3039 vermaj, vermin, verrev,
3040 FREERDP_REQUIRED_MAJOR, FREERDP_REQUIRED_MINOR, FREERDP_REQUIRED_REVISION);
3044 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
3045 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
3050 remmina_rdpf.
export_hints = _(
"Export connection in Windows .rdp file format");
3065 gpointer *src, *dst;
3068 if (strcmp(*src,
"66") != 0 && strcmp(*src,
"65") != 0) {
3071 *(dst + 1) = *(src + 1);
3081 "RDP plugin: %s (Git %s), Compiled with libfreerdp %s (%s), Running with libfreerdp %s (rev %s), H.264 %s",
3082 VERSION, REMMINA_GIT_REVISION,
3083 #ifdef WITH_FREERDP3
3084 FREERDP_VERSION_FULL, FREERDP_GIT_REVISION,
3086 FREERDP_VERSION_FULL, GIT_REVISION,
3088 freerdp_get_version_string(),
3089 freerdp_get_build_revision(),
CliprdrClientContext * context
+
Go to the documentation of this file. 55 #ifdef GDK_WINDOWING_X11 56 #include <cairo/cairo-xlib.h> 58 #include <cairo/cairo.h> 60 #include <freerdp/addin.h> 61 #include <freerdp/assistance.h> 62 #include <freerdp/settings.h> 63 #include <freerdp/freerdp.h> 64 #include <freerdp/constants.h> 65 #include <freerdp/client/cliprdr.h> 66 #include <freerdp/client/channels.h> 67 #include <freerdp/client/cmdline.h> 68 #include <freerdp/error.h> 69 #include <freerdp/event.h> 70 #include <winpr/memory.h> 71 #include <winpr/cmdline.h> 75 #include <cups/cups.h> 81 #ifdef GDK_WINDOWING_X11 83 #include <X11/XKBlib.h> 85 #elif defined(GDK_WINDOWING_WAYLAND) 86 #include <gdk/gdkwayland.h> 89 #if defined(__FreeBSD__) 90 #include <pthread_np.h> 93 #include <freerdp/locale/keyboard.h> 95 #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 96 #define REMMINA_RDP_FEATURE_SCALE 2 97 #define REMMINA_RDP_FEATURE_UNFOCUS 3 98 #define REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL 4 99 #define REMMINA_RDP_FEATURE_DYNRESUPDATE 5 100 #define REMMINA_RDP_FEATURE_MULTIMON 6 101 #define REMMINA_RDP_FEATURE_VIEWONLY 7 103 #define REMMINA_CONNECTION_TYPE_NONE 0 106 #define CLPARAM const char 125 TRACE_CALL(__func__);
126 #if FREERDP_CHECK_VERSION(2, 0, 0) 127 return (CLPARAM **)CommandLineParseCommaSeparatedValuesEx(name, list, count);
145 size_t len = strlen(name);
146 p = (
char **)calloc(2UL + len,
sizeof(
char *));
149 char *dst = (
char *)&p[1];
151 sprintf_s(dst, len + 1,
"%s", name);
161 const char *it = list;
163 while ((it = strchr(it,
',')) != NULL) {
174 prefix = (nArgs + 1UL) *
sizeof(
char *);
176 p = (
char **)calloc(len + prefix + 1,
sizeof(
char *));
181 str = &((
char *)p)[prefix];
182 memcpy(str, list, len);
187 for (index = name ? 1 : 0; index < nArgs; index++) {
188 char *comma = strchr(str,
',');
204 TRACE_CALL(__func__);
213 TRACE_CALL(__func__);
218 DISPLAY_CONTROL_MONITOR_LAYOUT *dcml;
219 CLIPRDR_FORMAT_DATA_RESPONSE response = { 0 };
230 switch (event->
type) {
232 flags =
event->key_event.extended ? KBD_FLAGS_EXTENDED : 0;
233 flags |=
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
234 input->KeyboardEvent(input, flags, event->
key_event.key_code);
241 flags =
event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN;
242 input->UnicodeKeyboardEvent(input, flags, event->
key_event.unicode_code);
247 input->ExtendedMouseEvent(input, event->
mouse_event.flags,
260 response.msgFlags = (
event->clipboard_formatdataresponse.data) ? CB_RESPONSE_OK : CB_RESPONSE_FAIL;
261 response.dataLen =
event->clipboard_formatdataresponse.size;
262 response.requestedFormatData =
event->clipboard_formatdataresponse.data;
267 REMMINA_PLUGIN_DEBUG(
"Sending client FormatDataRequest to server");
274 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
275 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
277 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
278 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
280 dcml = calloc(freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount),
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
281 REMMINA_PLUGIN_DEBUG(
"REMMINA_RDP_EVENT_TYPE_SEND_MONITOR_LAYOUT:");
285 const rdpMonitor *base = freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
286 for (gint i = 0; i < freerdp_settings_get_uint32(rfi->
settings, FreeRDP_MonitorCount); ++i) {
287 const rdpMonitor *current = &base[i];
288 REMMINA_PLUGIN_DEBUG(
"Sending display layout for monitor n° %d", i);
289 dcml[i].Flags = (current->is_primary ? DISPLAY_CONTROL_MONITOR_PRIMARY : 0);
290 REMMINA_PLUGIN_DEBUG(
"Monitor %d is primary: %d", i, dcml[i].Flags);
291 dcml[i].Left = current->x;
292 REMMINA_PLUGIN_DEBUG(
"Monitor %d x: %d", i, dcml[i].Left);
293 dcml[i].Top = current->y;
294 REMMINA_PLUGIN_DEBUG(
"Monitor %d y: %d", i, dcml[i].Top);
295 dcml[i].Width = current->width;
296 REMMINA_PLUGIN_DEBUG(
"Monitor %d width: %d", i, dcml[i].Width);
297 dcml[i].Height = current->height;
298 REMMINA_PLUGIN_DEBUG(
"Monitor %d height: %d", i, dcml[i].Height);
299 dcml[i].PhysicalWidth = current->attributes.physicalWidth;
300 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical width: %d", i, dcml[i].PhysicalWidth);
301 dcml[i].PhysicalHeight = current->attributes.physicalHeight;
302 REMMINA_PLUGIN_DEBUG(
"Monitor %d physical height: %d", i, dcml[i].PhysicalHeight);
303 if (current->attributes.orientation)
304 dcml[i].Orientation = current->attributes.orientation;
306 dcml[i].Orientation =
event->monitor_layout.desktopOrientation;
307 REMMINA_PLUGIN_DEBUG(
"Monitor %d orientation: %d", i, dcml[i].Orientation);
308 dcml[i].DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
309 dcml[i].DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
314 dcml = g_malloc0(
sizeof(DISPLAY_CONTROL_MONITOR_LAYOUT));
316 dcml->Flags = DISPLAY_CONTROL_MONITOR_PRIMARY;
317 dcml->Width =
event->monitor_layout.width;
318 dcml->Height =
event->monitor_layout.height;
319 dcml->Orientation =
event->monitor_layout.desktopOrientation;
320 dcml->DesktopScaleFactor =
event->monitor_layout.desktopScaleFactor;
321 dcml->DeviceScaleFactor =
event->monitor_layout.deviceScaleFactor;
329 freerdp_abort_connect(rfi->
instance);
341 TRACE_CALL(__func__);
357 REMMINA_PLUGIN_DEBUG(
"Tunnel init");
359 if (hostport == NULL)
367 REMMINA_PLUGIN_DEBUG(
"protocol_plugin_start_direct_tunnel() returned %s", hostport);
376 freerdp_settings_set_string(rfi->
settings, FreeRDP_ServerHostname, host);
378 if (cert_port == 3389) {
379 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, cert_host);
381 s = g_strdup_printf(
"%s:%d", cert_host, cert_port);
382 freerdp_settings_set_string(rfi->
settings, FreeRDP_CertificateName, s);
387 REMMINA_PLUGIN_DEBUG(
"Tunnel has been optionally initialized. Now connecting to %s:%d", host, port);
389 if (cert_host != host) g_free(cert_host);
393 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ServerPort, port);
400 TRACE_CALL(__func__);
401 rdpSettings *settings = rfi->
instance->settings;
414 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
415 REMMINA_PLUGIN_DEBUG(
"maxattempts from default: %d", maxattempts);
417 if ((cval = remmina_plugin_service->
pref_get_value(
"rdp_reconnect_attempts")) != NULL)
418 maxattempts = atoi(cval);
419 REMMINA_PLUGIN_DEBUG(
"maxattempts from general preferences: %d", maxattempts);
421 maxattempts = remmina_plugin_service->
file_get_int(remminafile,
"rdp_reconnect_attempts", maxattempts);
422 REMMINA_PLUGIN_DEBUG(
"maxattempts from general plugin: %d", maxattempts);
424 if (maxattempts <= 0)
425 maxattempts = freerdp_settings_get_uint32(settings, FreeRDP_AutoReconnectMaxRetries);
426 freerdp_settings_set_uint32(settings, FreeRDP_AutoReconnectMaxRetries, maxattempts);
427 REMMINA_PLUGIN_DEBUG(
"maxattempts set to: %d", maxattempts);
433 switch (freerdp_error_info(rfi->
instance)) {
434 case ERRINFO_GRAPHICS_SUBSYSTEM_FAILED:
437 case ERRINFO_SUCCESS:
445 if (!freerdp_settings_get_bool(settings, FreeRDP_AutoReconnectionEnabled)) {
452 REMMINA_PLUGIN_DEBUG(
"[%s] network disconnection detected, initiating reconnection attempt",
453 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
469 REMMINA_PLUGIN_DEBUG(
"[%s] maximum number of reconnection attempts exceeded.",
470 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
475 REMMINA_PLUGIN_DEBUG(
"[%s] reconnect request loop interrupted by user.",
476 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
481 REMMINA_PLUGIN_DEBUG(
"[%s] reconnection, attempt #%d of %d",
488 treconn = time(NULL);
492 REMMINA_PLUGIN_DEBUG(
"[%s] unable to recreate tunnel with remmina_rdp_tunnel_init.",
493 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
495 if (freerdp_reconnect(rfi->
instance)) {
497 REMMINA_PLUGIN_DEBUG(
"[%s] reconnected.", freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
504 while (time(NULL) - treconn < 5) {
517 TRACE_CALL(__func__);
524 if (!gdi || !gdi->primary || !gdi->primary->hdc || !gdi->primary->hdc->hwnd)
532 TRACE_CALL(__func__);
543 if (gdi == NULL || gdi->primary == NULL || gdi->primary->hdc == NULL || gdi->primary->hdc->hwnd == NULL)
546 if (gdi->primary->hdc->hwnd->invalid->null)
549 if (gdi->primary->hdc->hwnd->ninvalid < 1)
552 ninvalid = gdi->primary->hdc->hwnd->ninvalid;
553 cinvalid = gdi->primary->hdc->hwnd->cinvalid;
555 for (i = 0; i < ninvalid; i++) {
556 reg[i].
x = cinvalid[i].x;
557 reg[i].
y = cinvalid[i].y;
558 reg[i].
w = cinvalid[i].w;
559 reg[i].
h = cinvalid[i].h;
564 ui->
reg.ninvalid = ninvalid;
570 gdi->primary->hdc->hwnd->invalid->null = TRUE;
571 gdi->primary->hdc->hwnd->ninvalid = 0;
579 TRACE_CALL(__func__);
588 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
589 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
600 gdi_resize(((rdpContext *)rfi)->gdi, w, h);
615 static BOOL
rf_play_sound(rdpContext *context,
const PLAY_SOUND_UPDATE *play_sound)
617 TRACE_CALL(__func__);
625 disp = gtk_widget_get_display(GTK_WIDGET(gp));
626 gdk_display_beep(disp);
633 TRACE_CALL(__func__);
640 disp = gtk_widget_get_display(GTK_WIDGET(gp));
642 #ifdef GDK_WINDOWING_X11 643 if (GDK_IS_X11_DISPLAY(disp)) {
645 Display *x11_display;
646 x11_display = gdk_x11_display_get_xdisplay(disp);
647 XkbLockModifiers(x11_display, XkbUseCoreKbd,
649 ((led_flags & KBD_SYNC_CAPS_LOCK) ? LockMask : 0) |
650 ((led_flags & KBD_SYNC_NUM_LOCK) ? Mod2Mask : 0)
663 TRACE_CALL(__func__);
674 TRACE_CALL(__func__);
675 rdpChannels *channels;
676 rdpSettings *settings;
677 rdpContext *context = instance->context;
679 settings = instance->settings;
680 channels = context->channels;
681 freerdp_settings_set_uint32(settings, FreeRDP_OsMajorType, OSMAJORTYPE_UNIX);
682 freerdp_settings_set_uint32(settings, FreeRDP_OsMinorType, OSMINORTYPE_UNSPECIFIED);
683 freerdp_settings_set_bool(settings, FreeRDP_BitmapCacheEnabled, TRUE);
684 freerdp_settings_set_uint32(settings, FreeRDP_OffscreenSupportLevel, 1);
686 PubSub_SubscribeChannelConnected(instance->context->pubSub,
688 PubSub_SubscribeChannelDisconnected(instance->context->pubSub,
691 if (!freerdp_client_load_addins(channels, settings))
699 TRACE_CALL(__func__);
703 UINT32 freerdp_local_color_format;
711 rfi->
srcBpp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth);
713 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) == FALSE)
718 REMMINA_PLUGIN_DEBUG(
"bpp: %d", rfi->
bpp);
721 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
722 freerdp_local_color_format = PIXEL_FORMAT_BGRX32;
730 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB24");
731 freerdp_local_color_format = PIXEL_FORMAT_BGRA32;
735 REMMINA_PLUGIN_DEBUG(
"CAIRO_FORMAT_RGB16_565");
736 freerdp_local_color_format = PIXEL_FORMAT_RGB16;
741 if (!gdi_init(instance, freerdp_local_color_format)) {
746 if (instance->context->codecs->h264 == NULL && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
774 TRACE_CALL(__func__);
775 gchar *s_username, *s_password, *s_domain;
780 gboolean disablepasswordstoring;
786 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
790 _(
"Enter RDP authentication credentials"),
795 if (ret == GTK_RESPONSE_OK) {
797 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, s_username);
800 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s_password);
803 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, s_domain);
805 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
806 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
813 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
815 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
819 if (s_username) g_free(s_username);
820 if (s_password) g_free(s_password);
821 if (s_domain) g_free(s_domain);
833 TRACE_CALL(__func__);
834 gchar *s_username, *s_password, *s_domain;
839 gboolean disablepasswordstoring;
840 gboolean basecredforgw;
847 if (!remmina_plugin_service->
file_get_string(remminafile,
"gateway_server"))
849 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
850 basecredforgw = remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE);
855 _(
"Enter RDP authentication credentials"),
863 _(
"Enter RDP gateway authentication credentials"),
864 remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"),
865 remmina_plugin_service->
file_get_string(remminafile,
"gateway_password"),
866 remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"),
871 if (ret == GTK_RESPONSE_OK) {
873 if (s_username) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, s_username);
876 if (s_password) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s_password);
879 if (s_domain) freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, s_domain);
884 remmina_plugin_service->
file_set_string(remminafile,
"username", s_username);
885 remmina_plugin_service->
file_set_string(remminafile,
"domain", s_domain);
887 remmina_plugin_service->
file_set_string(remminafile,
"password", s_password);
889 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
891 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", s_username);
892 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", s_domain);
894 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", s_password);
896 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
899 if (s_username) g_free(s_username);
900 if (s_password) g_free(s_password);
901 if (s_domain) g_free(s_domain);
912 const char *common_name,
const char *subject,
913 const char *issuer,
const char *fingerprint, DWORD flags)
915 TRACE_CALL(__func__);
925 if (status == GTK_RESPONSE_OK)
932 remmina_rdp_verify_certificate(freerdp *instance,
const char *common_name,
const char *subject,
const char *issuer,
const char *fingerprint, BOOL host_mismatch) __attribute__ ((unused));
935 const char *issuer,
const char *fingerprint, BOOL host_mismatch)
937 TRACE_CALL(__func__);
947 if (status == GTK_RESPONSE_OK)
954 const char *common_name,
const char *subject,
955 const char *issuer,
const char *fingerprint,
956 const char *old_subject,
const char *old_issuer,
957 const char *old_fingerprint, DWORD flags)
959 TRACE_CALL(__func__);
969 if (status == GTK_RESPONSE_OK)
977 TRACE_CALL(__func__);
979 if (!instance || !instance->context)
982 PubSub_UnsubscribeChannelConnected(instance->context->pubSub,
984 PubSub_UnsubscribeChannelDisconnected(instance->context->pubSub,
992 TRACE_CALL(__func__);
997 while (!freerdp_shall_disconnect(rfi->
instance)) {
998 HANDLE handles[64]={0};
999 DWORD nCount = freerdp_get_event_handles(rfi->
instance->context, &handles[0], 64);
1003 handles[nCount++] = rfi->
instance->context->abortEvent;
1006 fprintf(stderr,
"freerdp_get_event_handles failed\n");
1010 status = WaitForMultipleObjects(nCount, handles, FALSE, 100);
1012 if (status == WAIT_FAILED) {
1013 fprintf(stderr,
"WaitForMultipleObjects failed with %lu\n", (
unsigned long)status);
1019 fprintf(stderr,
"Could not process local keyboard/mouse event queue\n");
1022 if (read(rfi->
event_pipe[0], buf,
sizeof(buf))) {
1027 if (WaitForSingleObject(rfi->
instance->context->abortEvent, 0) == WAIT_OBJECT_0)
1031 if (!freerdp_check_event_handles(rfi->
instance->context)) {
1037 if (freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS)
1038 fprintf(stderr,
"Could not check FreeRDP file descriptor\n");
1042 const gchar *host = freerdp_settings_get_string (rfi->
settings, FreeRDP_ServerHostname);
1044 REMMINA_PLUGIN_AUDIT(_(
"Disconnected from %s via RDP"), host);
1046 REMMINA_PLUGIN_DEBUG(
"RDP client disconnected");
1051 TRACE_CALL(__func__);
1052 PVIRTUALCHANNELENTRY entry = NULL;
1053 PVIRTUALCHANNELENTRYEX entryEx = NULL;
1055 entryEx = (PVIRTUALCHANNELENTRYEX)(
void *)freerdp_load_channel_addin_entry(
1056 name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC | FREERDP_ADDIN_CHANNEL_ENTRYEX);
1059 entry = freerdp_load_channel_addin_entry(name, NULL, NULL, FREERDP_ADDIN_CHANNEL_STATIC);
1062 if (freerdp_channels_client_load_ex(channels, settings, entryEx, data) == 0) {
1063 fprintf(stderr,
"loading channel %s\n", name);
1067 if (freerdp_channels_client_load(channels, settings, entry, data) == 0) {
1068 fprintf(stderr,
"loading channel %s\n", name);
1087 S_WAITSEMICOLON } state = S_WAITPR;
1090 while ((c = *smap++) != 0) {
1093 if (c !=
'\"')
return NULL;
1094 state = S_INPRINTER;
1099 if (matching && c == *p && *p != 0) {
1101 }
else if (c ==
'\"') {
1104 state = S_WAITCOLON;
1112 state = S_WAITDRIVER;
1125 state = S_WAITSEMICOLON;
1128 case S_WAITSEMICOLON:
1139 p = (
char *)malloc(sz);
1171 const gchar *s = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
1173 RDPDR_PRINTER *printer;
1174 printer = (RDPDR_PRINTER *)calloc(1,
sizeof(RDPDR_PRINTER));
1176 #ifdef WITH_FREERDP3 1178 pdev = &(printer->device);
1180 RDPDR_PRINTER *pdev;
1184 pdev->Type = RDPDR_DTYP_PRINT;
1185 REMMINA_PLUGIN_DEBUG(
"Printer Type: %d", pdev->Type);
1187 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectPrinters, TRUE);
1188 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
1190 REMMINA_PLUGIN_DEBUG(
"Destination: %s", dest->name);
1191 if (!(pdev->Name = _strdup(dest->name))) {
1196 REMMINA_PLUGIN_DEBUG(
"Printer Name: %s", pdev->Name);
1201 printer->DriverName = strdup(d);
1202 REMMINA_PLUGIN_DEBUG(
"Printer DriverName set to: %s", printer->DriverName);
1216 printer->DriverName = _strdup(
"MS Publisher Imagesetter");
1219 REMMINA_PLUGIN_DEBUG(
"Printer Driver: %s", printer->DriverName);
1220 if (!freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)printer)) {
1221 free(printer->DriverName);
1234 TRACE_CALL(__func__);
1235 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
1239 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
1244 freerdp_settings_set_uint32(settings, FreeRDP_ConnectionType, type);
1246 if (type == CONNECTION_TYPE_MODEM) {
1247 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1248 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1249 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1250 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1251 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1252 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, TRUE);
1253 }
else if (type == CONNECTION_TYPE_BROADBAND_LOW) {
1254 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1255 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1256 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, FALSE);
1257 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1258 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1259 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1260 }
else if (type == CONNECTION_TYPE_SATELLITE) {
1261 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1262 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1263 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1264 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1265 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1266 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1267 }
else if (type == CONNECTION_TYPE_BROADBAND_HIGH) {
1268 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, TRUE);
1269 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, FALSE);
1270 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1271 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, TRUE);
1272 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, TRUE);
1273 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1274 }
else if (type == CONNECTION_TYPE_WAN) {
1275 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1276 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1277 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1278 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1279 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1280 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1281 }
else if (type == CONNECTION_TYPE_LAN) {
1282 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1283 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1284 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1285 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1286 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1287 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1288 }
else if (type == CONNECTION_TYPE_AUTODETECT) {
1289 freerdp_settings_set_bool(settings, FreeRDP_DisableWallpaper, FALSE);
1290 freerdp_settings_set_bool(settings, FreeRDP_AllowFontSmoothing, TRUE);
1291 freerdp_settings_set_bool(settings, FreeRDP_AllowDesktopComposition, TRUE);
1292 freerdp_settings_set_bool(settings, FreeRDP_DisableFullWindowDrag, FALSE);
1293 freerdp_settings_set_bool(settings, FreeRDP_DisableMenuAnims, FALSE);
1294 freerdp_settings_set_bool(settings, FreeRDP_DisableThemes, FALSE);
1295 freerdp_settings_set_bool(settings, FreeRDP_NetworkAutoDetect, TRUE);
1298 #ifdef WITH_GFX_H264 1302 freerdp_settings_set_bool(settings, FreeRDP_RemoteFxCodec, TRUE);
1303 freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1304 }
else if (type == REMMINA_CONNECTION_TYPE_NONE) {
1313 #ifdef GDK_WINDOWING_X11 1314 #if FREERDP_CHECK_VERSION(2, 3, 0) 1317 TRACE_CALL(__func__);
1320 gchar *rdp_kbd_remap = NULL;
1326 return rdp_kbd_remap;
1327 rdp_kbd_remap = g_malloc0(512);
1328 display = XOpenDisplay(0);
1329 for (i = 0; table[i] > 0; i += 2) {
1330 g_snprintf(keys,
sizeof(keys),
"0x%02x=0x%02x", freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i])),
1331 freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i + 1])));
1333 g_strlcat(rdp_kbd_remap,
",", 512);
1334 g_strlcat(rdp_kbd_remap, keys, 512);
1336 XCloseDisplay(display);
1338 return rdp_kbd_remap;
1345 TRACE_CALL(__func__);
1352 rdpChannels *channels;
1353 gchar *gateway_host;
1355 gchar *datapath = NULL;
1356 gboolean status = TRUE;
1357 #ifdef GDK_WINDOWING_X11 1358 gchar *rdp_kbd_remap;
1362 gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
1364 channels = rfi->
instance->context->channels;
1368 datapath = g_build_path(
"/",
1372 REMMINA_PLUGIN_DEBUG(
"RDP data path is %s", datapath);
1374 if ((datapath != NULL) && (datapath[0] !=
'\0'))
1375 if (access(datapath, W_OK) == 0)
1376 freerdp_settings_set_string(rfi->
settings, FreeRDP_ConfigPath, datapath);
1379 if (remmina_plugin_service->
file_get_int(remminafile,
"assistance_mode", 0)){
1380 rdpAssistanceFile* file = freerdp_assistance_file_new();
1382 REMMINA_PLUGIN_DEBUG(
"Could not allocate assistance file structure");
1386 if (remmina_plugin_service->
file_get_string(remminafile,
"assistance_file") == NULL ||
1387 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass") == NULL ){
1389 REMMINA_PLUGIN_DEBUG(
"Assistance file and password are not set while assistance mode is on");
1393 status = freerdp_assistance_parse_file(file,
1394 remmina_plugin_service->
file_get_string(remminafile,
"assistance_file"),
1395 remmina_plugin_service->
file_get_string(remminafile,
"assistance_pass"));
1398 REMMINA_PLUGIN_DEBUG(
"Could not parse assistance file");
1403 if (!freerdp_assistance_populate_settings_from_assistance_file(file, rfi->
settings)){
1404 REMMINA_PLUGIN_DEBUG(
"Could not populate settings from assistance file");
1410 #if defined(PROXY_TYPE_IGNORE) 1411 if (!remmina_plugin_service->
file_get_int(remminafile,
"useproxyenv", FALSE) ? TRUE : FALSE) {
1412 REMMINA_PLUGIN_DEBUG(
"Not using system proxy settings");
1413 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1420 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, (remmina_plugin_service->
file_get_int(remminafile,
"disableautoreconnect", FALSE) ? FALSE : TRUE));
1422 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1423 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoReconnectionEnabled, FALSE);
1425 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 99));
1427 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SoftwareGdi, TRUE);
1431 if (!
gfx_h264_available && (freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth) == 65 || freerdp_settings_get_bool(rfi->
settings, FreeRDP_ColorDepth == 66)))
1432 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 64);
1434 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 0) {
1436 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1437 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, FALSE);
1438 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1439 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 63) {
1441 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1442 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1443 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1444 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1445 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 64) {
1447 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1448 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1449 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1450 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxH264, FALSE);
1451 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1452 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 65) {
1454 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1455 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1457 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GfxAVC444, FALSE);
1458 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 66) {
1460 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1461 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1464 }
else if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ColorDepth) == 99) {
1466 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1467 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteFxCodec, TRUE);
1468 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline, TRUE);
1473 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_RemoteFxCodec) ||
1474 freerdp_settings_get_bool(rfi->
settings, FreeRDP_NSCodec) ||
1475 freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1476 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1477 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FrameMarkerCommandEnabled, TRUE);
1478 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ColorDepth, 32);
1487 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, w);
1488 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, h);
1489 REMMINA_PLUGIN_DEBUG(
"Resolution set by the user: %dx%d", w, h);
1493 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline) &&
1494 freerdp_settings_get_bool(rfi->
settings, FreeRDP_GfxH264)) {
1495 if (freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) <
1496 AVC_MIN_DESKTOP_WIDTH)
1497 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth,
1498 AVC_MIN_DESKTOP_WIDTH);
1499 if (freerdp_settings_get_uint32(rfi->
settings,
1500 FreeRDP_DesktopHeight) <
1501 AVC_MIN_DESKTOP_HEIGHT)
1502 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight,
1503 AVC_MIN_DESKTOP_HEIGHT);
1509 if ((freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth) & 1) != 0) {
1510 UINT32 tmp = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1511 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, tmp - 1);
1517 w = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth);
1518 h = freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight);
1519 REMMINA_PLUGIN_DEBUG(
"Resolution set after workarounds: %dx%d", w, h);
1523 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, remmina_plugin_service->
file_get_string(remminafile,
"username"));
1526 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, remmina_plugin_service->
file_get_string(remminafile,
"domain"));
1529 if (s) freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, s);
1531 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AutoLogonEnabled, TRUE);
1537 gchar *proxy_type = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_type"));
1538 gchar *proxy_username = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_username"));
1539 gchar *proxy_password = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_password"));
1540 gchar *proxy_hostname = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"proxy_hostname"));
1541 gint proxy_port = remmina_plugin_service->
file_get_int(remminafile,
"proxy_port", 80);
1542 REMMINA_PLUGIN_DEBUG(
"proxy_type: %s", proxy_type);
1543 REMMINA_PLUGIN_DEBUG(
"proxy_username: %s", proxy_username);
1544 REMMINA_PLUGIN_DEBUG(
"proxy_password: %s", proxy_password);
1545 REMMINA_PLUGIN_DEBUG(
"proxy_hostname: %s", proxy_hostname);
1546 REMMINA_PLUGIN_DEBUG(
"proxy_port: %d", proxy_port);
1547 if (proxy_type && proxy_hostname) {
1548 if (g_strcmp0(proxy_type,
"no_proxy") == 0)
1549 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_IGNORE);
1550 else if (g_strcmp0(proxy_type,
"http") == 0)
1551 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_HTTP);
1552 else if (g_strcmp0(proxy_type,
"socks5") == 0)
1553 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ProxyType, PROXY_TYPE_SOCKS);
1555 g_warning(
"Invalid proxy protocol, at the moment only no_proxy, HTTP and SOCKS5 are supported");
1556 REMMINA_PLUGIN_DEBUG(
"ProxyType set to: %" PRIu32, freerdp_settings_get_uint32(rfi->
settings, FreeRDP_ProxyType));
1557 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyHostname, proxy_hostname);
1559 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyUsername, proxy_username);
1561 freerdp_settings_set_string(rfi->
settings, FreeRDP_ProxyPassword, proxy_password);
1563 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_ProxyPort, proxy_port);
1565 g_free(proxy_hostname);
1566 g_free(proxy_username);
1567 g_free(proxy_password);
1569 if (remmina_plugin_service->
file_get_int(remminafile,
"base-cred-for-gw", FALSE)) {
1571 remmina_plugin_service->
file_set_string(remminafile,
"gateway_username", NULL);
1572 remmina_plugin_service->
file_set_string(remminafile,
"gateway_domain", NULL);
1573 remmina_plugin_service->
file_set_string(remminafile,
"gateway_password", NULL);
1577 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, FALSE);
1578 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_server");
1580 cs = remmina_plugin_service->
file_get_string(remminafile,
"gwtransp");
1581 #if FREERDP_CHECK_VERSION(2, 3, 1) 1582 if (remmina_plugin_service->
file_get_int(remminafile,
"websockets", FALSE))
1583 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, TRUE);
1585 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpUseWebsockets, FALSE);
1587 if (g_strcmp0(cs,
"http") == 0) {
1588 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, FALSE);
1589 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1590 }
else if (g_strcmp0(cs,
"rpc") == 0) {
1591 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1592 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, FALSE);
1593 }
else if (g_strcmp0(cs,
"auto") == 0) {
1594 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayRpcTransport, TRUE);
1595 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayHttpTransport, TRUE);
1597 remmina_plugin_service->
get_server_port(s, 443, &gateway_host, &gateway_port);
1598 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayHostname, gateway_host);
1599 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GatewayPort, gateway_port);
1600 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayEnabled, TRUE);
1601 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, TRUE);
1604 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain")) {
1605 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, remmina_plugin_service->
file_get_string(remminafile,
"gateway_domain"));
1606 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1609 if (remmina_plugin_service->
file_get_string(remminafile,
"gateway_username")) {
1610 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, remmina_plugin_service->
file_get_string(remminafile,
"gateway_username"));
1611 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1614 s = remmina_plugin_service->
file_get_string(remminafile,
"gateway_password");
1616 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, s);
1617 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
1621 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled) && freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials)) {
1622 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, freerdp_settings_get_string(rfi->
settings, FreeRDP_Domain));
1623 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, freerdp_settings_get_string(rfi->
settings, FreeRDP_Username));
1624 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, freerdp_settings_get_string(rfi->
settings, FreeRDP_Password));
1627 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_GatewayEnabled))
1628 freerdp_set_gateway_usage_method(rfi->
settings,
1629 remmina_plugin_service->
file_get_int(remminafile,
"gateway_usage", FALSE) ? TSC_PROXY_MODE_DETECT : TSC_PROXY_MODE_DIRECT);
1631 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayAccessToken,
1632 remmina_plugin_service->
file_get_string(remminafile,
"gatewayaccesstoken"));
1634 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_AuthenticationLevel, remmina_plugin_service->
file_get_int(
1635 remminafile,
"authentication level", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_AuthenticationLevel)));
1638 freerdp_settings_set_bool(rfi->
settings, FreeRDP_IgnoreCertificate, remmina_plugin_service->
file_get_int(remminafile,
"cert_ignore", 0));
1639 freerdp_settings_set_bool(rfi->
settings, FreeRDP_OldLicenseBehaviour, remmina_plugin_service->
file_get_int(remminafile,
"old-license", 0));
1640 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AllowUnanouncedOrdersFromServer, remmina_plugin_service->
file_get_int(remminafile,
"relax-order-checks", 0));
1641 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_GlyphSupportLevel, (remmina_plugin_service->
file_get_int(remminafile,
"glyph-cache", 0) ? GLYPH_SUPPORT_FULL : GLYPH_SUPPORT_NONE));
1643 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientname")))
1644 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, cs);
1646 freerdp_settings_set_string(rfi->
settings, FreeRDP_ClientHostname, g_get_host_name());
1649 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"clientbuild"))) {
1651 UINT32 val = strtoul(cs, NULL, 0);
1652 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_ClientBuild, val);
1657 if (remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo")) {
1658 char *tmp = strdup(remmina_plugin_service->
file_get_string(remminafile,
"loadbalanceinfo"));
1659 rfi->
settings->LoadBalanceInfo = (BYTE *)tmp;
1661 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_LoadBalanceInfoLength, strlen(tmp));
1665 freerdp_settings_set_string(rfi->
settings, FreeRDP_AlternateShell, remmina_plugin_service->
file_get_string(remminafile,
"exec"));
1668 freerdp_settings_set_string(rfi->
settings, FreeRDP_ShellWorkingDirectory, remmina_plugin_service->
file_get_string(remminafile,
"execpath"));
1670 sm = g_strdup_printf(
"rdp_quality_%i", remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0));
1674 if (value && value[0]) {
1675 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, strtoul(value, NULL, 16));
1677 switch (remmina_plugin_service->
file_get_int(remminafile,
"quality", DEFAULT_QUALITY_0)) {
1679 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_9);
1683 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_2);
1687 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_1);
1692 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_PerformanceFlags, DEFAULT_QUALITY_0);
1698 if ((cs = remmina_plugin_service->
file_get_string(remminafile,
"network"))) {
1701 if (g_strcmp0(cs,
"modem") == 0)
1702 type = CONNECTION_TYPE_MODEM;
1703 else if (g_strcmp0(cs,
"broadband") == 0)
1704 type = CONNECTION_TYPE_BROADBAND_HIGH;
1705 else if (g_strcmp0(cs,
"broadband-low") == 0)
1706 type = CONNECTION_TYPE_BROADBAND_LOW;
1707 else if (g_strcmp0(cs,
"broadband-high") == 0)
1708 type = CONNECTION_TYPE_BROADBAND_HIGH;
1709 else if (g_strcmp0(cs,
"wan") == 0)
1710 type = CONNECTION_TYPE_WAN;
1711 else if (g_strcmp0(cs,
"lan") == 0)
1712 type = CONNECTION_TYPE_LAN;
1713 else if ((g_strcmp0(cs,
"autodetect") == 0))
1714 type = CONNECTION_TYPE_AUTODETECT;
1715 else if ((g_strcmp0(cs,
"none") == 0))
1716 type = REMMINA_CONNECTION_TYPE_NONE;
1718 type = REMMINA_CONNECTION_TYPE_NONE;
1721 REMMINA_PLUGIN_DEBUG(
"Network settings not set");
1728 freerdp_performance_flags_split(rfi->
settings);
1730 #ifdef GDK_WINDOWING_X11 1731 #if FREERDP_CHECK_VERSION(2, 3, 0) 1733 if (rdp_kbd_remap != NULL) {
1734 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap);
1735 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1736 g_free(rdp_kbd_remap);
1739 freerdp_settings_set_string(rfi->
settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->
pref_get_value(
"rdp_kbd_remap"));
1740 REMMINA_PLUGIN_DEBUG(
"rdp_keyboard_remapping_list: %s", rfi->
settings->KeyboardRemappingList);
1747 if (remmina_plugin_service->
file_get_int(remminafile,
"console", FALSE))
1748 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1750 if (remmina_plugin_service->
file_get_int(remminafile,
"restricted-admin", FALSE)) {
1751 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1752 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1756 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ConsoleSession, TRUE);
1757 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RestrictedAdminModeRequired, TRUE);
1758 freerdp_settings_set_string(rfi->
settings, FreeRDP_PasswordHash, remmina_plugin_service->
file_get_string(remminafile,
"pth"));
1759 remmina_plugin_service->
file_set_int(remminafile,
"restricted-admin", TRUE);
1762 cs = remmina_plugin_service->
file_get_string(remminafile,
"security");
1763 if (g_strcmp0(cs,
"rdp") == 0) {
1764 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, TRUE);
1765 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1766 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1767 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1768 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseRdpSecurityLayer, TRUE);
1769 }
else if (g_strcmp0(cs,
"tls") == 0) {
1770 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1771 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, TRUE);
1772 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1773 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1774 }
else if (g_strcmp0(cs,
"nla") == 0) {
1775 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1776 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1777 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, TRUE);
1778 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, FALSE);
1779 }
else if (g_strcmp0(cs,
"ext") == 0) {
1780 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RdpSecurity, FALSE);
1781 freerdp_settings_set_bool(rfi->
settings, FreeRDP_TlsSecurity, FALSE);
1782 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NlaSecurity, FALSE);
1783 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ExtSecurity, TRUE);
1786 freerdp_settings_set_bool(rfi->
settings, FreeRDP_NegotiateSecurityLayer, TRUE);
1789 cs = remmina_plugin_service->
file_get_string(remminafile,
"tls-seclevel");
1790 if (cs && g_strcmp0(cs,
"")!=0) {
1792 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TlsSecLevel, i);
1795 freerdp_settings_set_bool(rfi->
settings, FreeRDP_CompressionEnabled, TRUE);
1796 if (remmina_plugin_service->
file_get_int(remminafile,
"disable_fastpath", FALSE)) {
1797 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, FALSE);
1798 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, FALSE);
1800 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathInput, TRUE);
1801 freerdp_settings_set_bool(rfi->
settings, FreeRDP_FastPathOutput, TRUE);
1807 freerdp_settings_set_uint16(rfi->
settings, FreeRDP_DesktopOrientation, desktopOrientation);
1808 if (desktopScaleFactor != 0 && deviceScaleFactor != 0) {
1809 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopScaleFactor, desktopScaleFactor);
1810 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DeviceScaleFactor, deviceScaleFactor);
1816 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportDisplayControl, TRUE);
1818 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportDisplayControl)) {
1824 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1827 if (freerdp_settings_get_bool(rfi->
settings, FreeRDP_SupportGraphicsPipeline)) {
1834 freerdp_client_add_dynamic_channel(rfi->
settings, dcount, d);
1839 if (g_strcmp0(cs,
"remote") == 0) {
1840 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, TRUE);
1841 }
else if (g_str_has_prefix(cs,
"local")) {
1842 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, TRUE);
1843 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1846 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioPlayback, FALSE);
1847 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RemoteConsoleAudio, FALSE);
1850 cs = remmina_plugin_service->
file_get_string(remminafile,
"microphone");
1851 if (cs != NULL && cs[0] !=
'\0') {
1852 if (g_strcmp0(cs,
"0") == 0) {
1853 REMMINA_PLUGIN_DEBUG(
"“microphone” was set to 0, setting to \"\"");
1854 remmina_plugin_service->
file_set_string(remminafile,
"microphone",
"");
1856 freerdp_settings_set_bool(rfi->
settings, FreeRDP_AudioCapture, TRUE);
1857 REMMINA_PLUGIN_DEBUG(
"“microphone” set to “%s”", cs);
1863 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1868 cs = remmina_plugin_service->
file_get_string(remminafile,
"audio-output");
1869 if (cs != NULL && cs[0] !=
'\0') {
1870 REMMINA_PLUGIN_DEBUG(
"audio output set to %s", cs);
1875 status = freerdp_client_add_static_channel(rfi->
settings, count, p);
1877 status = freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1882 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_level");
1883 if (cs != NULL && cs[0] !=
'\0')
1884 REMMINA_PLUGIN_DEBUG(
"Log level set to to %s", cs);
1886 cs = g_strdup(
"INFO");
1887 wLog *root = WLog_GetRoot();
1888 WLog_SetStringLogLevel(root, cs);
1890 cs = remmina_plugin_service->
file_get_string(remminafile,
"freerdp_log_filters");
1891 if (cs != NULL && cs[0] !=
'\0') {
1892 REMMINA_PLUGIN_DEBUG(
"Log filters set to to %s", cs);
1893 WLog_AddStringLogFilters(cs);
1895 WLog_AddStringLogFilters(NULL);
1900 if (cs != NULL && cs[0] !=
'\0') {
1904 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1909 if (cs != NULL && cs[0] !=
'\0') {
1913 freerdp_client_add_static_channel(rfi->
settings, count, p);
1918 if (cs != NULL && cs[0] !=
'\0') {
1922 freerdp_client_add_dynamic_channel(rfi->
settings, count, p);
1927 if (cs != NULL && cs[0] !=
'\0') {
1928 g_free(rfi->
settings->RDP2TCPArgs);
1929 rfi->
settings->RDP2TCPArgs = g_strdup(cs);
1930 REMMINA_PLUGIN_DEBUG(
"rdp2tcp set to %s", rfi->
settings->RDP2TCPArgs);
1934 int vermaj, vermin, verrev;
1935 freerdp_get_version(&vermaj, &vermin, &verrev);
1937 #if FREERDP_CHECK_VERSION(2, 1, 0) 1939 if (cs != NULL && cs[0] !=
'\0') {
1940 const gchar *endptr = NULL;
1941 guint64 val = g_ascii_strtoull(cs, (gchar **)&endptr, 10);
1942 if (val > 600000 || val <= 0)
1944 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_TcpAckTimeout, (UINT32)val);
1948 if (remmina_plugin_service->
file_get_int(remminafile,
"preferipv6", FALSE) ? TRUE : FALSE)
1949 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PreferIPv6OverIPv4, TRUE);
1951 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectClipboard, remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ? FALSE : TRUE);
1953 cs = remmina_plugin_service->
file_get_string(remminafile,
"sharefolder");
1954 if (cs != NULL && cs[0] !=
'\0') {
1955 gchar *ccs = g_strdup(cs);
1956 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrating] - Old sharefolder %s to \"drive \"", ccs);
1958 remmina_plugin_service->
file_set_string(remminafile,
"drive", g_strdup(ccs));
1959 remmina_plugin_service->
file_set_string(remminafile,
"sharefolder", NULL);
1960 REMMINA_PLUGIN_DEBUG(
"[Deprecated->migrated] - drive set to %s", g_strdup(ccs));
1970 if (cs != NULL && cs[0] !=
'\0') {
1971 REMMINA_PLUGIN_DEBUG(
"Redirect directory set to %s", cs);
1975 gchar **folders = g_strsplit(cs,
";", -1);
1976 for (i = 0; folders[i] != NULL; i++) {
1977 REMMINA_PLUGIN_DEBUG(
"Parsing folder %s", folders[i]);
1979 status = freerdp_client_add_device_channel(rfi->
settings, count, p);
1982 g_strfreev(folders);
1985 if (remmina_plugin_service->
file_get_int(remminafile,
"shareprinter", FALSE)) {
1987 REMMINA_PLUGIN_DEBUG(
"Sharing printers");
1988 const gchar *po = remmina_plugin_service->
file_get_string(remminafile,
"printer_overrides");
1989 if (po && po[0] != 0) {
1992 REMMINA_PLUGIN_DEBUG(
"All printers have been shared");
1994 REMMINA_PLUGIN_DEBUG(
"Cannot share printers, are there any available?");
2001 freerdp_client_add_device_channel(rfi->
settings, dcount, d);
2006 if (remmina_plugin_service->
file_get_int(remminafile,
"span", FALSE)) {
2007 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SpanMonitors, TRUE);
2008 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2009 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2010 remmina_plugin_service->
file_set_int(remminafile,
"multimon", 1);
2013 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2014 guint32 maxwidth = 0;
2015 guint32 maxheight = 0;
2018 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2020 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2021 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2023 gchar *monitorids_string = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"monitorids"));
2028 if (monitorids_string != NULL && monitorids_string[0] !=
'\0') {
2029 if (g_strstr_len(monitorids_string, -1,
",") != NULL) {
2030 if (g_strstr_len(monitorids_string, -1,
":") != NULL) {
2031 rdpMonitor *base = (rdpMonitor *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorDefArray);
2035 temp_items = g_strsplit(monitorids_string,
",", -1);
2036 for (i = 0; i < g_strv_length(temp_items); i++) {
2037 rot_items = g_strsplit(temp_items[i],
":", -1);
2038 rdpMonitor *current = &base[atoi(rot_items[0])];
2040 monitorids = g_strdup(rot_items[0]);
2042 monitorids = g_strdup_printf(
"%s,%s", monitorids, rot_items[0]);
2043 current->attributes.orientation = atoi(rot_items[1]);
2044 REMMINA_PLUGIN_DEBUG(
"Monitor n %d orientation: %d", i, current->attributes.orientation);
2047 monitorids = g_strdup(monitorids_string);
2050 monitorids = g_strdup(monitorids_string);
2053 monitorids = g_strdup(monitorids_string);
2056 if (monitorids != NULL && monitorids[0] !=
'\0') {
2057 UINT32 *base = (UINT32 *)freerdp_settings_get_pointer(rfi->
settings, FreeRDP_MonitorIds);
2059 items = g_strsplit(monitorids,
",", -1);
2060 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_NumMonitorIds, g_strv_length(items));
2061 REMMINA_PLUGIN_DEBUG(
"NumMonitorIds: %d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_NumMonitorIds));
2062 for (i = 0; i < g_strv_length(items); i++) {
2063 UINT32 *current = &base[i];
2064 *current = atoi(items[i]);
2065 REMMINA_PLUGIN_DEBUG(
"Added monitor with ID %" PRIu32, *current);
2070 if (maxwidth && maxheight) {
2071 REMMINA_PLUGIN_DEBUG(
"Setting DesktopWidth and DesktopHeight to: %dx%d", maxwidth, maxheight);
2072 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopWidth, maxwidth);
2073 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_DesktopHeight, maxheight);
2074 REMMINA_PLUGIN_DEBUG(
"DesktopWidth and DesktopHeight set to: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2076 REMMINA_PLUGIN_DEBUG(
"Cannot set Desktop Size, we are using the previously set values: %dx%d", freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopWidth), freerdp_settings_get_uint32(rfi->
settings, FreeRDP_DesktopHeight));
2082 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"smartcardname");
2083 if (remmina_plugin_service->
file_get_int(remminafile,
"sharesmartcard", FALSE) ||
2084 (sn != NULL && sn[0] !=
'\0')) {
2085 RDPDR_SMARTCARD *smartcard;
2086 smartcard = (RDPDR_SMARTCARD *)calloc(1,
sizeof(RDPDR_SMARTCARD));
2088 #ifdef WITH_FREERDP3 2090 sdev = &(smartcard->device);
2092 RDPDR_SMARTCARD *sdev;
2096 sdev->Type = RDPDR_DTYP_SMARTCARD;
2098 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2100 if (sn != NULL && sn[0] !=
'\0')
2101 sdev->Name = _strdup(sn);
2103 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSmartCards, TRUE);
2105 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)smartcard);
2108 if (remmina_plugin_service->
file_get_int(remminafile,
"passwordispin", FALSE))
2111 freerdp_settings_set_bool(rfi->
settings, FreeRDP_PasswordIsSmartcardPin, TRUE);
2114 if (remmina_plugin_service->
file_get_int(remminafile,
"shareserial", FALSE)) {
2115 RDPDR_SERIAL *serial;
2116 serial = (RDPDR_SERIAL *)calloc(1,
sizeof(RDPDR_SERIAL));
2118 #ifdef WITH_FREERDP3 2120 sdev = &(serial->device);
2126 sdev->Type = RDPDR_DTYP_SERIAL;
2128 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2130 const gchar *sn = remmina_plugin_service->
file_get_string(remminafile,
"serialname");
2131 if (sn != NULL && sn[0] !=
'\0')
2132 sdev->Name = _strdup(sn);
2134 const gchar *sd = remmina_plugin_service->
file_get_string(remminafile,
"serialdriver");
2135 if (sd != NULL && sd[0] !=
'\0')
2136 serial->Driver = _strdup(sd);
2138 const gchar *sp = remmina_plugin_service->
file_get_string(remminafile,
"serialpath");
2139 if (sp != NULL && sp[0] !=
'\0')
2140 serial->Path = _strdup(sp);
2142 if (remmina_plugin_service->
file_get_int(remminafile,
"serialpermissive", FALSE))
2143 serial->Permissive = _strdup(
"permissive");
2145 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectSerialPorts, TRUE);
2147 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)serial);
2150 if (remmina_plugin_service->
file_get_int(remminafile,
"shareparallel", FALSE)) {
2151 RDPDR_PARALLEL *parallel;
2152 parallel = (RDPDR_PARALLEL *)calloc(1,
sizeof(RDPDR_PARALLEL));
2154 #ifdef WITH_FREERDP3 2156 pdev = &(parallel->device);
2158 RDPDR_PARALLEL *pdev;
2162 pdev->Type = RDPDR_DTYP_PARALLEL;
2164 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2166 freerdp_settings_set_bool(rfi->
settings, FreeRDP_RedirectParallelPorts, TRUE);
2168 const gchar *pn = remmina_plugin_service->
file_get_string(remminafile,
"parallelname");
2169 if (pn != NULL && pn[0] !=
'\0')
2170 pdev->Name = _strdup(pn);
2171 const gchar *dp = remmina_plugin_service->
file_get_string(remminafile,
"parallelpath");
2172 if (dp != NULL && dp[0] !=
'\0')
2173 parallel->Path = _strdup(dp);
2175 freerdp_device_collection_add(rfi->
settings, (RDPDR_DEVICE *)parallel);
2181 if (remmina_plugin_service->
file_get_int(remminafile,
"multitransport", FALSE)) {
2182 freerdp_settings_set_bool(rfi->
settings, FreeRDP_DeviceRedirection, TRUE);
2183 freerdp_settings_set_bool(rfi->
settings, FreeRDP_SupportMultitransport, TRUE);
2184 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags,
2185 (TRANSPORT_TYPE_UDP_FECR | TRANSPORT_TYPE_UDP_FECL | TRANSPORT_TYPE_UDP_PREFERRED));
2187 freerdp_settings_set_uint32(rfi->
settings, FreeRDP_MultitransportFlags, 0);
2194 freerdp_settings_set_string(rfi->
settings, FreeRDP_Username, NULL);
2195 freerdp_settings_set_string(rfi->
settings, FreeRDP_Password, NULL);
2196 freerdp_settings_set_string(rfi->
settings, FreeRDP_Domain, NULL);
2198 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayDomain, NULL);
2199 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayUsername, NULL);
2200 freerdp_settings_set_string(rfi->
settings, FreeRDP_GatewayPassword, NULL);
2202 freerdp_settings_set_bool(rfi->
settings, FreeRDP_GatewayUseSameCredentials, FALSE);
2207 if (!freerdp_connect(rfi->
instance)) {
2212 e = freerdp_get_last_error(rfi->
instance->context);
2215 case FREERDP_ERROR_AUTHENTICATION_FAILED:
2216 case STATUS_LOGON_FAILURE:
2217 #ifdef FREERDP_ERROR_CONNECT_LOGON_FAILURE 2218 case FREERDP_ERROR_CONNECT_LOGON_FAILURE:
2223 case STATUS_ACCOUNT_LOCKED_OUT:
2224 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT 2225 case FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT:
2228 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2230 case STATUS_ACCOUNT_EXPIRED:
2231 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED 2232 case FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED:
2235 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2237 case STATUS_PASSWORD_EXPIRED:
2238 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED 2239 case FREERDP_ERROR_CONNECT_PASSWORD_EXPIRED:
2242 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2244 case STATUS_ACCOUNT_DISABLED:
2245 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED 2246 case FREERDP_ERROR_CONNECT_ACCOUNT_DISABLED:
2249 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2251 #ifdef FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES 2253 case FREERDP_ERROR_SERVER_INSUFFICIENT_PRIVILEGES:
2254 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nInsufficient user privileges."),
2255 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2258 case STATUS_ACCOUNT_RESTRICTION:
2259 #ifdef FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION 2260 case FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION:
2263 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2266 case STATUS_PASSWORD_MUST_CHANGE:
2267 #ifdef FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE 2268 case FREERDP_ERROR_CONNECT_PASSWORD_MUST_CHANGE:
2270 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not access the RDP server “%s”.\nChange user password before connecting."),
2271 freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2274 case FREERDP_ERROR_CONNECT_FAILED:
2275 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Lost connection to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2277 case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
2278 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Could not find the address for the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2280 case FREERDP_ERROR_TLS_CONNECT_FAILED:
2282 _(
"Could not connect to the RDP server “%s” via TLS. See the DEBUG traces from a terminal for more information."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2284 case FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED:
2286 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Unable to establish a connection to the RDP server “%s”. Check “Security protocol negotiation”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2288 #ifdef FREERDP_ERROR_POST_CONNECT_FAILED 2289 case FREERDP_ERROR_POST_CONNECT_FAILED:
2292 case REMMINA_POSTCONNECT_ERROR_OK:
2294 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the RDP server “%s”."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2296 case REMMINA_POSTCONNECT_ERROR_GDI_INIT:
2299 case REMMINA_POSTCONNECT_ERROR_NO_H264:
2300 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"You requested a H.264 GFX mode for the server “%s”, but your libfreerdp does not support H.264. Please use a non-AVC colour depth setting."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2305 #ifdef FREERDP_ERROR_SERVER_DENIED_CONNECTION 2306 case FREERDP_ERROR_SERVER_DENIED_CONNECTION:
2307 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The “%s” server refused the connection."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2312 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"The Remote Desktop Gateway “%s” denied the user “%s\\%s” access due to policy."),
2313 freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayHostname), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayDomain), freerdp_settings_get_string(rfi->
settings, FreeRDP_GatewayUsername));
2316 case FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS:
2321 g_printf(
"libfreerdp returned code is %08X\n", e);
2322 remmina_plugin_service->
protocol_plugin_set_error(gp, _(
"Cannot connect to the “%s” RDP server."), freerdp_settings_get_string(rfi->
settings, FreeRDP_ServerHostname));
2330 if (GET_PLUGIN_DATA(rfi->
protocol_widget) == NULL) orphaned =
true;
else orphaned =
false;
2331 if (!orphaned && freerdp_get_last_error(rfi->
instance->context) == FREERDP_ERROR_SUCCESS && !rfi->
user_cancelled)
2352 freerdp_abort_connect(instance);
2358 RDP_CLIENT_ENTRY_POINTS *pEntryPoints = instance->pClientEntryPoints;
2360 IFCALL(pEntryPoints->GlobalUninit);
2361 free(instance->pClientEntryPoints);
2362 freerdp_context_free(instance);
2363 freerdp_free(instance);
2369 TRACE_CALL(__func__);
2380 if (GET_PLUGIN_DATA(gp) == NULL) orphaned =
true;
else orphaned =
false;
2385 if (!orphaned) g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2394 return G_SOURCE_REMOVE;
2399 TRACE_CALL(__func__);
2403 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
2408 rfi = GET_PLUGIN_DATA(gp);
2426 TRACE_CALL(__func__);
2430 instance = freerdp_new();
2441 instance->ContextSize =
sizeof(
rfContext);
2442 freerdp_context_new(instance);
2445 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", rfi, free);
2449 rfi->
settings = instance->settings;
2455 freerdp_register_addin_provider(freerdp_channels_load_static_addin_entry, 0);
2462 TRACE_CALL(__func__);
2465 const gchar *profile_name, *p;
2466 gchar thname[16], c;
2476 "Could not start pthread.");
2484 profile_name = remmina_plugin_service->
file_get_string(remminafile,
"name");
2486 strcpy(thname,
"RemmRDP:");
2488 nthname = strlen(thname);
2489 while ((c = *p) != 0 && nthname <
sizeof(thname) - 1) {
2491 thname[nthname++] = c;
2495 strcat(thname,
"<NONAM>");
2496 nthname = strlen(thname);
2498 thname[nthname] = 0;
2499 #if defined(__linux__) 2501 #elif defined(__FreeBSD__) 2510 TRACE_CALL(__func__);
2512 REMMINA_PLUGIN_DEBUG(
"Requesting to close the connection");
2517 g_warning(
"WARNING: %s called on a subthread, which may not work or crash Remmina.", __func__);
2525 g_object_steal_data(G_OBJECT(gp),
"plugin-data");
2532 REMMINA_PLUGIN_DEBUG(
"[RDP] requesting clipboard transfer to abort");
2552 TRACE_CALL(__func__);
2558 TRACE_CALL(__func__);
2561 switch (feature->
id) {
2562 case REMMINA_RDP_FEATURE_UNFOCUS:
2566 case REMMINA_RDP_FEATURE_SCALE:
2571 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_SCALE");
2575 case REMMINA_RDP_FEATURE_MULTIMON:
2578 if (remmina_plugin_service->
file_get_int(remminafile,
"multimon", FALSE)) {
2579 freerdp_settings_set_bool(rfi->
settings, FreeRDP_UseMultimon, TRUE);
2581 freerdp_settings_set_bool(rfi->
settings, FreeRDP_ForceMultimon, TRUE);
2582 freerdp_settings_set_bool(rfi->
settings, FreeRDP_Fullscreen, TRUE);
2586 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_MULTIMON");
2590 case REMMINA_RDP_FEATURE_DYNRESUPDATE:
2593 case REMMINA_RDP_FEATURE_TOOL_REFRESH:
2599 REMMINA_PLUGIN_DEBUG(
"Remmina RDP plugin warning: Null value for rfi by REMMINA_RDP_FEATURE_TOOL_REFRESH");
2602 case REMMINA_RDP_FEATURE_TOOL_SENDCTRLALTDEL:
2614 TRACE_CALL(__func__);
2618 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
2628 UINT32 bytesPerPixel;
2629 UINT32 bitsPerPixel;
2634 gdi = ((rdpContext *)rfi)->gdi;
2636 bytesPerPixel = GetBytesPerPixel(gdi->hdc->format);
2637 bitsPerPixel = GetBitsPerPixel(gdi->hdc->format);
2642 szmem = gdi->width * gdi->height * bytesPerPixel;
2644 REMMINA_PLUGIN_DEBUG(
"allocating %zu bytes for a full screenshot", szmem);
2645 rpsd->
buffer = malloc(szmem);
2647 REMMINA_PLUGIN_DEBUG(
"could not set aside %zu bytes for a full screenshot", szmem);
2650 rpsd->
width = gdi->width;
2651 rpsd->
height = gdi->height;
2655 memcpy(rpsd->
buffer, gdi->primary_buffer, szmem);
2665 "99",
N_(
"Automatic (32 bpp) (Server chooses its best format)"),
2666 "66",
N_(
"GFX AVC444 (32 bpp)"),
2667 "65",
N_(
"GFX AVC420 (32 bpp)"),
2668 "64",
N_(
"GFX RFX (32 bpp)"),
2669 "63",
N_(
"GFX RFX Progressive (32 bpp)"),
2670 "0",
N_(
"RemoteFX (32 bpp)"),
2671 "32",
N_(
"True colour (32 bpp)"),
2672 "24",
N_(
"True colour (24 bpp)"),
2673 "16",
N_(
"High colour (16 bpp)"),
2674 "15",
N_(
"High colour (15 bpp)"),
2675 "8",
N_(
"256 colours (8 bpp)"),
2696 "0",
N_(
"Poor (fastest)"),
2699 "9",
N_(
"Best (slowest)"),
2707 "autodetect",
N_(
"Auto-detect"),
2708 "modem",
N_(
"Modem"),
2709 "broadband-low",
N_(
"Low performance broadband"),
2710 "satellite",
N_(
"Satellite"),
2711 "broadband-high",
N_(
"High performance broadband"),
2721 "local",
N_(
"Local"),
2722 "remote",
N_(
"Remote"),
2729 "",
N_(
"Automatic negotiation"),
2730 "nla",
N_(
"NLA protocol security"),
2731 "tls",
N_(
"TLS protocol security"),
2732 "rdp",
N_(
"RDP protocol security"),
2733 "ext",
N_(
"NLA extended protocol security"),
2748 "0",
N_(
"0 — Windows 7 compatible"),
2758 N_(
"2600 (Windows XP), 7601 (Windows Vista/7), 9600 (Windows 8 and newer)");
2761 N_(
"Used i.a. by terminal services in a smart card channel to distinguish client capabilities:\n" 2762 " • < 4034: Windows XP base smart card functions\n" 2763 " • 4034-7064: Windows Vista/7: SCardReadCache(),\n" 2764 " SCardWriteCache(), SCardGetTransmitCount()\n" 2765 " • >= 7065: Windows 8 and newer: SCardGetReaderIcon(),\n" 2766 " SCardGetDeviceTypeId()");
2769 N_(
"Options for redirection of audio input:\n" 2770 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2771 " [channel:<channel>] Audio input (microphone)\n" 2774 " • sys:oss,dev:1,format:1\n" 2778 N_(
"Options for redirection of audio output:\n" 2779 " • [sys:<sys>,][dev:<dev>,][format:<format>,][rate:<rate>,]\n" 2780 " [channel:<channel>] Audio output\n" 2783 " • sys:oss,dev:1,format:1\n" 2788 N_(
"Options for redirection of USB device:\n" 2789 " • [dbg,][id:<vid>:<pid>#…,][addr:<bus>:<addr>#…,][auto]\n" 2791 " • id:054c:0268#4669:6e6b,addr:04:0c");
2794 N_(
"Advanced setting for high latency links:\n" 2795 "Adjusts the connection timeout. Use if your connection times out.\n" 2796 "The highest possible value is 600000 ms (10 minutes).\n");
2799 N_(
"Performance optimisations based on the network connection type:\n" 2800 "Using auto-detection is advised.\n" 2801 "If “Auto-detect” fails, choose the most appropriate option in the list.\n");
2804 N_(
"Comma-separated list of monitor IDs and desktop orientations:\n" 2805 " • [<id>:<orientation-in-degrees>,]\n" 2808 "Orientations are specified in degrees, valid values are:\n" 2809 " • 0 (landscape)\n" 2810 " • 90 (portrait)\n" 2811 " • 180 (landscape flipped)\n" 2812 " • 270 (portrait flipped)\n" 2816 N_(
"Redirect directory <path> as named share <name>.\n" 2817 " • <name>,<fullpath>[;<name>,<fullpath>[;…]]\n" 2818 " • MyHome,/home/remminer\n" 2819 " • /home/remminer\n" 2820 " • MyHome,/home/remminer;SomePath,/path/to/somepath\n" 2821 "Hotplug support is enabled with:\n" 2894 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"printer_overrides",
N_(
"Override printer drivers"), FALSE, NULL,
N_(
"\"Samsung_CLX-3300_Series\":\"Samsung CLX-3300 Series PS\";\"Canon MF410\":\"Canon MF410 Series UFR II\"") },
2905 {
REMMINA_PROTOCOL_SETTING_TYPE_TEXT,
"rdp_reconnect_attempts",
N_(
"Reconnect attempts number"), FALSE, NULL,
N_(
"The maximum number of reconnect attempts upon an RDP disconnect (default: 20)") },
2920 #if defined(PROXY_TYPE_IGNORE) 2928 #if FREERDP_CHECK_VERSION(2, 3, 1) 2958 N_(
"RDP - Remote Desktop Protocol"),
2961 "org.remmina.Remmina-rdp-symbolic",
2962 "org.remmina.Remmina-rdp-ssh-symbolic",
2983 N_(
"RDP - RDP File Handler"),
2998 N_(
"RDP - Preferences"),
3007 TRACE_CALL(__func__);
3011 p = strcasestr(bc, option);
3015 if (p > bc && *(p - 1) >
' ')
3018 n = p + strlen(option);
3027 int vermaj, vermin, verrev;
3029 TRACE_CALL(__func__);
3030 remmina_plugin_service = service;
3034 freerdp_get_version(&vermaj, &vermin, &verrev);
3035 if (vermaj < FREERDP_REQUIRED_MAJOR ||
3036 (vermaj == FREERDP_REQUIRED_MAJOR && (vermin < FREERDP_REQUIRED_MINOR ||
3037 (vermin == FREERDP_REQUIRED_MINOR && verrev < FREERDP_REQUIRED_REVISION)))) {
3038 g_printf(
"Upgrade your FreeRDP library version from %d.%d.%d to at least libfreerdp %d.%d.%d " 3039 "to run the RDP plugin.\n",
3040 vermaj, vermin, verrev,
3041 FREERDP_REQUIRED_MAJOR, FREERDP_REQUIRED_MINOR, FREERDP_REQUIRED_REVISION);
3045 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
3046 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
3051 remmina_rdpf.
export_hints = _(
"Export connection in Windows .rdp file format");
3066 gpointer *src, *dst;
3069 if (strcmp(*src,
"66") != 0 && strcmp(*src,
"65") != 0) {
3072 *(dst + 1) = *(src + 1);
3082 "RDP plugin: %s (Git %s), Compiled with libfreerdp %s (%s), Running with libfreerdp %s (rev %s), H.264 %s",
3083 VERSION, REMMINA_GIT_REVISION,
3084 #ifdef WITH_FREERDP3
3085 FREERDP_VERSION_FULL, FREERDP_GIT_REVISION,
3087 FREERDP_VERSION_FULL, GIT_REVISION,
3089 freerdp_get_version_string(),
3090 freerdp_get_build_revision(),
CliprdrClientContext * context
struct remmina_plugin_rdp_event::@42::@45 mouse_event
gboolean thread_cancelled
-
static gpointer tls_seclevel[]
-
static gchar network_tooltip[]
+
static gpointer tls_seclevel[]
+
static gchar network_tooltip[]
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
static int remmina_rdp_load_static_channel_addin(rdpChannels *channels, rdpSettings *settings, char *name, void *data)
-
static gboolean remmina_rdp_open_connection(RemminaProtocolWidget *gp)
+
static gboolean remmina_rdp_open_connection(RemminaProtocolWidget *gp)
-
static gpointer quality_list[]
+
static gpointer quality_list[]
static void remmina_rdp_send_ctrlaltdel(RemminaProtocolWidget *gp)
gboolean attempt_interactive_authentication
@@ -110,13 +110,13 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
void(* file_set_int)(RemminaFile *remminafile, const gchar *setting, gint value)
-
static RemminaProtocolPlugin remmina_rdp
+
static RemminaProtocolPlugin remmina_rdp
gboolean remmina_rdp_event_on_unmap(RemminaProtocolWidget *gp)
gboolean remmina_rdp_file_export_test(RemminaFilePlugin *plugin, RemminaFile *remminafile)
-
static gpointer log_level[]
+
static gpointer log_level[]
gchar *(* file_get_user_datadir)(void)
static BOOL rf_auto_reconnect(rfContext *rfi)
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
@@ -136,13 +136,13 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
void remmina_rdp_settings_get_orientation_scale_prefs(int *desktopOrientation, int *desktopScaleFactor, int *deviceScaleFactor)
-
static gboolean remmina_rdp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
+
static gboolean remmina_rdp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static DWORD remmina_rdp_verify_certificate_ex(freerdp *instance, const char *host, UINT16 port, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, DWORD flags)
-
static gchar microphone_tooltip[]
+
static gchar microphone_tooltip[]
gint(* protocol_plugin_init_certificate)(RemminaProtocolWidget *gp, const gchar *subject, const gchar *issuer, const gchar *fingerprint)
static BOOL rf_desktop_resize(rdpContext *context)
static CLPARAM ** remmina_rdp_CommandLineParseCommaSeparatedValues(const char *list, size_t *count)
@@ -151,13 +151,13 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
void remmina_rdp_settings_init(void)
static BOOL remmina_rdp_authenticate(freerdp *instance, char **username, char **password, char **domain)
-
static gboolean complete_cleanup_on_main_thread(gpointer data)
+
static gboolean complete_cleanup_on_main_thread(gpointer data)
static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
void remmina_rdp_clipboard_init(rfContext *rfi)
-
static const RemminaProtocolSetting remmina_rdp_advanced_settings[]
+
static const RemminaProtocolSetting remmina_rdp_advanced_settings[]
RemminaProtocolWidget * protocol_widget
-
static gpointer network_list[]
+
static gpointer network_list[]
void remmina_rdp_OnChannelConnectedEventHandler(void *context, ChannelConnectedEventArgs *e)
void(* protocol_plugin_send_keys_signals)(GtkWidget *widget, const guint *keyvals, int length, GdkEventType action)
@@ -165,7 +165,7 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
gint(* protocol_plugin_get_width)(RemminaProtocolWidget *gp)
-
static void remmina_rdp_init(RemminaProtocolWidget *gp)
+
static void remmina_rdp_init(RemminaProtocolWidget *gp)
static gchar * remmina_get_rdp_kbd_remap(const gchar *keymap)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
@@ -179,12 +179,12 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
static CLPARAM ** remmina_rdp_CommandLineParseCommaSeparatedValuesEx(const char *name, const char *list, size_t *count)
-
static gchar clientbuild_tooltip[]
+
static gchar clientbuild_tooltip[]
RemminaPluginRdpEventType type
gboolean(* protocol_plugin_init_get_savepassword)(RemminaProtocolWidget *gp)
-
static void rfi_uninit(rfContext *rfi)
+
static void rfi_uninit(rfContext *rfi)
gboolean(* register_plugin)(RemminaPlugin *plugin)
@@ -194,7 +194,7 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
static int remmina_rdp_set_printers(void *user_data, unsigned flags, cups_dest_t *dest)
Callback function used by cupsEnumDests.
-
static gpointer sound_list[]
+
static gpointer sound_list[]
cairo_format_t cairo_format
int remmina_rdp_event_queue_ui_sync_retint(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
@@ -204,23 +204,23 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
-
static const RemminaProtocolFeature remmina_rdp_features[]
-
static RemminaFilePlugin remmina_rdpf
-
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
-
static gpointer security_list[]
+
static const RemminaProtocolFeature remmina_rdp_features[]
+
static RemminaFilePlugin remmina_rdpf
+
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
+
static gpointer security_list[]
static BOOL rf_process_event_queue(RemminaProtocolWidget *gp)
void remmina_rdp_event_queue_ui_async(RemminaProtocolWidget *gp, RemminaPluginRdpUiObject *ui)
-
static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
+
static void remmina_rdp_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
gboolean stop_reconnecting_requested
struct remmina_plugin_rdp_event::@42::@44 key_event
gboolean remmina_rdp_file_import_test(RemminaFilePlugin *plugin, const gchar *from_file)
gboolean remmina_rdp_file_export(RemminaFilePlugin *plugin, RemminaFile *remminafile, const gchar *to_file)
-
static gpointer colordepth_list[]
+
static gpointer colordepth_list[]
struct remmina_plugin_rdp_event::@42::@46 clipboard_formatlist
-
static gchar audio_tooltip[]
+
static gchar audio_tooltip[]
gint(* protocol_plugin_get_height)(RemminaProtocolWidget *gp)
gint(* protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt)
-
static gchar monitorids_tooltip[]
+
static gchar monitorids_tooltip[]
void remmina_rdp_event_send_delayed_monitor_layout(RemminaProtocolWidget *gp)
GAsyncQueue * event_queue
@@ -240,16 +240,16 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
guint *(* pref_keymap_get_table)(const gchar *keymap)
void(* protocol_plugin_desktop_resize)(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_post_connect(freerdp *instance)
-
static gchar usb_tooltip[]
+
static gchar usb_tooltip[]
struct remmina_plugin_rdp_event::@42::@48 clipboard_formatdatarequest
GtkWidget * remmina_rdp_settings_new(RemminaPrefPlugin *plugin)
-
static RemminaPrefPlugin remmina_rdps
+
static RemminaPrefPlugin remmina_rdps
gchar *(* protocol_plugin_init_get_username)(RemminaProtocolWidget *gp)
-
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget *gp)
+
static gboolean remmina_rdp_close_connection(RemminaProtocolWidget *gp)
void remmina_rdp_clipboard_free(rfContext *rfi)
@@ -261,14 +261,14 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
static BOOL rf_keyboard_set_ime_status(rdpContext *context, UINT16 imeId, UINT32 imeState, UINT32 imeConvMode)
void remmina_rdp_OnChannelDisconnectedEventHandler(void *context, ChannelDisconnectedEventArgs *e)
-
static char remmina_plugin_rdp_version[256]
+
static char remmina_plugin_rdp_version[256]
static BOOL rf_keyboard_set_indicators(rdpContext *context, UINT16 led_flags)
static BOOL remmina_rdp_gw_authenticate(freerdp *instance, char **username, char **password, char **domain)
DispClientContext * dispcontext
-
static char * buildconfig_strstr(const char *bc, const char *option)
-
static gchar clientbuild_list[]
+
static char * buildconfig_strstr(const char *bc, const char *option)
+
static gchar clientbuild_list[]
static DWORD remmina_rdp_verify_certificate(freerdp *instance, const char *common_name, const char *subject, const char *issuer, const char *fingerprint, BOOL host_mismatch) __attribute__((unused))
void remmina_rdp_event_update_scale(RemminaProtocolWidget *gp)
@@ -277,33 +277,33 @@ $(document).ready(function(){initNavTree('rdp__plugin_8c_source.html','');});
void(* file_set_string)(RemminaFile *remminafile, const gchar *setting, const gchar *value)
void(* protocol_plugin_set_height)(RemminaProtocolWidget *gp, gint height)
static BOOL rf_end_paint(rdpContext *context)
-
static gpointer remmina_rdp_main_thread(gpointer data)
+
static gpointer remmina_rdp_main_thread(gpointer data)
void remmina_rdp_event_unfocus(RemminaProtocolWidget *gp)
static BOOL remmina_rdp_pre_connect(freerdp *instance)
static gchar * remmina_rdp_find_prdriver(char *smap, char *prn)
-
static gchar timeout_tooltip[]
+
static gchar timeout_tooltip[]
static gboolean remmina_rdp_tunnel_init(RemminaProtocolWidget *gp)
struct remmina_plugin_rdp_ui_object::@50::@57 event
gchar *(* protocol_plugin_start_direct_tunnel)(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus)
void remmina_rdp_monitor_get(rfContext *rfi, gchar **monitorids, guint32 *maxwidth, guint32 *maxheight)
Set the MonitorIDs, the maxwidth and maxheight.
-
static const RemminaProtocolSetting remmina_rdp_basic_settings[]
-
static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
+
static const RemminaProtocolSetting remmina_rdp_basic_settings[]
+
static gboolean remmina_rdp_get_screenshot(RemminaProtocolWidget *gp, RemminaPluginScreenshotData *rpsd)
void remmina_rdp_event_event_push(RemminaProtocolWidget *gp, const RemminaPluginRdpEvent *e)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
-
static gchar drive_tooltip[]
+
static gchar drive_tooltip[]
RemminaPluginService * remmina_plugin_service
gboolean remmina_rdp_event_on_map(RemminaProtocolWidget *gp)
struct timeval clientformatdatarequest_tv
-
static gpointer gwtransp_list[]
+
static gpointer gwtransp_list[]
-
static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
+
static void remmina_rdp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
gchar *(* protocol_plugin_init_get_domain)(RemminaProtocolWidget *gp)
N_("Unable to connect to VNC server")
gboolean(* is_main_thread)(void)
diff --git a/public/remmina__exec_8c_source.html b/public/remmina__exec_8c_source.html
index ddfdce9c1..5311bffea 100644
--- a/public/remmina__exec_8c_source.html
+++ b/public/remmina__exec_8c_source.html
@@ -104,7 +104,7 @@ $(document).ready(function(){initNavTree('remmina__exec_8c_source.html','');});
gboolean remmina_icon_is_available(void)
Determine whenever the Remmina icon is available.
-
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
+
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
GtkWidget * remmina_main_new(void)
void remmina_main_save_before_destroy()
Save the Remmina Main Window size and the expanded group before to close Remmina. ...
const gchar * remmina_exec_get_build_config(void)
@@ -129,7 +129,7 @@ $(document).ready(function(){initNavTree('remmina__exec_8c_source.html','');});
void remmina_exec_exitremmina()
gboolean remmina_pref_get_boolean(const gchar *key)
-
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
+
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
void remmina_main_destroy()
RemminaFile * remmina_file_new(void)
diff --git a/public/remmina__file__editor_8c.html b/public/remmina__file__editor_8c.html
index 23d8483b2..e6dd55da9 100644
--- a/public/remmina__file__editor_8c.html
+++ b/public/remmina__file__editor_8c.html
@@ -357,7 +357,7 @@ Variables
@@ -415,7 +415,7 @@ Variables
@@ -471,7 +471,7 @@ Variables
@@ -521,7 +521,7 @@ Variables
@@ -549,7 +549,7 @@ Variables
@@ -617,7 +617,7 @@ Variables
@@ -694,7 +694,7 @@ Variables
Create checkbox + gtk_file_chooser for open files and select folders.
The code is wrong, because if the checkbox is not active, the value should be set to NULL and remove it from the remmina file. The problem is that this function knows nothing about the remmina file. This should be rewritten in a more generic way Please use REMMINA_PROTOCOL_SETTING_TYPE_TEXT
-Definition at line 847 of file remmina_file_editor.c.
+Definition at line 844 of file remmina_file_editor.c.
@@ -768,7 +768,7 @@ Variables
@@ -848,7 +848,7 @@ Variables
@@ -928,7 +928,7 @@ Variables
@@ -1080,7 +1080,7 @@ Variables
@@ -1130,7 +1130,7 @@ Variables
@@ -1204,7 +1204,7 @@ Variables
@@ -1254,7 +1254,7 @@ Variables
@@ -1298,7 +1298,7 @@ Variables
@@ -1336,7 +1336,7 @@ Variables
@@ -1404,7 +1404,7 @@ Variables
@@ -1484,7 +1484,7 @@ Variables
@@ -1552,7 +1552,7 @@ Variables
@@ -1638,7 +1638,7 @@ Variables
@@ -1676,7 +1676,7 @@ Variables
@@ -1696,7 +1696,7 @@ Variables
@@ -1724,7 +1724,7 @@ Variables
@@ -1772,7 +1772,7 @@ Variables
@@ -1816,7 +1816,7 @@ Variables
@@ -1836,7 +1836,7 @@ Variables
@@ -1856,7 +1856,7 @@ Variables
@@ -1876,7 +1876,7 @@ Variables
@@ -1896,7 +1896,7 @@ Variables
@@ -1926,7 +1926,7 @@ Variables
@@ -1964,7 +1964,7 @@ Variables
@@ -2002,7 +2002,7 @@ Variables
@@ -2040,7 +2040,7 @@ Variables
@@ -2116,7 +2116,7 @@ Variables
@@ -2155,7 +2155,7 @@ Variables
@@ -2193,7 +2193,7 @@ Variables
@@ -2221,7 +2221,7 @@ Variables
@@ -2249,7 +2249,7 @@ Variables
@@ -2350,7 +2350,7 @@ TODO: Responsive text size and line wrap.
@@ -2426,7 +2426,7 @@ TODO: Responsive text size and line wrap.
@@ -2464,7 +2464,7 @@ TODO: Responsive text size and line wrap.
@@ -2502,7 +2502,7 @@ TODO: Responsive text size and line wrap.
@@ -2552,7 +2552,7 @@ TODO: Responsive text size and line wrap.
@@ -2578,7 +2578,7 @@ TODO: Responsive text size and line wrap.
diff --git a/public/remmina__file__editor_8c_source.html b/public/remmina__file__editor_8c_source.html
index ddf136034..ae1cff2ce 100644
--- a/public/remmina__file__editor_8c_source.html
+++ b/public/remmina__file__editor_8c_source.html
@@ -86,7 +86,7 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8c_source.html',
remmina_file_editor.c
-
Go to the documentation of this file. 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;
125 GtkWidget * ssh_tunnel_enabled_check;
126 GtkWidget * ssh_tunnel_loopback_check;
127 GtkWidget * ssh_tunnel_server_default_radio;
128 GtkWidget * ssh_tunnel_server_custom_radio;
129 GtkWidget * ssh_tunnel_server_entry;
130 GtkWidget * ssh_tunnel_auth_agent_radio;
131 GtkWidget * ssh_tunnel_auth_password_radio;
132 GtkWidget * ssh_tunnel_auth_password;
133 GtkWidget * ssh_tunnel_passphrase;
134 GtkWidget * ssh_tunnel_auth_publickey_radio;
135 GtkWidget * ssh_tunnel_auth_auto_publickey_radio;
136 GtkWidget * ssh_tunnel_auth_combo;
137 GtkWidget * ssh_tunnel_username_entry;
138 GtkWidget * ssh_tunnel_privatekey_chooser;
139 GtkWidget * ssh_tunnel_certfile_chooser;
141 GHashTable * setting_widgets;
146 TRACE_CALL(__func__);
165 GtkWidget * failed_widget,
170 g_set_error(&err, 1, 1, _(
"Input is invalid."));
173 if (!gfe || !failed_widget) {
174 g_critical(
"(%s): Parameters RemminaFileEditor 'gfe' or " 175 "GtkWidget* 'failed_widget' are 'NULL'!",
180 gint widget_width = gtk_widget_get_allocated_width(failed_widget);
181 gint widget_height = gtk_widget_get_allocated_height(failed_widget);
183 GtkWidget *err_label = gtk_label_new(
"");
184 GtkWidget *alert_icon = NULL;
185 GtkWindow *err_window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
186 GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
187 GdkWindow *window = gtk_widget_get_window(failed_widget);
189 GtkAllocation allocation;
190 gint failed_widget_x, failed_widget_y;
192 gchar *markup = g_strdup_printf(
"<span size='large'>%s</span>", err->message);
195 gtk_window_set_decorated(err_window, FALSE);
196 gtk_window_set_type_hint(err_window, GDK_WINDOW_TYPE_HINT_TOOLTIP);
197 gtk_window_set_default_size(err_window, widget_width, widget_height);
198 gtk_window_set_title(err_window,
"Error");
199 gtk_window_set_resizable(err_window, TRUE);
202 gtk_window_set_attached_to(err_window, failed_widget);
203 gtk_window_set_transient_for(err_window, GTK_WINDOW(gfe));
204 gdk_window_get_origin(GDK_WINDOW(window), &failed_widget_x, &failed_widget_y);
205 gtk_widget_get_allocation(failed_widget, &allocation);
206 failed_widget_x += allocation.x;
207 failed_widget_y += allocation.y + allocation.height;
208 gtk_window_move(err_window, failed_widget_x, failed_widget_y);
211 gtk_label_set_selectable(GTK_LABEL(err_label), FALSE);
212 gtk_label_set_max_width_chars(GTK_LABEL(err_label), 1);
213 gtk_widget_set_hexpand(GTK_WIDGET(err_label), TRUE);
214 gtk_widget_set_vexpand(GTK_WIDGET(err_label), TRUE);
215 gtk_label_set_ellipsize(GTK_LABEL(err_label), PANGO_ELLIPSIZE_END);
216 gtk_label_set_line_wrap(GTK_LABEL(err_label), TRUE);
217 gtk_label_set_line_wrap_mode(GTK_LABEL(err_label), PANGO_WRAP_WORD_CHAR);
218 gtk_label_set_markup(GTK_LABEL(err_label), markup);
220 alert_icon = gtk_image_new_from_icon_name(
"dialog-warning-symbolic",
224 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(alert_icon), FALSE, FALSE, 0);
225 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(err_label), TRUE, TRUE, 5);
228 gtk_container_add(GTK_CONTAINER(err_window), GTK_WIDGET(box));
231 gtk_widget_show_all(GTK_WIDGET(err_window));
234 g_signal_connect(G_OBJECT(err_window),
"focus-out-event",
235 G_CALLBACK(gtk_window_close), NULL);
236 g_signal_connect(G_OBJECT(err_window),
"button-press-event",
237 G_CALLBACK(gtk_window_close), NULL);
240 #ifdef HAVE_LIBAVAHI_UI 244 TRACE_CALL(__func__);
248 dialog = aui_service_dialog_new(_(
"Choose a Remote Desktop Server"),
250 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
251 _(
"_OK"), GTK_RESPONSE_ACCEPT,
254 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
255 aui_service_dialog_set_resolve_service(AUI_SERVICE_DIALOG(dialog), TRUE);
256 aui_service_dialog_set_resolve_host_name(AUI_SERVICE_DIALOG(dialog), TRUE);
257 aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(dialog),
258 gfe->
priv->avahi_service_type, NULL);
260 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
261 host = g_strdup_printf(
"[%s]:%i",
262 aui_service_dialog_get_host_name(AUI_SERVICE_DIALOG(dialog)),
263 aui_service_dialog_get_port(AUI_SERVICE_DIALOG(dialog)));
267 gtk_widget_destroy(dialog);
270 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gfe->
priv->server_combo))), host);
278 TRACE_CALL(__func__);
280 GtkWidget *defaultwidget;
282 gfe = REMMINA_FILE_EDITOR(widget);
284 defaultwidget = gfe->
priv->server_combo;
287 if (GTK_IS_EDITABLE(defaultwidget))
288 gtk_editable_select_region(GTK_EDITABLE(defaultwidget), 0, -1);
289 gtk_widget_grab_focus(defaultwidget);
295 TRACE_CALL(__func__);
297 g_hash_table_destroy(REMMINA_FILE_EDITOR(widget)->priv->setting_widgets);
298 g_free(REMMINA_FILE_EDITOR(widget)->priv);
303 TRACE_CALL(__func__);
304 gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)));
309 TRACE_CALL(__func__);
311 gfe->
priv->config_container = gtk_notebook_new();
312 gfe->
priv->config_viewport = gtk_viewport_new(NULL, NULL);
313 gfe->
priv->config_scrollable = gtk_scrolled_window_new(NULL, NULL);
314 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_scrollable), 2);
315 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gfe->
priv->config_scrollable),
316 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
317 gtk_widget_show(gfe->
priv->config_scrollable);
319 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_viewport), gfe->
priv->config_container);
320 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_viewport), 2);
321 gtk_widget_show(gfe->
priv->config_viewport);
322 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_scrollable), gfe->
priv->config_viewport);
323 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_container), 2);
324 gtk_widget_show(gfe->
priv->config_container);
326 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_box), gfe->
priv->config_scrollable);
330 const gchar *stock_id,
const gchar *label, gint rows, gint cols)
332 TRACE_CALL(__func__);
338 tablabel = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
339 gtk_widget_show(tablabel);
341 widget = gtk_image_new_from_icon_name(stock_id, GTK_ICON_SIZE_BUTTON);
342 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
343 gtk_widget_show(widget);
345 widget = gtk_label_new(label);
346 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
347 gtk_widget_show(widget);
349 tabbody = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
350 gtk_widget_show(tabbody);
351 gtk_notebook_append_page(GTK_NOTEBOOK(gfe->
priv->config_container), tabbody, tablabel);
353 grid = gtk_grid_new();
354 gtk_widget_show(grid);
355 gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
356 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
357 gtk_container_set_border_width(GTK_CONTAINER(grid), 15);
358 gtk_box_pack_start(GTK_BOX(tabbody), grid, FALSE, FALSE, 0);
367 TRACE_CALL(__func__);
368 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_entry),
369 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check)) &&
370 (gfe->
priv->ssh_tunnel_server_custom_radio == NULL ||
371 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_server_custom_radio))));
378 TRACE_CALL(__func__);
380 gboolean enabled = TRUE;
382 if (gfe->
priv->assistance_toggle) {
383 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->assistance_toggle));
384 if (gfe->
priv->assistance_file)
385 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file), enabled);
386 if (gfe->
priv->assistance_password)
387 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password), enabled);
388 if (gfe->
priv->assistance_file_label)
389 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file_label), enabled);
390 if (gfe->
priv->assistance_password_label)
391 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password_label), enabled);
398 TRACE_CALL(__func__);
400 gboolean enabled = TRUE;
403 const gchar *s = NULL;
405 if (gfe->
priv->ssh_tunnel_enabled_check) {
406 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check));
407 if (gfe->
priv->ssh_tunnel_loopback_check)
408 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_loopback_check), enabled);
409 if (gfe->
priv->ssh_tunnel_server_default_radio)
410 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_default_radio), enabled);
411 if (gfe->
priv->ssh_tunnel_server_custom_radio)
412 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_custom_radio), enabled);
416 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_username_entry), enabled);
417 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_password), enabled);
418 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_combo), enabled);
425 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_privatekey_chooser), s);
428 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_certfile_chooser), s);
430 if (gfe->
priv->ssh_tunnel_username_entry)
431 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry))[0] ==
'\0') {
433 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry), cp ? cp :
"");
436 if (gfe->
priv->ssh_tunnel_auth_password) {
437 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password))[0] ==
'\0') {
439 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password), cp ? cp :
"");
442 if (gfe->
priv->ssh_tunnel_passphrase) {
443 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase))[0] ==
'\0') {
445 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase), cp ? cp :
"");
455 TRACE_CALL(__func__);
458 #ifdef HAVE_LIBAVAHI_UI 463 widget = gtk_label_new(_(
"Server"));
464 gtk_widget_show(widget);
465 gtk_widget_set_valign(widget, GTK_ALIGN_START);
466 gtk_widget_set_halign(widget, GTK_ALIGN_START);
467 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, row + 1);
471 gtk_widget_set_hexpand(widget, TRUE);
472 gtk_widget_show(widget);
473 gtk_widget_set_tooltip_markup(widget, _(server_tips));
474 gtk_entry_set_activates_default(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget))), TRUE);
475 gfe->
priv->server_combo = widget;
478 #ifdef HAVE_LIBAVAHI_UI 480 gfe->
priv->avahi_service_type = (
const gchar *)setting->
opt1;
482 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
483 gtk_widget_show(hbox);
484 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
486 widget = gtk_button_new_with_label(
"…");
487 s = g_strdup_printf(_(
"Browse the network to find a %s server"), plugin->
name);
488 gtk_widget_set_tooltip_text(widget, s);
490 gtk_widget_show(widget);
491 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
494 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
498 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
505 TRACE_CALL(__func__);
508 widget = gtk_label_new(label);
509 gtk_widget_show(widget);
510 #if GTK_CHECK_VERSION(3, 12, 0) 511 gtk_widget_set_margin_end(widget, 40);
513 gtk_widget_set_margin_right(widget, 40);
515 gtk_widget_set_valign(widget, GTK_ALIGN_START);
516 gtk_widget_set_halign(widget, GTK_ALIGN_START);
517 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
519 widget = gtk_entry_new();
520 gtk_widget_show(widget);
521 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
522 gtk_entry_set_max_length(GTK_ENTRY(widget), 0);
523 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
524 gtk_widget_set_hexpand(widget, TRUE);
525 gtk_entry_set_activates_default(GTK_ENTRY(widget), TRUE);
527 gtk_widget_set_name(widget, setting_name);
530 gtk_entry_set_text(GTK_ENTRY(widget), value);
533 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY,
"org.remmina.Remmina-password-reveal-symbolic");
534 gtk_entry_set_icon_activatable(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY, TRUE);
542 TRACE_CALL(__func__);
544 res_str = g_strdup_printf(
"%dx%d",
554 TRACE_CALL(__func__);
560 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
561 gtk_dialog_run(dialog);
565 gtk_widget_destroy(GTK_WIDGET(dialog));
569 GtkWidget *grid, gint row)
571 TRACE_CALL(__func__);
574 int resolution_w, resolution_h;
585 if (resolution_w <= 0 || resolution_h <= 0)
591 res_str = g_strdup_printf(
"%dx%d", resolution_w, resolution_h);
595 widget = gtk_label_new(_(
"Resolution"));
596 gtk_widget_show(widget);
597 gtk_widget_set_valign(widget, GTK_ALIGN_START);
598 gtk_widget_set_halign(widget, GTK_ALIGN_START);
599 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
601 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
602 widget = gtk_radio_button_new_with_label(NULL, _(
"Use initial window size"));
603 gtk_widget_show(widget);
604 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
605 gfe->
priv->resolution_iws_radio = widget;
606 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Use client resolution"));
607 gtk_widget_show(widget);
608 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
609 gfe->
priv->resolution_auto_radio = widget;
610 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
611 gtk_widget_show(hbox);
613 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
614 gtk_widget_show(hbox);
615 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row + 1, 1, 1);
617 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Custom"));
618 gtk_widget_show(widget);
619 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
620 gfe->
priv->resolution_custom_radio = widget;
623 gtk_widget_show(widget);
624 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
625 gfe->
priv->resolution_custom_combo = widget;
627 widget = gtk_button_new_with_label(
"…");
628 gtk_widget_show(widget);
629 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
632 g_signal_connect(G_OBJECT(gfe->
priv->resolution_custom_radio),
"toggled",
636 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio), TRUE);
638 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_auto_radio), TRUE);
640 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_iws_radio), TRUE);
642 gtk_widget_set_sensitive(gfe->
priv->resolution_custom_combo, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio)));
649 GtkWidget *grid, gint row)
651 TRACE_CALL(__func__);
658 widget = gtk_toggle_button_new_with_label(_(
"Assistance Mode"));
659 gtk_widget_set_halign(widget, GTK_ALIGN_START);
660 gtk_widget_show(widget);
661 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
663 gfe->
priv->assistance_toggle = widget;
667 widget = gtk_label_new(
"Assistance file");
668 gtk_widget_set_halign(widget, GTK_ALIGN_END);
669 gtk_widget_show(widget);
670 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+1, 1, 1);
671 gfe->
priv->assistance_file_label = widget;
673 widget = gtk_entry_new();
674 gtk_widget_set_halign(widget, GTK_ALIGN_START);
675 gtk_widget_show(widget);
677 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+1, 1, 1);
678 gfe->
priv->assistance_file = widget;
680 widget = gtk_label_new(
"Assistance Password");
681 gtk_widget_set_halign(widget, GTK_ALIGN_END);
682 gtk_widget_show(widget);
683 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+2, 1, 1);
684 gfe->
priv->assistance_password_label = widget;
686 widget = gtk_entry_new();
687 gtk_widget_set_halign(widget, GTK_ALIGN_START);
688 gtk_widget_show(widget);
690 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+2, 1, 1);
691 gfe->
priv->assistance_password = widget;
699 gint row, gint col,
const gchar *label,
const gchar *value, gint left,
700 gint right, gchar *setting_name)
702 TRACE_CALL(__func__);
705 widget = gtk_label_new(label);
706 gtk_widget_show(widget);
707 #if GTK_CHECK_VERSION(3, 12, 0) 708 gtk_widget_set_margin_start(widget, left);
709 gtk_widget_set_margin_end(widget, right);
711 gtk_widget_set_margin_left(widget, left);
712 gtk_widget_set_margin_right(widget, right);
714 gtk_widget_set_valign(widget, GTK_ALIGN_START);
715 gtk_widget_set_halign(widget, GTK_ALIGN_START);
716 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
718 widget = gtk_entry_new();
719 gtk_widget_show(widget);
720 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
721 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
722 gtk_widget_set_hexpand(widget, TRUE);
724 gtk_widget_set_name(widget, setting_name);
727 gtk_entry_set_text(GTK_ENTRY(widget), value);
733 gint row, gint col,
const gchar *label,
const gchar *value,
736 TRACE_CALL(__func__);
742 gint row, gint col,
const gchar *label,
const gchar *value,
745 TRACE_CALL(__func__);
748 GtkTextBuffer *buffer;
751 widget = gtk_text_view_new();
752 view = GTK_TEXT_VIEW(widget);
753 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
754 gtk_text_view_set_top_margin(GTK_TEXT_VIEW(view), 20);
755 gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(view), 20);
756 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 20);
757 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 20);
758 gtk_text_view_set_monospace(view, TRUE);
760 gtk_widget_set_name(widget, setting_name);
762 buffer = gtk_text_view_get_buffer(view);
763 gtk_text_buffer_set_text(buffer, value, -1);
764 gtk_text_buffer_get_start_iter(buffer, &start);
765 gtk_text_buffer_place_cursor(buffer, &start);
767 gtk_widget_show(widget);
768 gtk_widget_set_hexpand(widget, TRUE);
769 gtk_widget_set_size_request(GTK_WIDGET(view), 320, 300);
770 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
775 gint row, gint col,
const gchar *label,
const gpointer *list,
776 const gchar *value, gchar *setting_name)
778 TRACE_CALL(__func__);
781 widget = gtk_label_new(label);
782 gtk_widget_show(widget);
783 gtk_widget_set_valign(widget, GTK_ALIGN_START);
784 gtk_widget_set_halign(widget, GTK_ALIGN_START);
786 gtk_widget_set_name(widget, setting_name);
787 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
790 gtk_widget_show(widget);
791 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
797 gint row, gint col,
const gchar *label,
const gchar *list,
798 const gchar *value, gchar *setting_name)
800 TRACE_CALL(__func__);
803 widget = gtk_label_new(label);
804 gtk_widget_show(widget);
805 gtk_widget_set_valign(widget, GTK_ALIGN_START);
806 gtk_widget_set_halign(widget, GTK_ALIGN_START);
807 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
810 gtk_widget_show(widget);
811 gtk_widget_set_hexpand(widget, TRUE);
813 gtk_widget_set_name(widget, setting_name);
814 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
820 gint row, gint top,
const gchar *label, gboolean value,
823 TRACE_CALL(__func__);
825 widget = gtk_check_button_new_with_label(label);
826 gtk_widget_show(widget);
828 gtk_widget_set_name(widget, setting_name);
829 gtk_grid_attach(GTK_GRID(grid), widget, top, row, 1, 1);
832 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
848 const gchar *value, gint type, gchar *setting_name)
850 TRACE_CALL(__func__);
855 widget = gtk_label_new(label);
856 gtk_widget_show(widget);
857 gtk_widget_set_valign(widget, GTK_ALIGN_START);
858 gtk_widget_set_halign(widget, GTK_ALIGN_START);
859 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
861 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
862 gtk_widget_show(hbox);
863 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
865 check = gtk_check_button_new();
866 gtk_widget_show(check);
867 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (value && value[0] ==
'/'));
868 gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
870 widget = gtk_file_chooser_button_new(label, type);
872 gtk_widget_set_name(widget, setting_name);
873 gtk_widget_show(widget);
875 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), value);
876 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
886 gint length, gint *position, gpointer data)
888 for (
int i = 0; i < length; i++) {
889 if (!isdigit(text[i]) && text[i] !=
'-') {
890 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
900 gint length, gint *position, gpointer data)
902 for (
int i = 0; i < length; i++) {
903 if (!isdigit(text[i]) && text[i] !=
'-' && text[i] !=
'.' && text[i] !=
',') {
904 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
911 gint row, gint col,
const gchar *label,
const gint value,
912 gint left, gint right, gchar *setting_name)
914 TRACE_CALL(__func__);
917 widget = gtk_label_new(label);
918 gtk_widget_show(widget);
919 #if GTK_CHECK_VERSION(3, 12, 0) 920 gtk_widget_set_margin_start(widget, left);
921 gtk_widget_set_margin_end(widget, right);
923 gtk_widget_set_margin_left(widget, left);
924 gtk_widget_set_margin_right(widget, right);
926 gtk_widget_set_valign(widget, GTK_ALIGN_START);
927 gtk_widget_set_halign(widget, GTK_ALIGN_START);
928 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
930 widget = gtk_entry_new();
931 gtk_widget_show(widget);
932 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
933 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
934 gtk_widget_set_hexpand(widget, TRUE);
936 gtk_widget_set_name(widget, setting_name);
939 int length = snprintf(NULL, 0,
"%d", value) + 1;
940 char *str = malloc(length);
941 snprintf(str, length,
"%d", value);
943 gtk_entry_set_text(GTK_ENTRY(widget), str);
946 g_signal_connect(G_OBJECT(widget),
"insert-text",
953 GtkWidget *grid, gint row, gint col,
954 const gchar *label, gdouble value, gint left,
955 gint right, gchar *setting_name)
957 TRACE_CALL(__func__);
960 widget = gtk_label_new(label);
961 gtk_widget_show(widget);
962 #if GTK_CHECK_VERSION(3, 12, 0) 963 gtk_widget_set_margin_start(widget, left);
964 gtk_widget_set_margin_end(widget, right);
966 gtk_widget_set_margin_left(widget, left);
967 gtk_widget_set_margin_right(widget, right);
969 gtk_widget_set_valign(widget, GTK_ALIGN_START);
970 gtk_widget_set_halign(widget, GTK_ALIGN_START);
971 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
973 widget = gtk_entry_new();
974 gtk_widget_show(widget);
975 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
976 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
977 gtk_widget_set_hexpand(widget, TRUE);
979 gtk_widget_set_name(widget, setting_name);
982 int length = snprintf(NULL, 0,
"%.8g", value) + 1;
983 char *str = malloc(length);
984 snprintf(str, length,
"%f", value);
986 gtk_entry_set_text(GTK_ENTRY(widget), str);
989 g_signal_connect(G_OBJECT(widget),
"insert-text",
1000 TRACE_CALL(__func__);
1004 gint grid_column = 0;
1006 gchar *setting_name;
1007 const gchar *escaped;
1011 switch (settings->
type) {
1018 g_dgettext(priv->plugin->domain, settings->
label),
1021 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1039 _(
"Keyboard mapping"), (
const gpointer *)strarr,
1048 g_dgettext(priv->plugin->domain, settings->
label),
1051 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1053 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1059 escaped = g_uri_unescape_string(escaped, NULL);
1061 g_dgettext(priv->plugin->domain, settings->
label), escaped,
1063 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1069 g_dgettext(priv->plugin->domain, settings->
label),
1070 (
const gpointer *)settings->
opt1,
1073 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1075 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1080 g_dgettext(priv->plugin->domain, settings->
label),
1081 (
const gchar *)settings->
opt1,
1084 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1086 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1091 g_dgettext(priv->plugin->domain, settings->
label),
1094 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1096 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1101 g_dgettext(priv->plugin->domain, settings->
label),
1103 GTK_FILE_CHOOSER_ACTION_OPEN, setting_name);
1104 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1106 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1111 g_dgettext(priv->plugin->domain, settings->
label),
1113 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1115 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1117 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1121 g_dgettext(priv->plugin->domain, settings->
label),
1123 0, 40, setting_name);
1124 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1126 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1131 g_dgettext(priv->plugin->domain, settings->
label),
1133 0, 40, setting_name);
1134 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1136 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1149 if (!settings->
compact || grid_column > 1) {
1159 TRACE_CALL(__func__);
1174 priv->behavior_precommand_entry = widget;
1175 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"command %h %u %t %U %p %g --option"));
1176 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1181 priv->behavior_postcommand_entry = widget;
1182 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"/path/to/command -opt1 arg %h %u %t -opt2 %U %p %g"));
1183 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1203 "0",
N_(
"Password"),
1204 "1",
N_(
"SSH identity file"),
1205 "2",
N_(
"SSH agent"),
1206 "3",
N_(
"Public key (automatic)"),
1207 "4",
N_(
"Kerberos (GSSAPI)"),
1214 TRACE_CALL(__func__);
1229 _(
"SSH Tunnel"), 9, 3);
1230 widget = gtk_toggle_button_new_with_label(_(
"Enable SSH tunnel"));
1231 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1232 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1233 g_signal_connect(G_OBJECT(widget),
"toggled",
1235 priv->ssh_tunnel_enabled_check = widget;
1237 widget = gtk_check_button_new_with_label(_(
"Tunnel via loopback address"));
1238 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1239 priv->ssh_tunnel_loopback_check = widget;
1245 switch (ssh_setting) {
1247 s = g_strdup_printf(_(
"Same server at port %i"), DEFAULT_SSH_PORT);
1248 widget = gtk_radio_button_new_with_label(NULL, s);
1250 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 3, 1);
1251 priv->ssh_tunnel_server_default_radio = widget;
1255 widget = gtk_radio_button_new_with_label_from_widget(
1256 GTK_RADIO_BUTTON(priv->ssh_tunnel_server_default_radio), _(
"Custom"));
1257 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1258 g_signal_connect(G_OBJECT(widget),
"toggled",
1260 priv->ssh_tunnel_server_custom_radio = widget;
1262 widget = gtk_entry_new();
1263 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
1264 gtk_widget_set_tooltip_markup(widget, _(server_tips2));
1265 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1266 priv->ssh_tunnel_server_entry = widget;
1272 priv->ssh_tunnel_server_default_radio = NULL;
1273 priv->ssh_tunnel_server_custom_radio = NULL;
1276 _(
"Server"), NULL,
"ssh_reverse_tunnel_server");
1277 gtk_widget_set_tooltip_markup(priv->ssh_tunnel_server_entry, _(server_tips));
1283 priv->ssh_tunnel_server_default_radio = NULL;
1284 priv->ssh_tunnel_server_custom_radio = NULL;
1285 priv->ssh_tunnel_server_entry = NULL;
1297 _(
"Start-up path"), NULL,
"start-up-path");
1299 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1300 g_hash_table_insert(priv->setting_widgets,
"execpath", widget);
1311 _(
"Authentication type"),
1318 priv->ssh_tunnel_username_entry =
1320 _(
"Username"), NULL,
"ssh_tunnel_username");
1328 "ssh_tunnel_password");
1329 priv->ssh_tunnel_auth_password = widget;
1333 _(
"SSH private key file"),
1335 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_privatekey");
1339 _(
"SSH certificate file"),
1341 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_certfile");
1344 widget = gtk_label_new(_(
"Password to unlock private key"));
1345 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1346 widget = gtk_entry_new();
1347 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1348 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
1349 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
1350 gtk_widget_set_hexpand(widget, TRUE);
1351 priv->ssh_tunnel_passphrase = widget;
1357 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
1359 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
1362 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cs ? priv->ssh_tunnel_server_custom_radio : priv->ssh_tunnel_server_default_radio), TRUE);
1363 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
1366 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
1368 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
1370 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
1375 gtk_widget_show_all(grid);
1382 TRACE_CALL(__func__);
1395 if (priv->plugin->basic_settings) {
1401 if (priv->plugin->advanced_settings) {
1419 TRACE_CALL(__func__);
1423 if (priv->config_container) {
1424 gtk_widget_destroy(priv->config_container);
1425 priv->config_container = NULL;
1426 gtk_widget_destroy(priv->config_viewport);
1427 priv->config_viewport = NULL;
1428 gtk_widget_destroy(priv->config_scrollable);
1429 priv->config_scrollable = NULL;
1432 priv->server_combo = NULL;
1433 priv->resolution_iws_radio = NULL;
1434 priv->resolution_auto_radio = NULL;
1435 priv->resolution_custom_radio = NULL;
1436 priv->resolution_custom_combo = NULL;
1437 priv->keymap_combo = NULL;
1439 priv->ssh_tunnel_enabled_check = NULL;
1440 priv->ssh_tunnel_loopback_check = NULL;
1441 priv->ssh_tunnel_server_default_radio = NULL;
1442 priv->ssh_tunnel_server_custom_radio = NULL;
1443 priv->ssh_tunnel_server_entry = NULL;
1444 priv->ssh_tunnel_username_entry = NULL;
1445 priv->ssh_tunnel_auth_combo = NULL;
1446 priv->ssh_tunnel_auth_password = NULL;
1447 priv->ssh_tunnel_privatekey_chooser = NULL;
1448 priv->ssh_tunnel_certfile_chooser = NULL;
1450 g_hash_table_remove_all(priv->setting_widgets);
1463 TRACE_CALL(__func__);
1466 remmina_file_set_string(priv->remmina_file,
"precommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_precommand_entry)));
1467 remmina_file_set_string(priv->remmina_file,
"postcommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_postcommand_entry)));
1469 gboolean autostart_enabled = (priv->behavior_autostart_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_autostart_check)) : FALSE);
1471 gboolean lock_enabled = (priv->behavior_lock_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_lock_check)) : FALSE);
1477 TRACE_CALL(__func__);
1479 gboolean ssh_tunnel_enabled;
1480 int ssh_tunnel_auth;
1482 ssh_tunnel_enabled = (priv->ssh_tunnel_enabled_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check)) : FALSE);
1484 "ssh_tunnel_loopback",
1485 (priv->ssh_tunnel_loopback_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) : FALSE));
1490 (ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL));
1493 "ssh_tunnel_server",
1494 (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));
1496 ssh_tunnel_auth = gtk_combo_box_get_active(GTK_COMBO_BOX(priv->ssh_tunnel_auth_combo));
1505 if (gtk_widget_get_sensitive(priv->ssh_tunnel_privatekey_chooser)) {
1508 "ssh_tunnel_privatekey",
1509 (priv->ssh_tunnel_privatekey_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser)) : NULL));
1515 if (gtk_widget_get_sensitive(priv->ssh_tunnel_certfile_chooser)) {
1518 "ssh_tunnel_certfile",
1519 (priv->ssh_tunnel_certfile_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_certfile_chooser)) : NULL));
1527 "ssh_tunnel_password",
1528 (ssh_tunnel_enabled && (ssh_tunnel_auth ==
SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_auth_password)) : NULL);
1532 "ssh_tunnel_passphrase",
1537 gchar * setting_name_to_validate,
1538 gconstpointer value,
1541 if (!setting_name_to_validate || !value || !gfe) {
1542 if (!setting_name_to_validate) {
1543 g_critical(_(
"(%s: %i): Can't validate setting '%s' since 'value' or 'gfe' " 1545 __func__, __LINE__, setting_name_to_validate);
1547 g_critical(_(
"(%s: %i): Can't validate user input since " 1548 "'setting_name_to_validate', 'value' or 'gfe' are NULL!"),
1549 __func__, __LINE__);
1551 g_set_error(err, 1, 1, _(
"Internal error."));
1555 if (strcmp(setting_name_to_validate,
"notes_text") == 0) {
1563 protocol_plugin = priv->plugin;
1569 if (setting_iter->
name == NULL) {
1570 g_error(
"Internal error: a setting name in protocol plugin %s is " 1571 "null. Please fix RemminaProtocolSetting struct content.",
1572 protocol_plugin->
name);
1573 }
else if ((gchar *)setting_name_to_validate) {
1574 if (strcmp((gchar *)setting_name_to_validate, setting_iter->
name) == 0) {
1578 GCallback validator = setting_iter->
validator;
1582 GError *err_ret = NULL;
1584 g_debug(
"Checking setting '%s' for validation.", setting_iter->
name);
1585 if (validator != NULL) {
1589 err_ret = ((GError * (*)(gpointer, gconstpointer, gpointer)) validator)(setting_name_to_validate, value, validator_data);
1593 g_debug(
"it has a validator function and it had an error!");
1615 GtkWidget ** failed_widget)
1617 TRACE_CALL(__func__);
1619 GHashTableIter iter;
1622 GtkTextBuffer *buffer;
1623 gchar *escaped, *unescaped;
1624 GtkTextIter start, end;
1627 *failed_widget = NULL;
1629 g_hash_table_iter_init(&iter, priv->setting_widgets);
1630 while (g_hash_table_iter_next(&iter, &key, &widget)) {
1636 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget)) && !GTK_IS_FILE_CHOOSER(widget)) {
1637 g_debug(
"Grayed-out setting-widget '%s' will not be saved.",
1638 gtk_widget_get_name(widget));
1642 if (GTK_IS_ENTRY(widget)) {
1643 const gchar *value = gtk_entry_get_text(GTK_ENTRY(widget));
1648 *failed_widget = widget;
1653 }
else if (GTK_IS_TEXT_VIEW(widget)) {
1654 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
1655 gtk_text_buffer_get_start_iter(buffer, &start);
1656 gtk_text_buffer_get_end_iter(buffer, &end);
1657 unescaped = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1658 escaped = g_uri_escape_string(unescaped, NULL, TRUE);
1663 *failed_widget = widget;
1669 }
else if (GTK_IS_COMBO_BOX(widget)) {
1675 *failed_widget = widget;
1680 }
else if (GTK_IS_FILE_CHOOSER(widget)) {
1681 gchar *value = gtk_widget_get_sensitive(GTK_WIDGET(widget)) ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)) : NULL;
1683 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget))) {
1692 *failed_widget = widget;
1698 }
else if (GTK_IS_TOGGLE_BUTTON(widget)) {
1699 gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
1704 *failed_widget = widget;
1720 GtkWidget ** failed_widget)
1722 TRACE_CALL(__func__);
1724 gchar *custom_resolution;
1742 if (priv->resolution_auto_radio) {
1743 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_auto_radio))) {
1747 }
else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_iws_radio))) {
1758 g_free(custom_resolution);
1765 if (priv->assistance_toggle){
1766 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->assistance_toggle))) {
1768 remmina_file_set_string(priv->remmina_file,
"assistance_pass", gtk_entry_get_text(priv->assistance_password));
1776 if (priv->keymap_combo)
1787 TRACE_CALL(__func__);
1791 GtkWidget *failed_widget = NULL;
1794 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1817 dialog = gtk_message_dialog_new(GTK_WINDOW(gfe), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
1818 GTK_BUTTONS_OK, _(
"Default settings saved."));
1819 gtk_dialog_run(GTK_DIALOG(dialog));
1820 gtk_widget_destroy(dialog);
1825 TRACE_CALL(__func__);
1827 GtkWidget *failed_widget = NULL;
1830 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1840 gtk_widget_destroy(GTK_WIDGET(gfe));
1845 TRACE_CALL(__func__);
1848 GtkWidget *failed_widget = NULL;
1851 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1860 gtk_widget_destroy(GTK_WIDGET(gfe));
1861 gf->prevent_saving = TRUE;
1867 TRACE_CALL(__func__);
1871 GtkWidget *failed_widget = NULL;
1874 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1888 gtk_widget_destroy(GTK_WIDGET(gfe));
1894 TRACE_CALL(__func__);
1895 gtk_widget_destroy(GTK_WIDGET(gfe));
1900 TRACE_CALL(__func__);
1908 gtk_window_set_title(GTK_WINDOW(gfe), _(
"Remote Connection Profile"));
1910 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Cancel")), GTK_RESPONSE_CANCEL);
1914 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Save as Default")), GTK_RESPONSE_OK);
1915 gtk_widget_set_tooltip_text(GTK_WIDGET(widget), _(
"Use the current settings as the default for all new connection profiles"));
1918 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save")), GTK_RESPONSE_APPLY);
1920 gtk_widget_set_sensitive(widget, FALSE);
1921 priv->save_button = widget;
1923 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Connect")), GTK_RESPONSE_ACCEPT);
1926 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save and Connect")), GTK_RESPONSE_OK);
1927 gtk_widget_set_can_default(widget, TRUE);
1930 gtk_dialog_set_default_response(GTK_DIALOG(gfe), GTK_RESPONSE_OK);
1931 gtk_window_set_default_size(GTK_WINDOW(gfe), 800, 600);
1936 priv->setting_widgets = g_hash_table_new(g_str_hash, g_str_equal);
1943 TRACE_CALL(__func__);
1945 GtkListStore *store;
1949 store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gfe->
priv->protocol_combo)));
1951 first = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
1953 gtk_list_store_append(store, &iter);
1954 gtk_list_store_set(store, &iter, 0, protocol, 1, g_dgettext(plugin->
domain, plugin->
description), 2,
1958 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gfe->
priv->protocol_combo), &iter);
1965 TRACE_CALL(__func__);
1969 gtk_widget_set_sensitive(priv->group_combo, TRUE);
1970 gtk_widget_set_sensitive(priv->save_button, TRUE);
1975 TRACE_CALL(__func__);
1992 TRACE_CALL(__func__);
2006 TRACE_CALL(__func__);
2015 gfe = REMMINA_FILE_EDITOR(g_object_new(REMMINA_TYPE_FILE_EDITOR, NULL));
2017 priv->remmina_file = remminafile;
2020 gtk_dialog_set_response_sensitive(GTK_DIALOG(gfe), GTK_RESPONSE_APPLY, FALSE);
2023 grid = gtk_grid_new();
2024 gtk_widget_show(grid);
2025 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
2026 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
2027 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
2028 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
2029 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), grid, FALSE, FALSE, 2);
2036 widget = gtk_label_new(_(
"Name"));
2037 gtk_widget_show(widget);
2038 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2039 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2040 gtk_grid_attach(GTK_GRID(grid), widget, 0, 3, 2, 1);
2041 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2043 widget = gtk_entry_new();
2044 gtk_widget_show(widget);
2045 gtk_grid_attach(GTK_GRID(grid), widget, 1, 3, 3, 1);
2046 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
2047 priv->name_entry = widget;
2049 if (!profile_file_exists) {
2050 gtk_entry_set_text(GTK_ENTRY(widget), _(
"Quick Connect"));
2051 #if GTK_CHECK_VERSION(3, 16, 0) 2052 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2057 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2061 widget = gtk_label_new(_(
"Group"));
2062 gtk_widget_show(widget);
2063 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2064 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2065 gtk_grid_attach(GTK_GRID(grid), widget, 0, 6, 2, 1);
2070 gtk_widget_show(priv->group_combo);
2071 gtk_grid_attach(GTK_GRID(grid), priv->group_combo, 1, 6, 3, 1);
2072 gtk_widget_set_sensitive(priv->group_combo, FALSE);
2074 s = g_strdup_printf(_(
"Use '%s' as subgroup delimiter"),
"/");
2075 gtk_widget_set_tooltip_text(priv->group_combo, s);
2079 widget = gtk_label_new(_(
"Labels"));
2080 gtk_widget_show(widget);
2081 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2082 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2083 gtk_grid_attach(GTK_GRID(grid), widget, 0, 9, 2, 1);
2084 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2086 widget = gtk_entry_new();
2087 gtk_widget_show(widget);
2088 gtk_grid_attach(GTK_GRID(grid), widget, 1, 9, 3, 1);
2089 gtk_entry_set_max_length(GTK_ENTRY(widget), 255);
2090 priv->labels_entry = widget;
2092 if (!profile_file_exists) {
2093 gtk_widget_set_tooltip_text(widget, _(
"Label1,Label2"));
2094 #if GTK_CHECK_VERSION(3, 16, 0) 2095 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2100 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2104 widget = gtk_label_new(_(
"Protocol"));
2105 gtk_widget_show(widget);
2106 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2107 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2108 gtk_grid_attach(GTK_GRID(grid), widget, 0, 12, 2, 1);
2111 gtk_widget_show(widget);
2112 gtk_grid_attach(GTK_GRID(grid), widget, 1, 12, 3, 1);
2113 priv->protocol_combo = widget;
2118 widget = gtk_event_box_new();
2119 gtk_widget_show(widget);
2120 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), widget, TRUE, TRUE, 2);
2121 priv->config_box = widget;
2123 priv->config_container = NULL;
2124 priv->config_scrollable = NULL;
2130 return GTK_WIDGET(gfe);
2135 TRACE_CALL(__func__);
2141 TRACE_CALL(__func__);
2155 TRACE_CALL(__func__);
2164 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2165 _(
"Could not find the file “%s”."), filename);
2166 gtk_dialog_run(GTK_DIALOG(dialog));
2167 gtk_widget_destroy(dialog);
2174 TRACE_CALL(__func__);
2183 GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2184 _(
"Could not find the file “%s”."), filename);
2185 gtk_dialog_run(GTK_DIALOG(dialog));
2186 gtk_widget_destroy(dialog);
+
Go to the documentation of this file. 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;
125 GtkWidget * ssh_tunnel_enabled_check;
126 GtkWidget * ssh_tunnel_loopback_check;
127 GtkWidget * ssh_tunnel_server_default_radio;
128 GtkWidget * ssh_tunnel_server_custom_radio;
129 GtkWidget * ssh_tunnel_server_entry;
130 GtkWidget * ssh_tunnel_auth_agent_radio;
131 GtkWidget * ssh_tunnel_auth_password_radio;
132 GtkWidget * ssh_tunnel_auth_password;
133 GtkWidget * ssh_tunnel_passphrase;
134 GtkWidget * ssh_tunnel_auth_publickey_radio;
135 GtkWidget * ssh_tunnel_auth_auto_publickey_radio;
136 GtkWidget * ssh_tunnel_auth_combo;
137 GtkWidget * ssh_tunnel_username_entry;
138 GtkWidget * ssh_tunnel_privatekey_chooser;
139 GtkWidget * ssh_tunnel_certfile_chooser;
141 GHashTable * setting_widgets;
146 TRACE_CALL(__func__);
165 GtkWidget * failed_widget,
170 g_set_error(&err, 1, 1, _(
"Input is invalid."));
173 if (!gfe || !failed_widget) {
174 g_critical(
"(%s): Parameters RemminaFileEditor 'gfe' or " 175 "GtkWidget* 'failed_widget' are 'NULL'!",
180 gint widget_width = gtk_widget_get_allocated_width(failed_widget);
181 gint widget_height = gtk_widget_get_allocated_height(failed_widget);
183 GtkWidget *err_label = gtk_label_new(
"");
184 GtkWidget *alert_icon = NULL;
185 GtkWindow *err_window = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
186 GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
187 GdkWindow *window = gtk_widget_get_window(failed_widget);
189 GtkAllocation allocation;
190 gint failed_widget_x, failed_widget_y;
192 gchar *markup = g_strdup_printf(
"<span size='large'>%s</span>", err->message);
195 gtk_window_set_decorated(err_window, FALSE);
196 gtk_window_set_type_hint(err_window, GDK_WINDOW_TYPE_HINT_TOOLTIP);
197 gtk_window_set_default_size(err_window, widget_width, widget_height);
198 gtk_window_set_title(err_window,
"Error");
199 gtk_window_set_resizable(err_window, TRUE);
202 gtk_window_set_attached_to(err_window, failed_widget);
203 gtk_window_set_transient_for(err_window, GTK_WINDOW(gfe));
204 gdk_window_get_origin(GDK_WINDOW(window), &failed_widget_x, &failed_widget_y);
205 gtk_widget_get_allocation(failed_widget, &allocation);
206 failed_widget_x += allocation.x;
207 failed_widget_y += allocation.y + allocation.height;
208 gtk_window_move(err_window, failed_widget_x, failed_widget_y);
211 gtk_label_set_selectable(GTK_LABEL(err_label), FALSE);
212 gtk_label_set_max_width_chars(GTK_LABEL(err_label), 1);
213 gtk_widget_set_hexpand(GTK_WIDGET(err_label), TRUE);
214 gtk_widget_set_vexpand(GTK_WIDGET(err_label), TRUE);
215 gtk_label_set_ellipsize(GTK_LABEL(err_label), PANGO_ELLIPSIZE_END);
216 gtk_label_set_line_wrap(GTK_LABEL(err_label), TRUE);
217 gtk_label_set_line_wrap_mode(GTK_LABEL(err_label), PANGO_WRAP_WORD_CHAR);
218 gtk_label_set_markup(GTK_LABEL(err_label), markup);
220 alert_icon = gtk_image_new_from_icon_name(
"dialog-warning-symbolic",
224 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(alert_icon), FALSE, FALSE, 0);
225 gtk_box_pack_start(GTK_BOX(box), GTK_WIDGET(err_label), TRUE, TRUE, 5);
228 gtk_container_add(GTK_CONTAINER(err_window), GTK_WIDGET(box));
231 gtk_widget_show_all(GTK_WIDGET(err_window));
234 g_signal_connect(G_OBJECT(err_window),
"focus-out-event",
235 G_CALLBACK(gtk_window_close), NULL);
236 g_signal_connect(G_OBJECT(err_window),
"button-press-event",
237 G_CALLBACK(gtk_window_close), NULL);
240 #ifdef HAVE_LIBAVAHI_UI 244 TRACE_CALL(__func__);
248 dialog = aui_service_dialog_new(_(
"Choose a Remote Desktop Server"),
250 _(
"_Cancel"), GTK_RESPONSE_CANCEL,
251 _(
"_OK"), GTK_RESPONSE_ACCEPT,
254 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
255 aui_service_dialog_set_resolve_service(AUI_SERVICE_DIALOG(dialog), TRUE);
256 aui_service_dialog_set_resolve_host_name(AUI_SERVICE_DIALOG(dialog), TRUE);
257 aui_service_dialog_set_browse_service_types(AUI_SERVICE_DIALOG(dialog),
258 gfe->
priv->avahi_service_type, NULL);
260 if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
261 host = g_strdup_printf(
"[%s]:%i",
262 aui_service_dialog_get_host_name(AUI_SERVICE_DIALOG(dialog)),
263 aui_service_dialog_get_port(AUI_SERVICE_DIALOG(dialog)));
267 gtk_widget_destroy(dialog);
270 gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gfe->
priv->server_combo))), host);
278 TRACE_CALL(__func__);
280 GtkWidget *defaultwidget;
282 gfe = REMMINA_FILE_EDITOR(widget);
284 defaultwidget = gfe->
priv->server_combo;
287 if (GTK_IS_EDITABLE(defaultwidget))
288 gtk_editable_select_region(GTK_EDITABLE(defaultwidget), 0, -1);
289 gtk_widget_grab_focus(defaultwidget);
295 TRACE_CALL(__func__);
297 g_hash_table_destroy(REMMINA_FILE_EDITOR(widget)->priv->setting_widgets);
298 g_free(REMMINA_FILE_EDITOR(widget)->priv);
303 TRACE_CALL(__func__);
304 gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton)));
309 TRACE_CALL(__func__);
311 gfe->
priv->config_container = gtk_notebook_new();
312 gfe->
priv->config_viewport = gtk_viewport_new(NULL, NULL);
313 gfe->
priv->config_scrollable = gtk_scrolled_window_new(NULL, NULL);
314 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_scrollable), 2);
315 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gfe->
priv->config_scrollable),
316 GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
317 gtk_widget_show(gfe->
priv->config_scrollable);
319 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_viewport), gfe->
priv->config_container);
320 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_viewport), 2);
321 gtk_widget_show(gfe->
priv->config_viewport);
322 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_scrollable), gfe->
priv->config_viewport);
323 gtk_container_set_border_width(GTK_CONTAINER(gfe->
priv->config_container), 2);
324 gtk_widget_show(gfe->
priv->config_container);
326 gtk_container_add(GTK_CONTAINER(gfe->
priv->config_box), gfe->
priv->config_scrollable);
330 const gchar *stock_id,
const gchar *label, gint rows, gint cols)
332 TRACE_CALL(__func__);
338 tablabel = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
339 gtk_widget_show(tablabel);
341 widget = gtk_image_new_from_icon_name(stock_id, GTK_ICON_SIZE_BUTTON);
342 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
343 gtk_widget_show(widget);
345 widget = gtk_label_new(label);
346 gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0);
347 gtk_widget_show(widget);
349 tabbody = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
350 gtk_widget_show(tabbody);
351 gtk_notebook_append_page(GTK_NOTEBOOK(gfe->
priv->config_container), tabbody, tablabel);
353 grid = gtk_grid_new();
354 gtk_widget_show(grid);
355 gtk_grid_set_row_spacing(GTK_GRID(grid), 8);
356 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
357 gtk_container_set_border_width(GTK_CONTAINER(grid), 15);
358 gtk_box_pack_start(GTK_BOX(tabbody), grid, FALSE, FALSE, 0);
367 TRACE_CALL(__func__);
368 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_entry),
369 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check)) &&
370 (gfe->
priv->ssh_tunnel_server_custom_radio == NULL ||
371 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_server_custom_radio))));
378 TRACE_CALL(__func__);
379 gboolean enabled = TRUE;
381 if (gfe->
priv->assistance_toggle) {
382 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->assistance_toggle));
383 if (gfe->
priv->assistance_file)
384 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file), enabled);
385 if (gfe->
priv->assistance_password)
386 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password), enabled);
387 if (gfe->
priv->assistance_file_label)
388 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_file_label), enabled);
389 if (gfe->
priv->assistance_password_label)
390 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->assistance_password_label), enabled);
397 TRACE_CALL(__func__);
399 gboolean enabled = TRUE;
402 const gchar *s = NULL;
404 if (gfe->
priv->ssh_tunnel_enabled_check) {
405 enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->ssh_tunnel_enabled_check));
406 if (gfe->
priv->ssh_tunnel_loopback_check)
407 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_loopback_check), enabled);
408 if (gfe->
priv->ssh_tunnel_server_default_radio)
409 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_default_radio), enabled);
410 if (gfe->
priv->ssh_tunnel_server_custom_radio)
411 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_server_custom_radio), enabled);
415 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_username_entry), enabled);
416 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_password), enabled);
417 gtk_widget_set_sensitive(GTK_WIDGET(gfe->
priv->ssh_tunnel_auth_combo), enabled);
424 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_privatekey_chooser), s);
427 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gfe->
priv->ssh_tunnel_certfile_chooser), s);
429 if (gfe->
priv->ssh_tunnel_username_entry)
430 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry))[0] ==
'\0') {
432 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_username_entry), cp ? cp :
"");
435 if (gfe->
priv->ssh_tunnel_auth_password) {
436 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password))[0] ==
'\0') {
438 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_auth_password), cp ? cp :
"");
441 if (gfe->
priv->ssh_tunnel_passphrase) {
442 if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase))[0] ==
'\0') {
444 gtk_entry_set_text(GTK_ENTRY(gfe->
priv->ssh_tunnel_passphrase), cp ? cp :
"");
454 TRACE_CALL(__func__);
457 #ifdef HAVE_LIBAVAHI_UI 462 widget = gtk_label_new(_(
"Server"));
463 gtk_widget_show(widget);
464 gtk_widget_set_valign(widget, GTK_ALIGN_START);
465 gtk_widget_set_halign(widget, GTK_ALIGN_START);
466 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, row + 1);
470 gtk_widget_set_hexpand(widget, TRUE);
471 gtk_widget_show(widget);
472 gtk_widget_set_tooltip_markup(widget, _(server_tips));
473 gtk_entry_set_activates_default(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget))), TRUE);
474 gfe->
priv->server_combo = widget;
477 #ifdef HAVE_LIBAVAHI_UI 479 gfe->
priv->avahi_service_type = (
const gchar *)setting->
opt1;
481 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
482 gtk_widget_show(hbox);
483 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
485 widget = gtk_button_new_with_label(
"…");
486 s = g_strdup_printf(_(
"Browse the network to find a %s server"), plugin->
name);
487 gtk_widget_set_tooltip_text(widget, s);
489 gtk_widget_show(widget);
490 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
493 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
497 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
504 TRACE_CALL(__func__);
507 widget = gtk_label_new(label);
508 gtk_widget_show(widget);
509 #if GTK_CHECK_VERSION(3, 12, 0) 510 gtk_widget_set_margin_end(widget, 40);
512 gtk_widget_set_margin_right(widget, 40);
514 gtk_widget_set_valign(widget, GTK_ALIGN_START);
515 gtk_widget_set_halign(widget, GTK_ALIGN_START);
516 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
518 widget = gtk_entry_new();
519 gtk_widget_show(widget);
520 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
521 gtk_entry_set_max_length(GTK_ENTRY(widget), 0);
522 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
523 gtk_widget_set_hexpand(widget, TRUE);
524 gtk_entry_set_activates_default(GTK_ENTRY(widget), TRUE);
526 gtk_widget_set_name(widget, setting_name);
529 gtk_entry_set_text(GTK_ENTRY(widget), value);
532 gtk_entry_set_icon_from_icon_name(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY,
"org.remmina.Remmina-password-reveal-symbolic");
533 gtk_entry_set_icon_activatable(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY, TRUE);
541 TRACE_CALL(__func__);
543 res_str = g_strdup_printf(
"%dx%d",
553 TRACE_CALL(__func__);
559 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gfe));
560 gtk_dialog_run(dialog);
564 gtk_widget_destroy(GTK_WIDGET(dialog));
568 GtkWidget *grid, gint row)
570 TRACE_CALL(__func__);
573 int resolution_w, resolution_h;
584 if (resolution_w <= 0 || resolution_h <= 0)
590 res_str = g_strdup_printf(
"%dx%d", resolution_w, resolution_h);
594 widget = gtk_label_new(_(
"Resolution"));
595 gtk_widget_show(widget);
596 gtk_widget_set_valign(widget, GTK_ALIGN_START);
597 gtk_widget_set_halign(widget, GTK_ALIGN_START);
598 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
600 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
601 widget = gtk_radio_button_new_with_label(NULL, _(
"Use initial window size"));
602 gtk_widget_show(widget);
603 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
604 gfe->
priv->resolution_iws_radio = widget;
605 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Use client resolution"));
606 gtk_widget_show(widget);
607 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
608 gfe->
priv->resolution_auto_radio = widget;
609 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
610 gtk_widget_show(hbox);
612 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
613 gtk_widget_show(hbox);
614 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row + 1, 1, 1);
616 widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->
priv->resolution_iws_radio), _(
"Custom"));
617 gtk_widget_show(widget);
618 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
619 gfe->
priv->resolution_custom_radio = widget;
622 gtk_widget_show(widget);
623 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
624 gfe->
priv->resolution_custom_combo = widget;
626 widget = gtk_button_new_with_label(
"…");
627 gtk_widget_show(widget);
628 gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
631 g_signal_connect(G_OBJECT(gfe->
priv->resolution_custom_radio),
"toggled",
635 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio), TRUE);
637 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_auto_radio), TRUE);
639 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_iws_radio), TRUE);
641 gtk_widget_set_sensitive(gfe->
priv->resolution_custom_combo, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->
priv->resolution_custom_radio)));
648 GtkWidget *grid, gint row)
650 TRACE_CALL(__func__);
655 widget = gtk_toggle_button_new_with_label(_(
"Assistance Mode"));
656 gtk_widget_set_halign(widget, GTK_ALIGN_START);
657 gtk_widget_show(widget);
658 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
659 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
remmina_file_get_int(gfe->
priv->remmina_file,
"assistance_mode", 0));
660 gfe->
priv->assistance_toggle = widget;
664 widget = gtk_label_new(
"Assistance file");
665 gtk_widget_set_halign(widget, GTK_ALIGN_END);
666 gtk_widget_show(widget);
667 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+1, 1, 1);
668 gfe->
priv->assistance_file_label = widget;
670 widget = gtk_entry_new();
671 gtk_widget_set_halign(widget, GTK_ALIGN_START);
672 gtk_widget_show(widget);
674 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+1, 1, 1);
675 gfe->
priv->assistance_file = widget;
677 widget = gtk_label_new(
"Assistance Password");
678 gtk_widget_set_halign(widget, GTK_ALIGN_END);
679 gtk_widget_show(widget);
680 gtk_grid_attach(GTK_GRID(grid), widget, 0, row+2, 1, 1);
681 gfe->
priv->assistance_password_label = widget;
683 widget = gtk_entry_new();
684 gtk_widget_set_halign(widget, GTK_ALIGN_START);
685 gtk_widget_show(widget);
687 gtk_grid_attach(GTK_GRID(grid), widget, 1, row+2, 1, 1);
688 gfe->
priv->assistance_password = widget;
696 gint row, gint col,
const gchar *label,
const gchar *value, gint left,
697 gint right, gchar *setting_name)
699 TRACE_CALL(__func__);
702 widget = gtk_label_new(label);
703 gtk_widget_show(widget);
704 #if GTK_CHECK_VERSION(3, 12, 0) 705 gtk_widget_set_margin_start(widget, left);
706 gtk_widget_set_margin_end(widget, right);
708 gtk_widget_set_margin_left(widget, left);
709 gtk_widget_set_margin_right(widget, right);
711 gtk_widget_set_valign(widget, GTK_ALIGN_START);
712 gtk_widget_set_halign(widget, GTK_ALIGN_START);
713 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
715 widget = gtk_entry_new();
716 gtk_widget_show(widget);
717 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
718 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
719 gtk_widget_set_hexpand(widget, TRUE);
721 gtk_widget_set_name(widget, setting_name);
724 gtk_entry_set_text(GTK_ENTRY(widget), value);
730 gint row, gint col,
const gchar *label,
const gchar *value,
733 TRACE_CALL(__func__);
739 gint row, gint col,
const gchar *label,
const gchar *value,
742 TRACE_CALL(__func__);
745 GtkTextBuffer *buffer;
748 widget = gtk_text_view_new();
749 view = GTK_TEXT_VIEW(widget);
750 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(view), GTK_WRAP_WORD);
751 gtk_text_view_set_top_margin(GTK_TEXT_VIEW(view), 20);
752 gtk_text_view_set_bottom_margin(GTK_TEXT_VIEW(view), 20);
753 gtk_text_view_set_left_margin(GTK_TEXT_VIEW(view), 20);
754 gtk_text_view_set_right_margin(GTK_TEXT_VIEW(view), 20);
755 gtk_text_view_set_monospace(view, TRUE);
757 gtk_widget_set_name(widget, setting_name);
759 buffer = gtk_text_view_get_buffer(view);
760 gtk_text_buffer_set_text(buffer, value, -1);
761 gtk_text_buffer_get_start_iter(buffer, &start);
762 gtk_text_buffer_place_cursor(buffer, &start);
764 gtk_widget_show(widget);
765 gtk_widget_set_hexpand(widget, TRUE);
766 gtk_widget_set_size_request(GTK_WIDGET(view), 320, 300);
767 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
772 gint row, gint col,
const gchar *label,
const gpointer *list,
773 const gchar *value, gchar *setting_name)
775 TRACE_CALL(__func__);
778 widget = gtk_label_new(label);
779 gtk_widget_show(widget);
780 gtk_widget_set_valign(widget, GTK_ALIGN_START);
781 gtk_widget_set_halign(widget, GTK_ALIGN_START);
783 gtk_widget_set_name(widget, setting_name);
784 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
787 gtk_widget_show(widget);
788 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
794 gint row, gint col,
const gchar *label,
const gchar *list,
795 const gchar *value, gchar *setting_name)
797 TRACE_CALL(__func__);
800 widget = gtk_label_new(label);
801 gtk_widget_show(widget);
802 gtk_widget_set_valign(widget, GTK_ALIGN_START);
803 gtk_widget_set_halign(widget, GTK_ALIGN_START);
804 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
807 gtk_widget_show(widget);
808 gtk_widget_set_hexpand(widget, TRUE);
810 gtk_widget_set_name(widget, setting_name);
811 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 1, 1);
817 gint row, gint top,
const gchar *label, gboolean value,
820 TRACE_CALL(__func__);
822 widget = gtk_check_button_new_with_label(label);
823 gtk_widget_show(widget);
825 gtk_widget_set_name(widget, setting_name);
826 gtk_grid_attach(GTK_GRID(grid), widget, top, row, 1, 1);
829 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
845 const gchar *value, gint type, gchar *setting_name)
847 TRACE_CALL(__func__);
852 widget = gtk_label_new(label);
853 gtk_widget_show(widget);
854 gtk_widget_set_valign(widget, GTK_ALIGN_START);
855 gtk_widget_set_halign(widget, GTK_ALIGN_START);
856 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
858 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
859 gtk_widget_show(hbox);
860 gtk_grid_attach(GTK_GRID(grid), hbox, 1, row, 1, 1);
862 check = gtk_check_button_new();
863 gtk_widget_show(check);
864 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (value && value[0] ==
'/'));
865 gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
867 widget = gtk_file_chooser_button_new(label, type);
869 gtk_widget_set_name(widget, setting_name);
870 gtk_widget_show(widget);
872 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), value);
873 gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0);
883 gint length, gint *position, gpointer data)
885 for (
int i = 0; i < length; i++) {
886 if (!isdigit(text[i]) && text[i] !=
'-') {
887 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
897 gint length, gint *position, gpointer data)
899 for (
int i = 0; i < length; i++) {
900 if (!isdigit(text[i]) && text[i] !=
'-' && text[i] !=
'.' && text[i] !=
',') {
901 g_signal_stop_emission_by_name(G_OBJECT(editable),
"insert-text");
908 gint row, gint col,
const gchar *label,
const gint value,
909 gint left, gint right, gchar *setting_name)
911 TRACE_CALL(__func__);
914 widget = gtk_label_new(label);
915 gtk_widget_show(widget);
916 #if GTK_CHECK_VERSION(3, 12, 0) 917 gtk_widget_set_margin_start(widget, left);
918 gtk_widget_set_margin_end(widget, right);
920 gtk_widget_set_margin_left(widget, left);
921 gtk_widget_set_margin_right(widget, right);
923 gtk_widget_set_valign(widget, GTK_ALIGN_START);
924 gtk_widget_set_halign(widget, GTK_ALIGN_START);
925 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
927 widget = gtk_entry_new();
928 gtk_widget_show(widget);
929 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
930 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
931 gtk_widget_set_hexpand(widget, TRUE);
933 gtk_widget_set_name(widget, setting_name);
936 int length = snprintf(NULL, 0,
"%d", value) + 1;
937 char *str = malloc(length);
938 snprintf(str, length,
"%d", value);
940 gtk_entry_set_text(GTK_ENTRY(widget), str);
943 g_signal_connect(G_OBJECT(widget),
"insert-text",
950 GtkWidget *grid, gint row, gint col,
951 const gchar *label, gdouble value, gint left,
952 gint right, gchar *setting_name)
954 TRACE_CALL(__func__);
957 widget = gtk_label_new(label);
958 gtk_widget_show(widget);
959 #if GTK_CHECK_VERSION(3, 12, 0) 960 gtk_widget_set_margin_start(widget, left);
961 gtk_widget_set_margin_end(widget, right);
963 gtk_widget_set_margin_left(widget, left);
964 gtk_widget_set_margin_right(widget, right);
966 gtk_widget_set_valign(widget, GTK_ALIGN_START);
967 gtk_widget_set_halign(widget, GTK_ALIGN_START);
968 gtk_grid_attach(GTK_GRID(grid), widget, col, row, 1, 1);
970 widget = gtk_entry_new();
971 gtk_widget_show(widget);
972 gtk_grid_attach(GTK_GRID(grid), widget, col + 1, row, 1, 1);
973 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
974 gtk_widget_set_hexpand(widget, TRUE);
976 gtk_widget_set_name(widget, setting_name);
979 int length = snprintf(NULL, 0,
"%.8g", value) + 1;
980 char *str = malloc(length);
981 snprintf(str, length,
"%f", value);
983 gtk_entry_set_text(GTK_ENTRY(widget), str);
986 g_signal_connect(G_OBJECT(widget),
"insert-text",
997 TRACE_CALL(__func__);
1001 gint grid_column = 0;
1003 gchar *setting_name;
1004 const gchar *escaped;
1008 switch (settings->
type) {
1015 g_dgettext(priv->plugin->domain, settings->
label),
1018 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1036 _(
"Keyboard mapping"), (
const gpointer *)strarr,
1045 g_dgettext(priv->plugin->domain, settings->
label),
1048 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1050 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1056 escaped = g_uri_unescape_string(escaped, NULL);
1058 g_dgettext(priv->plugin->domain, settings->
label), escaped,
1060 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1066 g_dgettext(priv->plugin->domain, settings->
label),
1067 (
const gpointer *)settings->
opt1,
1070 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1072 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1077 g_dgettext(priv->plugin->domain, settings->
label),
1078 (
const gchar *)settings->
opt1,
1081 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1083 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1088 g_dgettext(priv->plugin->domain, settings->
label),
1091 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1093 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1098 g_dgettext(priv->plugin->domain, settings->
label),
1100 GTK_FILE_CHOOSER_ACTION_OPEN, setting_name);
1101 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1103 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1108 g_dgettext(priv->plugin->domain, settings->
label),
1110 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1112 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1114 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1118 g_dgettext(priv->plugin->domain, settings->
label),
1120 0, 40, setting_name);
1121 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1123 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1128 g_dgettext(priv->plugin->domain, settings->
label),
1130 0, 40, setting_name);
1131 g_hash_table_insert(priv->setting_widgets, setting_name, widget);
1133 gtk_widget_set_tooltip_text(widget, _((
const gchar *)settings->
opt2));
1146 if (!settings->
compact || grid_column > 1) {
1156 TRACE_CALL(__func__);
1171 priv->behavior_precommand_entry = widget;
1172 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"command %h %u %t %U %p %g --option"));
1173 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1178 priv->behavior_postcommand_entry = widget;
1179 gtk_entry_set_placeholder_text(GTK_ENTRY(widget), _(
"/path/to/command -opt1 arg %h %u %t -opt2 %U %p %g"));
1180 gtk_widget_set_tooltip_markup(widget, _(cmd_tips));
1200 "0",
N_(
"Password"),
1201 "1",
N_(
"SSH identity file"),
1202 "2",
N_(
"SSH agent"),
1203 "3",
N_(
"Public key (automatic)"),
1204 "4",
N_(
"Kerberos (GSSAPI)"),
1211 TRACE_CALL(__func__);
1226 _(
"SSH Tunnel"), 9, 3);
1227 widget = gtk_toggle_button_new_with_label(_(
"Enable SSH tunnel"));
1228 gtk_widget_set_halign(widget, GTK_ALIGN_START);
1229 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1230 g_signal_connect(G_OBJECT(widget),
"toggled",
1232 priv->ssh_tunnel_enabled_check = widget;
1234 widget = gtk_check_button_new_with_label(_(
"Tunnel via loopback address"));
1235 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1236 priv->ssh_tunnel_loopback_check = widget;
1242 switch (ssh_setting) {
1244 s = g_strdup_printf(_(
"Same server at port %i"), DEFAULT_SSH_PORT);
1245 widget = gtk_radio_button_new_with_label(NULL, s);
1247 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 3, 1);
1248 priv->ssh_tunnel_server_default_radio = widget;
1252 widget = gtk_radio_button_new_with_label_from_widget(
1253 GTK_RADIO_BUTTON(priv->ssh_tunnel_server_default_radio), _(
"Custom"));
1254 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1255 g_signal_connect(G_OBJECT(widget),
"toggled",
1257 priv->ssh_tunnel_server_custom_radio = widget;
1259 widget = gtk_entry_new();
1260 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
1261 gtk_widget_set_tooltip_markup(widget, _(server_tips2));
1262 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1263 priv->ssh_tunnel_server_entry = widget;
1269 priv->ssh_tunnel_server_default_radio = NULL;
1270 priv->ssh_tunnel_server_custom_radio = NULL;
1273 _(
"Server"), NULL,
"ssh_reverse_tunnel_server");
1274 gtk_widget_set_tooltip_markup(priv->ssh_tunnel_server_entry, _(server_tips));
1280 priv->ssh_tunnel_server_default_radio = NULL;
1281 priv->ssh_tunnel_server_custom_radio = NULL;
1282 priv->ssh_tunnel_server_entry = NULL;
1294 _(
"Start-up path"), NULL,
"start-up-path");
1296 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
1297 g_hash_table_insert(priv->setting_widgets,
"execpath", widget);
1308 _(
"Authentication type"),
1315 priv->ssh_tunnel_username_entry =
1317 _(
"Username"), NULL,
"ssh_tunnel_username");
1325 "ssh_tunnel_password");
1326 priv->ssh_tunnel_auth_password = widget;
1330 _(
"SSH private key file"),
1332 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_privatekey");
1336 _(
"SSH certificate file"),
1338 GTK_FILE_CHOOSER_ACTION_OPEN,
"ssh_tunnel_certfile");
1341 widget = gtk_label_new(_(
"Password to unlock private key"));
1342 gtk_grid_attach(GTK_GRID(grid), widget, 0, row, 1, 1);
1343 widget = gtk_entry_new();
1344 gtk_grid_attach(GTK_GRID(grid), widget, 1, row, 2, 1);
1345 gtk_entry_set_max_length(GTK_ENTRY(widget), 300);
1346 gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE);
1347 gtk_widget_set_hexpand(widget, TRUE);
1348 priv->ssh_tunnel_passphrase = widget;
1354 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check),
1356 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check),
1359 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cs ? priv->ssh_tunnel_server_custom_radio : priv->ssh_tunnel_server_default_radio), TRUE);
1360 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
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),
1367 gtk_entry_set_text(GTK_ENTRY(priv->ssh_tunnel_server_entry),
1372 gtk_widget_show_all(grid);
1379 TRACE_CALL(__func__);
1392 if (priv->plugin->basic_settings) {
1398 if (priv->plugin->advanced_settings) {
1416 TRACE_CALL(__func__);
1420 if (priv->config_container) {
1421 gtk_widget_destroy(priv->config_container);
1422 priv->config_container = NULL;
1423 gtk_widget_destroy(priv->config_viewport);
1424 priv->config_viewport = NULL;
1425 gtk_widget_destroy(priv->config_scrollable);
1426 priv->config_scrollable = NULL;
1429 priv->server_combo = NULL;
1430 priv->resolution_iws_radio = NULL;
1431 priv->resolution_auto_radio = NULL;
1432 priv->resolution_custom_radio = NULL;
1433 priv->resolution_custom_combo = NULL;
1434 priv->keymap_combo = NULL;
1436 priv->ssh_tunnel_enabled_check = NULL;
1437 priv->ssh_tunnel_loopback_check = NULL;
1438 priv->ssh_tunnel_server_default_radio = NULL;
1439 priv->ssh_tunnel_server_custom_radio = NULL;
1440 priv->ssh_tunnel_server_entry = NULL;
1441 priv->ssh_tunnel_username_entry = NULL;
1442 priv->ssh_tunnel_auth_combo = NULL;
1443 priv->ssh_tunnel_auth_password = NULL;
1444 priv->ssh_tunnel_privatekey_chooser = NULL;
1445 priv->ssh_tunnel_certfile_chooser = NULL;
1447 g_hash_table_remove_all(priv->setting_widgets);
1460 TRACE_CALL(__func__);
1463 remmina_file_set_string(priv->remmina_file,
"precommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_precommand_entry)));
1464 remmina_file_set_string(priv->remmina_file,
"postcommand", gtk_entry_get_text(GTK_ENTRY(priv->behavior_postcommand_entry)));
1466 gboolean autostart_enabled = (priv->behavior_autostart_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_autostart_check)) : FALSE);
1468 gboolean lock_enabled = (priv->behavior_lock_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->behavior_lock_check)) : FALSE);
1474 TRACE_CALL(__func__);
1476 gboolean ssh_tunnel_enabled;
1477 int ssh_tunnel_auth;
1479 ssh_tunnel_enabled = (priv->ssh_tunnel_enabled_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_enabled_check)) : FALSE);
1481 "ssh_tunnel_loopback",
1482 (priv->ssh_tunnel_loopback_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_tunnel_loopback_check)) : FALSE));
1487 (ssh_tunnel_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_username_entry)) : NULL));
1490 "ssh_tunnel_server",
1491 (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));
1493 ssh_tunnel_auth = gtk_combo_box_get_active(GTK_COMBO_BOX(priv->ssh_tunnel_auth_combo));
1502 if (gtk_widget_get_sensitive(priv->ssh_tunnel_privatekey_chooser)) {
1505 "ssh_tunnel_privatekey",
1506 (priv->ssh_tunnel_privatekey_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_privatekey_chooser)) : NULL));
1512 if (gtk_widget_get_sensitive(priv->ssh_tunnel_certfile_chooser)) {
1515 "ssh_tunnel_certfile",
1516 (priv->ssh_tunnel_certfile_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_tunnel_certfile_chooser)) : NULL));
1524 "ssh_tunnel_password",
1525 (ssh_tunnel_enabled && (ssh_tunnel_auth ==
SSH_AUTH_PASSWORD)) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_tunnel_auth_password)) : NULL);
1529 "ssh_tunnel_passphrase",
1534 gchar * setting_name_to_validate,
1535 gconstpointer value,
1538 if (!setting_name_to_validate || !value || !gfe) {
1539 if (!setting_name_to_validate) {
1540 g_critical(_(
"(%s: %i): Can't validate setting '%s' since 'value' or 'gfe' " 1542 __func__, __LINE__, setting_name_to_validate);
1544 g_critical(_(
"(%s: %i): Can't validate user input since " 1545 "'setting_name_to_validate', 'value' or 'gfe' are NULL!"),
1546 __func__, __LINE__);
1548 g_set_error(err, 1, 1, _(
"Internal error."));
1552 if (strcmp(setting_name_to_validate,
"notes_text") == 0) {
1560 protocol_plugin = priv->plugin;
1566 if (setting_iter->
name == NULL) {
1567 g_error(
"Internal error: a setting name in protocol plugin %s is " 1568 "null. Please fix RemminaProtocolSetting struct content.",
1569 protocol_plugin->
name);
1570 }
else if ((gchar *)setting_name_to_validate) {
1571 if (strcmp((gchar *)setting_name_to_validate, setting_iter->
name) == 0) {
1575 GCallback validator = setting_iter->
validator;
1579 GError *err_ret = NULL;
1581 g_debug(
"Checking setting '%s' for validation.", setting_iter->
name);
1582 if (validator != NULL) {
1586 err_ret = ((GError * (*)(gpointer, gconstpointer, gpointer)) validator)(setting_name_to_validate, value, validator_data);
1590 g_debug(
"it has a validator function and it had an error!");
1612 GtkWidget ** failed_widget)
1614 TRACE_CALL(__func__);
1616 GHashTableIter iter;
1619 GtkTextBuffer *buffer;
1620 gchar *escaped, *unescaped;
1621 GtkTextIter start, end;
1624 *failed_widget = NULL;
1626 g_hash_table_iter_init(&iter, priv->setting_widgets);
1627 while (g_hash_table_iter_next(&iter, &key, &widget)) {
1633 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget)) && !GTK_IS_FILE_CHOOSER(widget)) {
1634 g_debug(
"Grayed-out setting-widget '%s' will not be saved.",
1635 gtk_widget_get_name(widget));
1639 if (GTK_IS_ENTRY(widget)) {
1640 const gchar *value = gtk_entry_get_text(GTK_ENTRY(widget));
1645 *failed_widget = widget;
1650 }
else if (GTK_IS_TEXT_VIEW(widget)) {
1651 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget));
1652 gtk_text_buffer_get_start_iter(buffer, &start);
1653 gtk_text_buffer_get_end_iter(buffer, &end);
1654 unescaped = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1655 escaped = g_uri_escape_string(unescaped, NULL, TRUE);
1660 *failed_widget = widget;
1666 }
else if (GTK_IS_COMBO_BOX(widget)) {
1672 *failed_widget = widget;
1677 }
else if (GTK_IS_FILE_CHOOSER(widget)) {
1678 gchar *value = gtk_widget_get_sensitive(GTK_WIDGET(widget)) ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget)) : NULL;
1680 if (!gtk_widget_get_sensitive(GTK_WIDGET(widget))) {
1689 *failed_widget = widget;
1695 }
else if (GTK_IS_TOGGLE_BUTTON(widget)) {
1696 gboolean value = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
1701 *failed_widget = widget;
1717 GtkWidget ** failed_widget)
1719 TRACE_CALL(__func__);
1721 gchar *custom_resolution;
1739 if (priv->resolution_auto_radio) {
1740 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_auto_radio))) {
1744 }
else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_iws_radio))) {
1755 g_free(custom_resolution);
1762 if (priv->assistance_toggle){
1763 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->assistance_toggle))) {
1764 remmina_file_set_string(priv->remmina_file,
"assistance_file", gtk_entry_get_text(GTK_ENTRY(priv->assistance_file)));
1765 remmina_file_set_string(priv->remmina_file,
"assistance_pass", gtk_entry_get_text(GTK_ENTRY(priv->assistance_password)));
1773 if (priv->keymap_combo)
1784 TRACE_CALL(__func__);
1788 GtkWidget *failed_widget = NULL;
1791 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1814 dialog = gtk_message_dialog_new(GTK_WINDOW(gfe), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,
1815 GTK_BUTTONS_OK, _(
"Default settings saved."));
1816 gtk_dialog_run(GTK_DIALOG(dialog));
1817 gtk_widget_destroy(dialog);
1822 TRACE_CALL(__func__);
1824 GtkWidget *failed_widget = NULL;
1827 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1837 gtk_widget_destroy(GTK_WIDGET(gfe));
1842 TRACE_CALL(__func__);
1845 GtkWidget *failed_widget = NULL;
1848 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1857 gtk_widget_destroy(GTK_WIDGET(gfe));
1858 gf->prevent_saving = TRUE;
1864 TRACE_CALL(__func__);
1868 GtkWidget *failed_widget = NULL;
1871 g_warning(_(
"Couldn't validate user input. %s"), err->message);
1885 gtk_widget_destroy(GTK_WIDGET(gfe));
1891 TRACE_CALL(__func__);
1892 gtk_widget_destroy(GTK_WIDGET(gfe));
1897 TRACE_CALL(__func__);
1905 gtk_window_set_title(GTK_WINDOW(gfe), _(
"Remote Connection Profile"));
1907 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Cancel")), GTK_RESPONSE_CANCEL);
1911 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Save as Default")), GTK_RESPONSE_OK);
1912 gtk_widget_set_tooltip_text(GTK_WIDGET(widget), _(
"Use the current settings as the default for all new connection profiles"));
1915 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save")), GTK_RESPONSE_APPLY);
1917 gtk_widget_set_sensitive(widget, FALSE);
1918 priv->save_button = widget;
1920 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"Connect")), GTK_RESPONSE_ACCEPT);
1923 widget = gtk_dialog_add_button(GTK_DIALOG(gfe), (_(
"_Save and Connect")), GTK_RESPONSE_OK);
1924 gtk_widget_set_can_default(widget, TRUE);
1927 gtk_dialog_set_default_response(GTK_DIALOG(gfe), GTK_RESPONSE_OK);
1928 gtk_window_set_default_size(GTK_WINDOW(gfe), 800, 600);
1933 priv->setting_widgets = g_hash_table_new(g_str_hash, g_str_equal);
1940 TRACE_CALL(__func__);
1942 GtkListStore *store;
1946 store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gfe->
priv->protocol_combo)));
1948 first = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
1950 gtk_list_store_append(store, &iter);
1951 gtk_list_store_set(store, &iter, 0, protocol, 1, g_dgettext(plugin->
domain, plugin->
description), 2,
1955 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gfe->
priv->protocol_combo), &iter);
1962 TRACE_CALL(__func__);
1966 gtk_widget_set_sensitive(priv->group_combo, TRUE);
1967 gtk_widget_set_sensitive(priv->save_button, TRUE);
1972 TRACE_CALL(__func__);
1989 TRACE_CALL(__func__);
2003 TRACE_CALL(__func__);
2012 gfe = REMMINA_FILE_EDITOR(g_object_new(REMMINA_TYPE_FILE_EDITOR, NULL));
2014 priv->remmina_file = remminafile;
2017 gtk_dialog_set_response_sensitive(GTK_DIALOG(gfe), GTK_RESPONSE_APPLY, FALSE);
2020 grid = gtk_grid_new();
2021 gtk_widget_show(grid);
2022 gtk_grid_set_row_spacing(GTK_GRID(grid), 4);
2023 gtk_grid_set_column_spacing(GTK_GRID(grid), 8);
2024 gtk_grid_set_column_homogeneous(GTK_GRID(grid), TRUE);
2025 gtk_container_set_border_width(GTK_CONTAINER(grid), 8);
2026 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), grid, FALSE, FALSE, 2);
2033 widget = gtk_label_new(_(
"Name"));
2034 gtk_widget_show(widget);
2035 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2036 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2037 gtk_grid_attach(GTK_GRID(grid), widget, 0, 3, 2, 1);
2038 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2040 widget = gtk_entry_new();
2041 gtk_widget_show(widget);
2042 gtk_grid_attach(GTK_GRID(grid), widget, 1, 3, 3, 1);
2043 gtk_entry_set_max_length(GTK_ENTRY(widget), 100);
2044 priv->name_entry = widget;
2046 if (!profile_file_exists) {
2047 gtk_entry_set_text(GTK_ENTRY(widget), _(
"Quick Connect"));
2048 #if GTK_CHECK_VERSION(3, 16, 0) 2049 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2054 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2058 widget = gtk_label_new(_(
"Group"));
2059 gtk_widget_show(widget);
2060 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2061 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2062 gtk_grid_attach(GTK_GRID(grid), widget, 0, 6, 2, 1);
2067 gtk_widget_show(priv->group_combo);
2068 gtk_grid_attach(GTK_GRID(grid), priv->group_combo, 1, 6, 3, 1);
2069 gtk_widget_set_sensitive(priv->group_combo, FALSE);
2071 s = g_strdup_printf(_(
"Use '%s' as subgroup delimiter"),
"/");
2072 gtk_widget_set_tooltip_text(priv->group_combo, s);
2076 widget = gtk_label_new(_(
"Labels"));
2077 gtk_widget_show(widget);
2078 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2079 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2080 gtk_grid_attach(GTK_GRID(grid), widget, 0, 9, 2, 1);
2081 gtk_grid_set_column_spacing(GTK_GRID(grid), 10);
2083 widget = gtk_entry_new();
2084 gtk_widget_show(widget);
2085 gtk_grid_attach(GTK_GRID(grid), widget, 1, 9, 3, 1);
2086 gtk_entry_set_max_length(GTK_ENTRY(widget), 255);
2087 priv->labels_entry = widget;
2089 if (!profile_file_exists) {
2090 gtk_widget_set_tooltip_text(widget, _(
"Label1,Label2"));
2091 #if GTK_CHECK_VERSION(3, 16, 0) 2092 gtk_entry_grab_focus_without_selecting(GTK_ENTRY(widget));
2097 gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs :
"");
2101 widget = gtk_label_new(_(
"Protocol"));
2102 gtk_widget_show(widget);
2103 gtk_widget_set_valign(widget, GTK_ALIGN_START);
2104 gtk_widget_set_halign(widget, GTK_ALIGN_START);
2105 gtk_grid_attach(GTK_GRID(grid), widget, 0, 12, 2, 1);
2108 gtk_widget_show(widget);
2109 gtk_grid_attach(GTK_GRID(grid), widget, 1, 12, 3, 1);
2110 priv->protocol_combo = widget;
2115 widget = gtk_event_box_new();
2116 gtk_widget_show(widget);
2117 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), widget, TRUE, TRUE, 2);
2118 priv->config_box = widget;
2120 priv->config_container = NULL;
2121 priv->config_scrollable = NULL;
2127 return GTK_WIDGET(gfe);
2132 TRACE_CALL(__func__);
2138 TRACE_CALL(__func__);
2152 TRACE_CALL(__func__);
2161 dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2162 _(
"Could not find the file “%s”."), filename);
2163 gtk_dialog_run(GTK_DIALOG(dialog));
2164 gtk_widget_destroy(dialog);
2171 TRACE_CALL(__func__);
2180 GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE,
2181 _(
"Could not find the file “%s”."), filename);
2182 gtk_dialog_run(GTK_DIALOG(dialog));
2183 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_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_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 dec212dca..3a1a15824 100644
--- a/public/remmina__file__editor_8h.html
+++ b/public/remmina__file__editor_8h.html
@@ -190,7 +190,7 @@ Functions
@@ -210,7 +210,7 @@ Functions
@@ -248,7 +248,7 @@ Functions
@@ -268,7 +268,7 @@ Functions
@@ -288,7 +288,7 @@ Functions
@@ -308,7 +308,7 @@ Functions
@@ -338,7 +338,7 @@ Functions
diff --git a/public/remmina__file__editor_8h_source.html b/public/remmina__file__editor_8h_source.html
index eea117042..f5c4a6322 100644
--- a/public/remmina__file__editor_8h_source.html
+++ b/public/remmina__file__editor_8h_source.html
@@ -89,19 +89,19 @@ $(document).ready(function(){initNavTree('remmina__file__editor_8h_source.html',
Go to the documentation of this file. 40 #include <glib/gi18n.h> 47 #define REMMINA_TYPE_FILE_EDITOR (remmina_file_editor_get_type()) 48 #define REMMINA_FILE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditor)) 49 #define REMMINA_FILE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditorClass)) 50 #define REMMINA_IS_FILE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), REMMINA_TYPE_FILE_EDITOR)) 51 #define REMMINA_IS_FILE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), REMMINA_TYPE_FILE_EDITOR)) 52 #define REMMINA_FILE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditorClass)) typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
struct _RemminaFileEditor RemminaFileEditor
-
void remmina_file_editor_check_profile(RemminaFileEditor *gfe)
+
void remmina_file_editor_check_profile(RemminaFileEditor *gfe)
GtkDialogClass parent_class
struct _RemminaFileEditorPriv RemminaFileEditorPriv
-
void remmina_file_editor_file_save(RemminaFileEditor *gfe)
-
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
+
void remmina_file_editor_file_save(RemminaFileEditor *gfe)
+
GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
struct _RemminaFileEditorClass RemminaFileEditorClass
-
GtkWidget * remmina_file_editor_new(void)
+
GtkWidget * remmina_file_editor_new(void)
GType remmina_file_editor_get_type(void) G_GNUC_CONST
-
GtkWidget * remmina_file_editor_new_from_file(RemminaFile *remminafile)
-
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
-
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
+
GtkWidget * remmina_file_editor_new_from_file(RemminaFile *remminafile)
+
GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
+
GtkWidget * remmina_file_editor_new_full(const gchar *server, const gchar *protocol)
RemminaFileEditorPriv * priv
diff --git a/public/remmina__main_8c_source.html b/public/remmina__main_8c_source.html
index c443f3340..a3d449c57 100644
--- a/public/remmina__main_8c_source.html
+++ b/public/remmina__main_8c_source.html
@@ -234,7 +234,7 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
RemminaStringArray * remmina_string_array_new(void)
void remmina_file_touch(RemminaFile *remminafile)
Update the atime and mtime of a given filename.
-GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
+GtkWidget * remmina_file_editor_new_from_filename(const gchar *filename)
static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, gpointer user_data)
void remmina_main_on_show(GtkWidget *w, gpointer user_data)
@@ -261,7 +261,7 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value)
void remmina_main_on_action_application_dark_theme(GSimpleAction *action, GVariant *param, gpointer data)
void remmina_about_open(GtkWindow *parent)
-GtkWidget * remmina_file_editor_new(void)
+GtkWidget * remmina_file_editor_new(void)
RemminaPlugin * remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name)
@@ -292,7 +292,7 @@ $(document).ready(function(){initNavTree('remmina__main_8c_source.html','');});
static GtkTargetEntry remmina_drop_types[]
GtkSearchBar * search_bar
static RemminaMain * remminamain
-GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
+GtkWidget * remmina_file_editor_new_copy(const gchar *filename)
void remmina_main_on_action_application_quit(GSimpleAction *action, GVariant *param, gpointer data)
GtkEntry * entry_quick_connect_server
gint remmina_unlock_new(GtkWindow *parent)
diff --git a/public/vnc__plugin_8c.html b/public/vnc__plugin_8c.html
index fcb2b2a09..86862a7b9 100644
--- a/public/vnc__plugin_8c.html
+++ b/public/vnc__plugin_8c.html
@@ -500,7 +500,7 @@ Variables
@@ -923,7 +923,7 @@ Variables
@@ -1230,7 +1230,7 @@ Variables
@@ -2535,7 +2535,7 @@ Variables
Initial value:=
N_(
"Lock the aspect ratio when dynamic resolution is enabled:\n" "\n"
" • The aspect ratio should be entered as a decimal number, e.g. 1.777\n"
" • 16:9 corresponds roughly to 1.7777, 4:3 corresponds roughly to 1.333\n"
" • The default value of 0 does not enforce any aspect ratio")
N_("Unable to connect to VNC server")
-
Definition at line 2063 of file vnc_plugin.c.
+
Definition at line 2062 of file vnc_plugin.c.
@@ -2560,7 +2560,7 @@ Variables
Initial value:=
{
"32",
N_(
"True colour (32 bpp)"),
"16",
N_(
"High colour (16 bpp)"),
"8",
N_(
"256 colours (8 bpp)"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2028 of file vnc_plugin.c.
+
Definition at line 2027 of file vnc_plugin.c.
@@ -2657,7 +2657,7 @@ Variables
Initial value:=
{
"9",
N_(
"Best (slowest)"),
"0",
N_(
"Poor (fastest)"),
NULL
}
N_("Unable to connect to VNC server")
-
Definition at line 2037 of file vnc_plugin.c.
+
Definition at line 2036 of file vnc_plugin.c.
@@ -2704,19 +2704,19 @@ Variables
-
Initial value:=
{
VNC_PLUGIN_NAME,
VNC_PLUGIN_DESCRIPTION,
GETTEXT_PACKAGE,
VNC_PLUGIN_VERSION,
VNC_PLUGIN_APPICON,
VNC_PLUGIN_SSH_APPICON,
}
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
-
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
+
Initial value:=
{
VNC_PLUGIN_NAME,
VNC_PLUGIN_DESCRIPTION,
GETTEXT_PACKAGE,
VNC_PLUGIN_VERSION,
VNC_PLUGIN_APPICON,
VNC_PLUGIN_SSH_APPICON,
}
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
+
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
static gboolean remmina_plugin_vnc_open_connection(RemminaProtocolWidget *gp)
-
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
static void remmina_plugin_vnc_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static gboolean remmina_plugin_vnc_close_connection(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_vnc_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
-
static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[]
static void remmina_plugin_vnc_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
-
Definition at line 2167 of file vnc_plugin.c.
+
Definition at line 2166 of file vnc_plugin.c.
@@ -2741,12 +2741,12 @@ Variables
Initial value:=
{
}
-
static gchar vncencodings_tooltip[]
+
static gchar vncencodings_tooltip[]
-
static gchar aspect_ratio_tooltip[]
+
static gchar aspect_ratio_tooltip[]
N_("Unable to connect to VNC server")
-
Definition at line 2128 of file vnc_plugin.c.
+
Definition at line 2127 of file vnc_plugin.c.
@@ -2770,17 +2770,17 @@ Variables
Initial value:=
{
}
-
static gchar repeater_tooltip[]
+
static gchar repeater_tooltip[]
-
static gpointer colordepth_list[]
+
static gpointer colordepth_list[]
-
static gpointer quality_list[]
+
static gpointer quality_list[]
N_("Unable to connect to VNC server")
-
Definition at line 2095 of file vnc_plugin.c.
+
Definition at line 2094 of file vnc_plugin.c.
@@ -2804,16 +2804,16 @@ Variables
Initial value:=
{
{
REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK),
"disableserverinput",
N_(
"Prevent local interaction on the server") },
#if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14)
#endif
}
-
static gpointer colordepth_list[]
+
static gpointer colordepth_list[]
-
static gpointer quality_list[]
+
static gpointer quality_list[]
N_("Unable to connect to VNC server")
-
Definition at line 2146 of file vnc_plugin.c.
+
Definition at line 2145 of file vnc_plugin.c.
@@ -2860,19 +2860,19 @@ Variables
-
Initial value:=
{
VNCI_PLUGIN_NAME,
VNCI_PLUGIN_DESCRIPTION,
GETTEXT_PACKAGE,
VERSION,
VNCI_PLUGIN_APPICON,
VNCI_PLUGIN_SSH_APPICON,
NULL,
NULL,
NULL
}
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
-
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
+
Initial value:=
{
VNCI_PLUGIN_NAME,
VNCI_PLUGIN_DESCRIPTION,
GETTEXT_PACKAGE,
VERSION,
VNCI_PLUGIN_APPICON,
VNCI_PLUGIN_SSH_APPICON,
NULL,
NULL,
NULL
}
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
+
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
static gboolean remmina_plugin_vnc_open_connection(RemminaProtocolWidget *gp)
-
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
static void remmina_plugin_vnc_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static gboolean remmina_plugin_vnc_close_connection(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_vnc_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
-
static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[]
static void remmina_plugin_vnc_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
-
Definition at line 2189 of file vnc_plugin.c.
+
Definition at line 2188 of file vnc_plugin.c.
@@ -2896,16 +2896,16 @@ Variables
Initial value:=
{
}
-
static gpointer colordepth_list[]
+
static gpointer colordepth_list[]
-
static gchar vnciport_tooltip[]
+
static gchar vnciport_tooltip[]
-
static gpointer quality_list[]
+
static gpointer quality_list[]
N_("Unable to connect to VNC server")
-
Definition at line 2108 of file vnc_plugin.c.
+
Definition at line 2107 of file vnc_plugin.c.
@@ -2930,7 +2930,7 @@ Variables
Initial value:=
N_(
"Connect to VNC using a repeater:\n" " • The server field must contain the repeater ID, e.g. ID:123456789\n"
" • The repeater field have to be set to the repeater IP and port, like:\n"
" 10.10.10.12:5901\n"
" • From the remote VNC server, you will connect to\n"
" the repeater, e.g. with x11vnc:\n"
" x11vnc -connect repeater=ID:123456789+10.10.10.12:5500")
N_("Unable to connect to VNC server")
-
Definition at line 2046 of file vnc_plugin.c.
+
Definition at line 2045 of file vnc_plugin.c.
@@ -2955,7 +2955,7 @@ Variables
Initial value:=
N_(
"Overriding the pre-set VNC encoding quality:\n" "\n"
" • “Poor (fastest)” sets encoding to “copyrect zlib hextile raw”\n"
" • “Medium” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n"
" • “Good” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n"
" • “Best (slowest)” sets encoding to “copyrect zrle ultra zlib hextile corre rre raw”")
N_("Unable to connect to VNC server")
-
Definition at line 2070 of file vnc_plugin.c.
+
Definition at line 2069 of file vnc_plugin.c.
@@ -2980,7 +2980,7 @@ Variables
Initial value:=
N_(
"Listening for remote VNC connection:\n" " • The “Listen on port” field is the port Remmina will listen to,\n"
" e.g. 8888\n"
" • From the remote VNC server, you will connect to\n"
" Remmina, e.g. with x11vnc:\n"
" x11vnc -display :0 -connect 192.168.1.36:8888")
N_("Unable to connect to VNC server")
-
Definition at line 2055 of file vnc_plugin.c.
+
Definition at line 2054 of file vnc_plugin.c.
diff --git a/public/vnc__plugin_8c_source.html b/public/vnc__plugin_8c_source.html
index a96cf6119..dbaabde65 100644
--- a/public/vnc__plugin_8c_source.html
+++ b/public/vnc__plugin_8c_source.html
@@ -86,7 +86,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
vnc_plugin.c
-
Go to the documentation of this file. 40 #include <rfb/rfbclient.h> 42 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY 1 43 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY 2 44 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT 3 45 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH 4 46 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT 5 47 #define REMMINA_PLUGIN_VNC_FEATURE_SCALE 6 48 #define REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS 7 49 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL 8 50 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_COLOR 9 51 #define REMMINA_PLUGIN_VNC_FEATURE_DYNRESUPDATE 10 53 #define VNC_DEFAULT_PORT 5900 55 #define GET_PLUGIN_DATA(gp) (RemminaPluginVncData *)g_object_get_data(G_OBJECT(gp), "plugin-data") 62 {
"5 5 3 1",
" c None",
". c #000000",
"+ c #FFFFFF",
" ... ",
".+++.",
".+ +.",
".+++.",
" ... " };
65 #define LOCK_BUFFER(t) if (t) { CANCEL_DEFER } pthread_mutex_lock(&gpdata->buffer_mutex); 66 #define UNLOCK_BUFFER(t) pthread_mutex_unlock(&gpdata->buffer_mutex); if (t) { CANCEL_ASYNC } 90 pthread_mutex_unlock(&d->
mu);
95 return G_SOURCE_REMOVE;
101 TRACE_CALL(__func__);
110 TRACE_CALL(__func__);
113 pthread_mutex_init(&d->
mu, NULL);
114 pthread_mutex_lock(&d->
mu);
117 pthread_mutex_lock(&d->mu);
119 pthread_cleanup_pop(0);
120 pthread_mutex_unlock(&d->mu);
121 pthread_mutex_destroy(&d->mu);
131 char *c = (
char *)&x;
138 TRACE_CALL(__func__);
143 event->event_type = event_type;
144 switch (event_type) {
146 event->event_data.key.keyval = GPOINTER_TO_UINT(p1);
147 event->event_data.key.pressed = GPOINTER_TO_INT(p2);
150 event->event_data.pointer.x = GPOINTER_TO_INT(p1);
151 event->event_data.pointer.y = GPOINTER_TO_INT(p2);
152 event->event_data.pointer.button_mask = GPOINTER_TO_INT(p3);
156 event->event_data.text.text = g_strdup((
char *)p1);
173 TRACE_CALL(__func__);
187 TRACE_CALL(__func__);
199 TRACE_CALL(__func__);
201 GtkAllocation widget_allocation;
211 gtk_widget_get_allocation(GTK_WIDGET(gp), &widget_allocation);
213 if (widget_allocation.width == width && widget_allocation.height == height)
217 sx = MIN(MAX(0, (*x) * widget_allocation.width / width - widget_allocation.width / width - 2), widget_allocation.width - 1);
218 sy = MIN(MAX(0, (*y) * widget_allocation.height / height - widget_allocation.height / height - 2), widget_allocation.height - 1);
219 sw = MIN(widget_allocation.width - sx, (*w) * widget_allocation.width / width + widget_allocation.width / width + 4);
220 sh = MIN(widget_allocation.height - sy, (*h) * widget_allocation.height / height + widget_allocation.height / height + 4);
230 TRACE_CALL(__func__);
247 gpdata = GET_PLUGIN_DATA(gp);
253 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
drawing_area), -1, -1);
256 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
drawing_area), width, height);
263 TRACE_CALL(__func__);
273 gdk_window_set_cursor(gtk_widget_get_window(gpdata->
drawing_area), cur);
278 gdk_window_set_cursor(gtk_widget_get_window(gpdata->
drawing_area), NULL);
280 UNLOCK_BUFFER(FALSE);
287 TRACE_CALL(__func__);
307 { rfbNoAuth, rfbVncAuth, rfbMSLogon, 0 };
326 TRACE_CALL(__func__);
332 cl = (rfbClient *)gpdata->
client;
345 rfbClientLog(
"sending clipboard text '%s'\n", event->
event_data.
text.text);
360 rfbClientLog(
"Ignoring VNC event: 0x%x\n", event->
event_type);
379 TRACE_CALL(__func__);
392 cl->appData.useBGR233 = 0;
393 cl->appData.encodingsString =
"copyrect zlib hextile raw";
394 cl->appData.compressLevel = 1;
395 cl->appData.qualityLevel = 9;
398 cl->appData.useBGR233 = 0;
399 cl->appData.encodingsString =
"tight zrle ultra copyrect hextile zlib corre rre raw";
400 cl->appData.compressLevel = 2;
401 cl->appData.qualityLevel = 7;
404 cl->appData.useBGR233 = 0;
405 cl->appData.encodingsString =
"tight zrle ultra copyrect hextile zlib corre rre raw";
406 cl->appData.compressLevel = 3;
407 cl->appData.qualityLevel = 5;
412 cl->appData.useBGR233 = 1;
413 cl->appData.encodingsString =
"copyrect zrle ultra zlib hextile corre rre raw";
414 cl->appData.qualityLevel = 1;
418 enc = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"encodings"));
420 cl->appData.encodingsString = g_strdup(enc);
421 g_free (enc), enc = NULL;
423 gboolean tight = remmina_plugin_service->
file_get_int (remminafile,
"tightencoding", FALSE);
425 if (!g_strrstr ( g_strdup(cl->appData.encodingsString),
"tight\0")) {
426 cl->appData.encodingsString = g_strdup_printf(
"%s %s",
"tight", g_strdup(cl->appData.encodingsString));
430 REMMINA_PLUGIN_DEBUG(
"Quality: %d", quality);
431 REMMINA_PLUGIN_DEBUG(
"Encodings: %s", cl->appData.encodingsString);
436 TRACE_CALL(__func__);
438 cl->format.depth = colordepth;
439 cl->appData.requestedDepth = colordepth;
441 cl->format.trueColour = 1;
444 switch (colordepth) {
446 cl->format.depth = 8;
447 cl->format.bitsPerPixel = 8;
448 cl->format.blueMax = 3;
449 cl->format.blueShift = 6;
450 cl->format.greenMax = 7;
451 cl->format.greenShift = 3;
452 cl->format.redMax = 7;
453 cl->format.redShift = 0;
456 cl->format.depth = 15;
457 cl->format.bitsPerPixel = 16;
458 cl->format.redShift = 11;
459 cl->format.greenShift = 6;
460 cl->format.blueShift = 1;
461 cl->format.redMax = 31;
462 cl->format.greenMax = 31;
463 cl->format.blueMax = 31;
467 cl->format.depth = 24;
468 cl->format.bitsPerPixel = 32;
469 cl->format.blueShift = 0;
470 cl->format.redShift = 16;
471 cl->format.greenShift = 8;
472 cl->format.blueMax = 0xff;
473 cl->format.redMax = 0xff;
474 cl->format.greenMax = 0xff;
478 rfbClientLog(
"colordepth = %d\n", colordepth);
479 rfbClientLog(
"format.depth = %d\n", cl->format.depth);
480 rfbClientLog(
"format.bitsPerPixel = %d\n", cl->format.bitsPerPixel);
481 rfbClientLog(
"format.blueShift = %d\n", cl->format.blueShift);
482 rfbClientLog(
"format.redShift = %d\n", cl->format.redShift);
483 rfbClientLog(
"format.trueColour = %d\n", cl->format.trueColour);
484 rfbClientLog(
"format.greenShift = %d\n", cl->format.greenShift);
485 rfbClientLog(
"format.blueMax = %d\n", cl->format.blueMax);
486 rfbClientLog(
"format.redMax = %d\n", cl->format.redMax);
487 rfbClientLog(
"format.greenMax = %d\n", cl->format.greenMax);
488 rfbClientLog(
"format.bigEndian = %d\n", cl->format.bigEndian);
493 TRACE_CALL(__func__);
498 cairo_surface_t *new_surface, *old_surface;
502 depth = cl->format.bitsPerPixel;
503 size = width * height * (depth / 8);
505 new_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
506 if (cairo_surface_status(new_surface) != CAIRO_STATUS_SUCCESS)
519 gpdata->
vnc_buffer = (guchar *)g_malloc(size);
525 cairo_surface_destroy(old_surface);
534 cl->updateRect.w =
width;
535 cl->updateRect.h =
height;
542 TRACE_CALL(__func__);
554 TRACE_CALL(__func__);
558 if (GTK_IS_WIDGET(gp) && gpdata->
connected) {
565 UNLOCK_BUFFER(FALSE);
567 gtk_widget_queue_draw_area(GTK_WIDGET(gp), x, y, w, h);
574 TRACE_CALL(__func__);
576 gint nx2, ny2, ox2, oy2;
599 gint src_rowstride, guchar *mask, gint
w, gint h)
601 TRACE_CALL(__func__);
608 gint rs, gs, bs, rm, gm, bm, rl, gl, bl, rr, gr, br;
619 bytesPerPixel = cl->format.bitsPerPixel / 8;
620 switch (cl->format.bitsPerPixel) {
623 for (iy = 0; iy < h; iy++) {
624 destptr = (guint32 *)(dest + iy * dest_rowstride);
625 srcptr = src + iy * src_rowstride;
626 for (ix = 0; ix <
w; ix++) {
627 if (!mask || *mask++) {
628 dst_pixel.colors.a = 0xff;
629 dst_pixel.colors.r = *(srcptr + 2);
630 dst_pixel.colors.g = *(srcptr + 1);
631 dst_pixel.colors.b = *srcptr;
632 *destptr++ = ntohl(dst_pixel.argb);
641 rm = cl->format.redMax;
642 gm = cl->format.greenMax;
643 bm = cl->format.blueMax;
650 rs = cl->format.redShift;
651 gs = cl->format.greenShift;
652 bs = cl->format.blueShift;
653 for (iy = 0; iy < h; iy++) {
654 destptr = (guint32 *)(dest + iy * dest_rowstride);
655 srcptr = src + iy * src_rowstride;
656 for (ix = 0; ix <
w; ix++) {
658 for (i = 0; i < bytesPerPixel; i++)
659 src_pixel += (*srcptr++) << (8 * i);
661 if (!mask || *mask++) {
662 dst_pixel.colors.a = 0xff;
663 c = (guchar)((src_pixel >> rs) & rm) << rl;
664 for (r = rr; r < 8; r *= 2)
666 dst_pixel.colors.r = c;
667 c = (guchar)((src_pixel >> gs) & gm) << gl;
668 for (r = gr; r < 8; r *= 2)
670 dst_pixel.colors.g = c;
671 c = (guchar)((src_pixel >> bs) & bm) << bl;
672 for (r = br; r < 8; r *= 2)
674 dst_pixel.colors.b = c;
675 *destptr++ = ntohl(dst_pixel.argb);
687 TRACE_CALL(__func__);
696 if (w >= 1 || h >= 1) {
698 bytesPerPixel = cl->format.bitsPerPixel / 8;
699 rowstride = cairo_image_surface_get_stride(gpdata->
rgb_buffer);
702 rowstride, gpdata->
vnc_buffer + ((y * width + x) * bytesPerPixel), width * bytesPerPixel, NULL,
718 TRACE_CALL(__func__);
719 REMMINA_PLUGIN_DEBUG(
"FinishedFrameBufferUpdate");
724 TRACE_CALL(__func__);
725 REMMINA_PLUGIN_DEBUG(
"Led state - value: %d, pad: %d", value, pad);
730 TRACE_CALL(__func__);
735 const char *cur_charset;
739 if (GTK_IS_WIDGET(gp) && gpdata->
connected) {
740 t = g_date_time_new_now_utc();
746 g_get_charset(&cur_charset);
747 text = g_convert_with_fallback(param->
text, param->
textlen, cur_charset,
"ISO-8859-1",
"?", &br, &bw, NULL);
748 gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), text, bw);
751 g_date_time_unref(t);
761 TRACE_CALL(__func__);
766 param->
text = g_malloc(textlen);
767 memcpy(param->
text, text, textlen);
775 TRACE_CALL(__func__);
785 pwd = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"password"));
789 gboolean disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
792 _(
"Enter VNC password"),
797 if (ret != GTK_RESPONSE_OK) {
806 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
811 static rfbCredential *
814 TRACE_CALL(__func__);
821 gboolean disablepasswordstoring;
826 cred = g_new0(rfbCredential, 1);
828 switch (credentialType) {
829 case rfbCredentialTypeUser:
831 s1 = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"username"));
833 s2 = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"password"));
836 cred->userCredential.username = s1;
837 cred->userCredential.password = s2;
842 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
845 _(
"Enter VNC authentication credentials"),
850 if (ret == GTK_RESPONSE_OK) {
855 remmina_plugin_service->
file_set_string(remminafile,
"username", cred->userCredential.username);
856 remmina_plugin_service->
file_set_string(remminafile,
"password", cred->userCredential.password);
858 remmina_plugin_service->
file_set_string(remminafile,
"username", NULL);
859 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
869 case rfbCredentialTypeX509:
872 cred->x509Credential.x509CACertFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"cacert"));
873 cred->x509Credential.x509CACrlFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"cacrl"));
874 cred->x509Credential.x509ClientCertFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"clientcert"));
875 cred->x509Credential.x509ClientKeyFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"clientkey"));
879 if (ret == GTK_RESPONSE_OK) {
902 TRACE_CALL(__func__);
906 if (!gtk_widget_get_window(GTK_WIDGET(gp)))
909 if (width && height) {
910 gint stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
911 guchar *data = g_malloc(stride * height);
913 width * cl->format.bitsPerPixel / 8, cl->rcMask, width, height);
914 cairo_surface_t *surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride);
915 if (cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
919 if (cairo_surface_set_user_data(surface, NULL, NULL, g_free) != CAIRO_STATUS_SUCCESS) {
932 TRACE_CALL(__func__);
933 REMMINA_PLUGIN_DEBUG(
"Bell message received");
941 if (remmina_plugin_service->
file_get_int(remminafile,
"disableserverbell", FALSE))
944 window = gtk_widget_get_window(GTK_WIDGET(gp));
947 gdk_window_beep(window);
948 REMMINA_PLUGIN_DEBUG(
"Beep emitted");
952 #ifdef __DO_NOT_COMPILE_ME__ 953 N_(
"Unable to connect to VNC server")
954 N_("Couldn’t convert '%s' to host address")
955 N_("VNC connection failed: %s")
956 N_("Your connection has been rejected.")
959 #define MAX_ERROR_LENGTH 1000 960 static gchar vnc_error[MAX_ERROR_LENGTH + 1];
961 static gboolean vnc_encryption_disable_requested;
963 static void remmina_plugin_vnc_rfb_output(
const char *format, ...)
965 TRACE_CALL(__func__);
968 if (!rfbEnableClientLogging)
972 va_start(args, format);
974 f = g_strdup(format);
975 if (f[strlen(f) - 1] ==
'\n') f[strlen(f) - 1] =
'\0';
977 if (g_strcmp0(f,
"VNC connection failed: %s") == 0) {
978 p = va_arg(args, gchar *);
979 g_snprintf(vnc_error, MAX_ERROR_LENGTH, _(f), _(p));
980 }
else if (g_strcmp0(f,
"The VNC server requested an unknown authentication method. %s") == 0) {
981 p = va_arg(args, gchar *);
982 if (vnc_encryption_disable_requested) {
983 ff = g_strconcat(_(
"The VNC server requested an unknown authentication method. %s"),
985 _(
"Please retry after turning on encryption for this profile."),
987 g_snprintf(vnc_error, MAX_ERROR_LENGTH, ff, p);
990 g_snprintf(vnc_error, MAX_ERROR_LENGTH, _(f), p);
993 g_vsnprintf(vnc_error, MAX_ERROR_LENGTH, _(f), args);
998 REMMINA_PLUGIN_DEBUG(
"VNC returned: %s", vnc_error);
1003 TRACE_CALL(__func__);
1007 ptr = g_strdup_printf(
"%s\n", text);
1014 TRACE_CALL(__func__);
1021 TRACE_CALL(__func__);
1022 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
1026 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
1031 TRACE_CALL(__func__);
1038 TRACE_CALL(__func__);
1042 cl = (rfbClient *)gpdata->
client;
1052 TRACE_CALL(__func__);
1057 case rfbTextChatOpen:
1060 case rfbTextChatClose:
1063 case rfbTextChatFinished:
1075 TRACE_CALL(__func__);
1083 gpdata->
listen_sock = ListenAtTcpPort(cl->listenPort);
1095 select(gpdata->
listen_sock + 1, &fds, NULL, NULL, NULL);
1104 cl->sock = AcceptTcpConnection(gpdata->
listen_sock);
1105 if (cl->sock >= 0) {
1109 if (cl->sock < 0 || !SetNonBlocking(cl->sock))
1118 TRACE_CALL(__func__);
1124 struct timeval timeout;
1131 cl = (rfbClient *)gpdata->
client;
1140 goto handle_buffered;
1142 timeout.tv_sec = 10;
1143 timeout.tv_usec = 0;
1145 FD_SET(cl->sock, &fds);
1147 ret = select(MAX(cl->sock, gpdata->
vnc_event_pipe[0]) + 1, &fds, NULL, NULL, &timeout);
1156 if (FD_ISSET(cl->sock, &fds)) {
1157 i = WaitForMessage(cl, 500);
1161 if (!HandleRFBServerMessage(cl)) {
1174 TRACE_CALL(__func__);
1177 rfbClient *cl = NULL;
1184 rfbClientLog = rfbClientErr = remmina_plugin_vnc_rfb_output;
1186 gint colordepth = remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32);
1187 gint quality = remmina_plugin_service->
file_get_int(remminafile,
"quality", 9);
1195 REMMINA_PLUGIN_DEBUG(
"host is null");
1201 switch (colordepth) {
1203 cl = rfbGetClient(2, 3, 1);
1207 cl = rfbGetClient(5, 3, 2);
1210 cl = rfbGetClient(6, 3, 3);
1214 cl = rfbGetClient(8, 3, 4);
1217 REMMINA_PLUGIN_DEBUG(
"Color depth: %d", colordepth);
1219 cl->canHandleNewFBSize = TRUE;
1235 remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ?
1245 rfbClientSetClientData(cl, NULL, gp);
1247 if (host[0] ==
'\0') {
1248 cl->serverHost = g_strdup(host);
1249 cl->listenSpecified = TRUE;
1250 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1254 cl->listenPort = 5500;
1256 cl->listenPort = remmina_plugin_service->
file_get_int(remminafile,
"listenport", 5500);
1260 if (strstr(host,
"unix://") == host) {
1261 cl->serverHost = g_strdup(host + strlen(
"unix://"));
1264 remmina_plugin_service->
get_server_port(host, VNC_DEFAULT_PORT, &s, &cl->serverPort);
1265 cl->serverHost = g_strdup(s);
1268 if (cl->serverPort < 100)
1269 cl->serverPort += VNC_DEFAULT_PORT;
1275 if (cl->serverHost && strstr(cl->serverHost,
"unix://") != cl->serverHost && remmina_plugin_service->
file_get_string(remminafile,
"proxy")) {
1286 REMMINA_PLUGIN_DEBUG(
"cl->serverHost: %s", cl->serverHost);
1287 REMMINA_PLUGIN_DEBUG(
"cl->serverPort: %d", cl->serverPort);
1288 REMMINA_PLUGIN_DEBUG(
"cl->destHost: %s", cl->destHost);
1289 REMMINA_PLUGIN_DEBUG(
"cl->destPort: %d", cl->destPort);
1292 cl->appData.useRemoteCursor = (
1293 remmina_plugin_service->
file_get_int(remminafile,
"showcursor", FALSE) ? FALSE : TRUE);
1297 if ((cl->format.depth == 8) && (quality == 9))
1298 cl->appData.encodingsString =
"copyrect zlib hextile raw";
1299 else if ((cl->format.depth == 8) && (quality == 2))
1300 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1301 else if ((cl->format.depth == 8) && (quality == 1))
1302 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1303 else if ((cl->format.depth == 8) && (quality == 0))
1304 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1305 SetFormatAndEncodings(cl);
1307 if (remmina_plugin_service->
file_get_int(remminafile,
"disableencryption", FALSE)) {
1308 vnc_encryption_disable_requested = TRUE;
1311 vnc_encryption_disable_requested = FALSE;
1314 if (rfbInitClient(cl, NULL, NULL)) {
1315 REMMINA_PLUGIN_DEBUG(
"Client initialization successfull");
1318 REMMINA_PLUGIN_DEBUG(
"Client initialization failed");
1323 REMMINA_PLUGIN_DEBUG(
"Client not authenticated");
1329 if (strstr(vnc_error,
"The server is already in use")) {
1336 if (strstr(vnc_error,
"read (") || strstr(vnc_error,
"select\n") ||
1337 strstr(vnc_error,
"write\n") || strstr(vnc_error,
"Connection timed out")) {
1344 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
1358 REMMINA_PLUGIN_DEBUG(
"Client not connected with error: %s", vnc_error);
1368 REMMINA_PLUGIN_DEBUG(
"Client connected");
1375 if (remmina_plugin_service->
file_get_int(remminafile,
"disableserverinput", FALSE))
1376 PermitServerInput(cl, 1);
1393 TRACE_CALL(__func__);
1394 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
1404 GtkAllocation widget_allocation;
1408 gtk_widget_get_allocation(widget, &widget_allocation);
1421 TRACE_CALL(__func__);
1429 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1440 TRACE_CALL(__func__);
1449 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1453 if (event->button < 1 || event->button > 3)
1456 if (event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE)
1459 mask = (1 << (
event->button - 1));
1469 static gint
delta_to_mask(
float delta,
float *accum, gint mask_plus, gint mask_minus)
1472 if (*accum >= 1.0) {
1475 }
else if (*accum <= -1.0) {
1484 TRACE_CALL(__func__);
1493 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1496 switch (event->direction) {
1501 case GDK_SCROLL_DOWN:
1505 case GDK_SCROLL_LEFT:
1509 case GDK_SCROLL_RIGHT:
1513 #if GTK_CHECK_VERSION(3, 4, 0) 1514 case GDK_SCROLL_SMOOTH:
1538 TRACE_CALL(__func__);
1551 GINT_TO_POINTER(FALSE), NULL);
1561 g_ptr_array_remove_index_fast(gpdata->
pressed_keys, i);
1570 TRACE_CALL(__func__);
1580 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1589 event_keyval =
event->keyval;
1590 if (event->type == GDK_KEY_RELEASE) {
1593 if (k->
keycode == event->hardware_keycode) {
1594 event_keyval = k->
keyval;
1604 GINT_TO_POINTER(event->type == GDK_KEY_PRESS ? TRUE : FALSE), NULL);
1607 if (event->type == GDK_KEY_PRESS) {
1610 k->
keycode =
event->hardware_keycode;
1620 TRACE_CALL(__func__);
1626 const char *cur_charset;
1630 t = g_date_time_new_now_utc();
1638 g_get_charset(&cur_charset);
1639 latin1_text = g_convert_with_fallback(text, -1,
"ISO-8859-1", cur_charset,
"?", &br, &bw, NULL);
1641 g_free(latin1_text);
1647 TRACE_CALL(__func__);
1654 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1662 TRACE_CALL(__func__);
1669 if (remmina_plugin_service->
file_get_int(remminafile,
"showcursor", FALSE)) {
1673 g_object_unref(pixbuf);
1674 gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(gp)), cursor);
1675 g_object_unref(cursor);
1683 TRACE_CALL(__func__);
1692 const gchar* raw_server;
1704 if (!remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE))
1705 gpdata->
clipboard_handler = g_signal_connect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)),
1711 g_print(
"Could not initialize pthread. Falling back to non-thread mode…\n");
1716 raw_server = remmina_plugin_service->
file_get_string(remminafile,
"server");
1718 if (raw_server && strstr(raw_server,
"unix://") == raw_server) {
1719 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s via VNC"), raw_server);
1726 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s:%d via VNC"), server, port);
1727 g_free(server), server = NULL;
1729 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 1737 TRACE_CALL(__func__);
1749 REMMINA_PLUGIN_AUDIT(_(
"Disconnected from %s:%d via VNC"), server, port);
1750 g_free(server), server = NULL;
1758 g_signal_handler_disconnect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)), gpdata->
clipboard_handler);
1778 rfbClientCleanup((rfbClient *)gpdata->
client);
1806 TRACE_CALL(__func__);
1812 pthread_cancel(gpdata->
thread);
1813 if (gpdata->
thread) pthread_join(gpdata->
thread, NULL);
1825 TRACE_CALL(__func__);
1827 switch (feature->
id) {
1828 case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT:
1829 return SupportsClient2Server((rfbClient *)(gpdata->
client), rfbSetServerInput) ? TRUE : FALSE;
1830 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT:
1831 return SupportsClient2Server((rfbClient *)(gpdata->
client), rfbTextChat) ? TRUE : FALSE;
1839 TRACE_CALL(__func__);
1843 uint8_t previous_bpp;
1845 switch (feature->
id) {
1846 case REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY:
1848 remmina_plugin_service->
file_get_int(remminafile,
"quality", 9));
1850 remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32));
1851 SetFormatAndEncodings((rfbClient *)(gpdata->
client));
1853 case REMMINA_PLUGIN_VNC_FEATURE_PREF_COLOR:
1854 client = (rfbClient *)(gpdata->
client);
1855 previous_bpp = client->format.bitsPerPixel;
1857 remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32));
1858 SetFormatAndEncodings(client);
1860 if (client->format.bitsPerPixel > previous_bpp){
1862 SendFramebufferUpdateRequest((rfbClient *)(gpdata->
client), 0, 0,
1867 case REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY:
1869 case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT:
1870 PermitServerInput((rfbClient *)(gpdata->
client),
1871 remmina_plugin_service->
file_get_int(remminafile,
"disableserverinput", FALSE) ? 1 : 0);
1873 case REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS:
1876 case REMMINA_PLUGIN_VNC_FEATURE_SCALE:
1879 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH:
1880 SendFramebufferUpdateRequest((rfbClient *)(gpdata->
client), 0, 0,
1884 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT:
1887 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL:
1898 TRACE_CALL(__func__);
1902 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
1906 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 1909 TRACE_CALL(__func__);
1915 sprintf(str,
"DEBUG: %d x %d", alloc->width, alloc->height);
1919 SendExtDesktopSize(gpdata->
client, alloc->width, alloc->height);
1928 TRACE_CALL(__func__);
1930 cairo_surface_t *surface;
1932 GtkAllocation widget_allocation;
1938 UNLOCK_BUFFER(FALSE);
1946 gtk_widget_get_allocation(widget, &widget_allocation);
1947 cairo_scale(context,
1948 (
double)widget_allocation.width / width,
1949 (
double)widget_allocation.height / height);
1952 cairo_rectangle(context, 0, 0, width, height);
1953 cairo_set_source_surface(context, surface, 0, 0);
1954 cairo_fill(context);
1956 UNLOCK_BUFFER(FALSE);
1962 TRACE_CALL(__func__);
1965 gdouble aspect_ratio;
1968 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
1970 gboolean disable_smooth_scrolling = FALSE;
1973 disable_smooth_scrolling = remmina_plugin_service->
file_get_int(remminafile,
"disablesmoothscrolling", FALSE);
1974 REMMINA_PLUGIN_DEBUG(
"Disable smooth scrolling is set to %d", disable_smooth_scrolling);
1979 aspect_ratio = remmina_plugin_service->
file_get_double(remminafile,
"aspect_ratio", 0);
1980 if (aspect_ratio > 0){
1981 GtkWidget* aspectframe = gtk_aspect_frame_new(NULL, 0, 0, aspect_ratio, FALSE);
1983 gtk_frame_set_shadow_type(aspectframe, GTK_SHADOW_NONE);
1984 gtk_widget_show(aspectframe);
1986 gtk_container_add(GTK_CONTAINER(gp), aspectframe);
1989 gtk_container_add(GTK_CONTAINER(gp), gpdata->
drawing_area);
1992 gtk_widget_add_events(
1994 GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK
1995 | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK
1996 | GDK_KEY_RELEASE_MASK
2000 if (!disable_smooth_scrolling) {
2001 REMMINA_PLUGIN_DEBUG(
"Adding GDK_SMOOTH_SCROLL_MASK");
2002 gtk_widget_add_events(gpdata->
drawing_area, GDK_SMOOTH_SCROLL_MASK);
2007 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 2017 g_print(
"Error creating pipes.\n");
2030 "32",
N_(
"True colour (32 bpp)"),
2031 "16",
N_(
"High colour (16 bpp)"),
2032 "8",
N_(
"256 colours (8 bpp)"),
2040 "9",
N_(
"Best (slowest)"),
2042 "0",
N_(
"Poor (fastest)"),
2047 N_(
"Connect to VNC using a repeater:\n" 2048 " • The server field must contain the repeater ID, e.g. ID:123456789\n" 2049 " • The repeater field have to be set to the repeater IP and port, like:\n" 2050 " 10.10.10.12:5901\n" 2051 " • From the remote VNC server, you will connect to\n" 2052 " the repeater, e.g. with x11vnc:\n" 2053 " x11vnc -connect repeater=ID:123456789+10.10.10.12:5500");
2056 N_(
"Listening for remote VNC connection:\n" 2057 " • The “Listen on port” field is the port Remmina will listen to,\n" 2059 " • From the remote VNC server, you will connect to\n" 2060 " Remmina, e.g. with x11vnc:\n" 2061 " x11vnc -display :0 -connect 192.168.1.36:8888");
2064 N_(
"Lock the aspect ratio when dynamic resolution is enabled:\n" 2066 " • The aspect ratio should be entered as a decimal number, e.g. 1.777\n" 2067 " • 16:9 corresponds roughly to 1.7777, 4:3 corresponds roughly to 1.333\n" 2068 " • The default value of 0 does not enforce any aspect ratio");
2071 N_(
"Overriding the pre-set VNC encoding quality:\n" 2073 " • “Poor (fastest)” sets encoding to “copyrect zlib hextile raw”\n" 2074 " • “Medium” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n" 2075 " • “Good” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n" 2076 " • “Best (slowest)” sets encoding to “copyrect zrle ultra zlib hextile corre rre raw”");
2154 {
REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK),
"disableserverinput",
N_(
"Prevent local interaction on the server") },
2160 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 2171 VNC_PLUGIN_DESCRIPTION,
2175 VNC_PLUGIN_SSH_APPICON,
2193 VNCI_PLUGIN_DESCRIPTION,
2196 VNCI_PLUGIN_APPICON,
2197 VNCI_PLUGIN_SSH_APPICON,
2213 G_MODULE_EXPORT gboolean
2216 TRACE_CALL(__func__);
2217 remmina_plugin_service = service;
2219 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
2220 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
+
Go to the documentation of this file. 40 #include <rfb/rfbclient.h> 42 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY 1 43 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY 2 44 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT 3 45 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH 4 46 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT 5 47 #define REMMINA_PLUGIN_VNC_FEATURE_SCALE 6 48 #define REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS 7 49 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL 8 50 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_COLOR 9 51 #define REMMINA_PLUGIN_VNC_FEATURE_DYNRESUPDATE 10 53 #define VNC_DEFAULT_PORT 5900 55 #define GET_PLUGIN_DATA(gp) (RemminaPluginVncData *)g_object_get_data(G_OBJECT(gp), "plugin-data") 62 {
"5 5 3 1",
" c None",
". c #000000",
"+ c #FFFFFF",
" ... ",
".+++.",
".+ +.",
".+++.",
" ... " };
65 #define LOCK_BUFFER(t) if (t) { CANCEL_DEFER } pthread_mutex_lock(&gpdata->buffer_mutex); 66 #define UNLOCK_BUFFER(t) pthread_mutex_unlock(&gpdata->buffer_mutex); if (t) { CANCEL_ASYNC } 90 pthread_mutex_unlock(&d->
mu);
95 return G_SOURCE_REMOVE;
101 TRACE_CALL(__func__);
110 TRACE_CALL(__func__);
113 pthread_mutex_init(&d->
mu, NULL);
114 pthread_mutex_lock(&d->
mu);
117 pthread_mutex_lock(&d->mu);
119 pthread_cleanup_pop(0);
120 pthread_mutex_unlock(&d->mu);
121 pthread_mutex_destroy(&d->mu);
131 char *c = (
char *)&x;
138 TRACE_CALL(__func__);
143 event->event_type = event_type;
144 switch (event_type) {
146 event->event_data.key.keyval = GPOINTER_TO_UINT(p1);
147 event->event_data.key.pressed = GPOINTER_TO_INT(p2);
150 event->event_data.pointer.x = GPOINTER_TO_INT(p1);
151 event->event_data.pointer.y = GPOINTER_TO_INT(p2);
152 event->event_data.pointer.button_mask = GPOINTER_TO_INT(p3);
156 event->event_data.text.text = g_strdup((
char *)p1);
173 TRACE_CALL(__func__);
187 TRACE_CALL(__func__);
199 TRACE_CALL(__func__);
201 GtkAllocation widget_allocation;
211 gtk_widget_get_allocation(GTK_WIDGET(gp), &widget_allocation);
213 if (widget_allocation.width == width && widget_allocation.height == height)
217 sx = MIN(MAX(0, (*x) * widget_allocation.width / width - widget_allocation.width / width - 2), widget_allocation.width - 1);
218 sy = MIN(MAX(0, (*y) * widget_allocation.height / height - widget_allocation.height / height - 2), widget_allocation.height - 1);
219 sw = MIN(widget_allocation.width - sx, (*w) * widget_allocation.width / width + widget_allocation.width / width + 4);
220 sh = MIN(widget_allocation.height - sy, (*h) * widget_allocation.height / height + widget_allocation.height / height + 4);
230 TRACE_CALL(__func__);
247 gpdata = GET_PLUGIN_DATA(gp);
253 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
drawing_area), -1, -1);
256 gtk_widget_set_size_request(GTK_WIDGET(gpdata->
drawing_area), width, height);
263 TRACE_CALL(__func__);
273 gdk_window_set_cursor(gtk_widget_get_window(gpdata->
drawing_area), cur);
278 gdk_window_set_cursor(gtk_widget_get_window(gpdata->
drawing_area), NULL);
280 UNLOCK_BUFFER(FALSE);
287 TRACE_CALL(__func__);
307 { rfbNoAuth, rfbVncAuth, rfbMSLogon, 0 };
326 TRACE_CALL(__func__);
332 cl = (rfbClient *)gpdata->
client;
345 rfbClientLog(
"sending clipboard text '%s'\n", event->
event_data.
text.text);
360 rfbClientLog(
"Ignoring VNC event: 0x%x\n", event->
event_type);
379 TRACE_CALL(__func__);
392 cl->appData.useBGR233 = 0;
393 cl->appData.encodingsString =
"copyrect zlib hextile raw";
394 cl->appData.compressLevel = 1;
395 cl->appData.qualityLevel = 9;
398 cl->appData.useBGR233 = 0;
399 cl->appData.encodingsString =
"tight zrle ultra copyrect hextile zlib corre rre raw";
400 cl->appData.compressLevel = 2;
401 cl->appData.qualityLevel = 7;
404 cl->appData.useBGR233 = 0;
405 cl->appData.encodingsString =
"tight zrle ultra copyrect hextile zlib corre rre raw";
406 cl->appData.compressLevel = 3;
407 cl->appData.qualityLevel = 5;
412 cl->appData.useBGR233 = 1;
413 cl->appData.encodingsString =
"copyrect zrle ultra zlib hextile corre rre raw";
414 cl->appData.qualityLevel = 1;
418 enc = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"encodings"));
420 cl->appData.encodingsString = g_strdup(enc);
421 g_free (enc), enc = NULL;
423 gboolean tight = remmina_plugin_service->
file_get_int (remminafile,
"tightencoding", FALSE);
425 if (!g_strrstr ( g_strdup(cl->appData.encodingsString),
"tight\0")) {
426 cl->appData.encodingsString = g_strdup_printf(
"%s %s",
"tight", g_strdup(cl->appData.encodingsString));
430 REMMINA_PLUGIN_DEBUG(
"Quality: %d", quality);
431 REMMINA_PLUGIN_DEBUG(
"Encodings: %s", cl->appData.encodingsString);
436 TRACE_CALL(__func__);
438 cl->format.depth = colordepth;
439 cl->appData.requestedDepth = colordepth;
441 cl->format.trueColour = 1;
444 switch (colordepth) {
446 cl->format.depth = 8;
447 cl->format.bitsPerPixel = 8;
448 cl->format.blueMax = 3;
449 cl->format.blueShift = 6;
450 cl->format.greenMax = 7;
451 cl->format.greenShift = 3;
452 cl->format.redMax = 7;
453 cl->format.redShift = 0;
456 cl->format.depth = 15;
457 cl->format.bitsPerPixel = 16;
458 cl->format.redShift = 11;
459 cl->format.greenShift = 6;
460 cl->format.blueShift = 1;
461 cl->format.redMax = 31;
462 cl->format.greenMax = 31;
463 cl->format.blueMax = 31;
467 cl->format.depth = 24;
468 cl->format.bitsPerPixel = 32;
469 cl->format.blueShift = 0;
470 cl->format.redShift = 16;
471 cl->format.greenShift = 8;
472 cl->format.blueMax = 0xff;
473 cl->format.redMax = 0xff;
474 cl->format.greenMax = 0xff;
478 rfbClientLog(
"colordepth = %d\n", colordepth);
479 rfbClientLog(
"format.depth = %d\n", cl->format.depth);
480 rfbClientLog(
"format.bitsPerPixel = %d\n", cl->format.bitsPerPixel);
481 rfbClientLog(
"format.blueShift = %d\n", cl->format.blueShift);
482 rfbClientLog(
"format.redShift = %d\n", cl->format.redShift);
483 rfbClientLog(
"format.trueColour = %d\n", cl->format.trueColour);
484 rfbClientLog(
"format.greenShift = %d\n", cl->format.greenShift);
485 rfbClientLog(
"format.blueMax = %d\n", cl->format.blueMax);
486 rfbClientLog(
"format.redMax = %d\n", cl->format.redMax);
487 rfbClientLog(
"format.greenMax = %d\n", cl->format.greenMax);
488 rfbClientLog(
"format.bigEndian = %d\n", cl->format.bigEndian);
493 TRACE_CALL(__func__);
498 cairo_surface_t *new_surface, *old_surface;
502 depth = cl->format.bitsPerPixel;
503 size = width * height * (depth / 8);
505 new_surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
506 if (cairo_surface_status(new_surface) != CAIRO_STATUS_SUCCESS)
519 gpdata->
vnc_buffer = (guchar *)g_malloc(size);
525 cairo_surface_destroy(old_surface);
534 cl->updateRect.w =
width;
535 cl->updateRect.h =
height;
542 TRACE_CALL(__func__);
554 TRACE_CALL(__func__);
558 if (GTK_IS_WIDGET(gp) && gpdata->
connected) {
565 UNLOCK_BUFFER(FALSE);
567 gtk_widget_queue_draw_area(GTK_WIDGET(gp), x, y, w, h);
574 TRACE_CALL(__func__);
576 gint nx2, ny2, ox2, oy2;
599 gint src_rowstride, guchar *mask, gint
w, gint h)
601 TRACE_CALL(__func__);
608 gint rs, gs, bs, rm, gm, bm, rl, gl, bl, rr, gr, br;
619 bytesPerPixel = cl->format.bitsPerPixel / 8;
620 switch (cl->format.bitsPerPixel) {
623 for (iy = 0; iy < h; iy++) {
624 destptr = (guint32 *)(dest + iy * dest_rowstride);
625 srcptr = src + iy * src_rowstride;
626 for (ix = 0; ix <
w; ix++) {
627 if (!mask || *mask++) {
628 dst_pixel.colors.a = 0xff;
629 dst_pixel.colors.r = *(srcptr + 2);
630 dst_pixel.colors.g = *(srcptr + 1);
631 dst_pixel.colors.b = *srcptr;
632 *destptr++ = ntohl(dst_pixel.argb);
641 rm = cl->format.redMax;
642 gm = cl->format.greenMax;
643 bm = cl->format.blueMax;
650 rs = cl->format.redShift;
651 gs = cl->format.greenShift;
652 bs = cl->format.blueShift;
653 for (iy = 0; iy < h; iy++) {
654 destptr = (guint32 *)(dest + iy * dest_rowstride);
655 srcptr = src + iy * src_rowstride;
656 for (ix = 0; ix <
w; ix++) {
658 for (i = 0; i < bytesPerPixel; i++)
659 src_pixel += (*srcptr++) << (8 * i);
661 if (!mask || *mask++) {
662 dst_pixel.colors.a = 0xff;
663 c = (guchar)((src_pixel >> rs) & rm) << rl;
664 for (r = rr; r < 8; r *= 2)
666 dst_pixel.colors.r = c;
667 c = (guchar)((src_pixel >> gs) & gm) << gl;
668 for (r = gr; r < 8; r *= 2)
670 dst_pixel.colors.g = c;
671 c = (guchar)((src_pixel >> bs) & bm) << bl;
672 for (r = br; r < 8; r *= 2)
674 dst_pixel.colors.b = c;
675 *destptr++ = ntohl(dst_pixel.argb);
687 TRACE_CALL(__func__);
696 if (w >= 1 || h >= 1) {
698 bytesPerPixel = cl->format.bitsPerPixel / 8;
699 rowstride = cairo_image_surface_get_stride(gpdata->
rgb_buffer);
702 rowstride, gpdata->
vnc_buffer + ((y * width + x) * bytesPerPixel), width * bytesPerPixel, NULL,
718 TRACE_CALL(__func__);
719 REMMINA_PLUGIN_DEBUG(
"FinishedFrameBufferUpdate");
724 TRACE_CALL(__func__);
725 REMMINA_PLUGIN_DEBUG(
"Led state - value: %d, pad: %d", value, pad);
730 TRACE_CALL(__func__);
735 const char *cur_charset;
739 if (GTK_IS_WIDGET(gp) && gpdata->
connected) {
740 t = g_date_time_new_now_utc();
746 g_get_charset(&cur_charset);
747 text = g_convert_with_fallback(param->
text, param->
textlen, cur_charset,
"ISO-8859-1",
"?", &br, &bw, NULL);
748 gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), text, bw);
751 g_date_time_unref(t);
761 TRACE_CALL(__func__);
766 param->
text = g_malloc(textlen);
767 memcpy(param->
text, text, textlen);
775 TRACE_CALL(__func__);
785 pwd = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"password"));
789 gboolean disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
792 _(
"Enter VNC password"),
797 if (ret != GTK_RESPONSE_OK) {
806 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
811 static rfbCredential *
814 TRACE_CALL(__func__);
821 gboolean disablepasswordstoring;
826 cred = g_new0(rfbCredential, 1);
828 switch (credentialType) {
829 case rfbCredentialTypeUser:
831 s1 = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"username"));
833 s2 = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"password"));
836 cred->userCredential.username = s1;
837 cred->userCredential.password = s2;
842 disablepasswordstoring = remmina_plugin_service->
file_get_int(remminafile,
"disablepasswordstoring", FALSE);
845 _(
"Enter VNC authentication credentials"),
850 if (ret == GTK_RESPONSE_OK) {
855 remmina_plugin_service->
file_set_string(remminafile,
"username", cred->userCredential.username);
856 remmina_plugin_service->
file_set_string(remminafile,
"password", cred->userCredential.password);
858 remmina_plugin_service->
file_set_string(remminafile,
"username", NULL);
859 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
869 case rfbCredentialTypeX509:
872 cred->x509Credential.x509CACertFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"cacert"));
873 cred->x509Credential.x509CACrlFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"cacrl"));
874 cred->x509Credential.x509ClientCertFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"clientcert"));
875 cred->x509Credential.x509ClientKeyFile = g_strdup(remmina_plugin_service->
file_get_string(remminafile,
"clientkey"));
879 if (ret == GTK_RESPONSE_OK) {
902 TRACE_CALL(__func__);
906 if (!gtk_widget_get_window(GTK_WIDGET(gp)))
909 if (width && height) {
910 gint stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width);
911 guchar *data = g_malloc(stride * height);
913 width * cl->format.bitsPerPixel / 8, cl->rcMask, width, height);
914 cairo_surface_t *surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32, width, height, stride);
915 if (cairo_surface_status(surface) != CAIRO_STATUS_SUCCESS) {
919 if (cairo_surface_set_user_data(surface, NULL, NULL, g_free) != CAIRO_STATUS_SUCCESS) {
932 TRACE_CALL(__func__);
933 REMMINA_PLUGIN_DEBUG(
"Bell message received");
941 if (remmina_plugin_service->
file_get_int(remminafile,
"disableserverbell", FALSE))
944 window = gtk_widget_get_window(GTK_WIDGET(gp));
947 gdk_window_beep(window);
948 REMMINA_PLUGIN_DEBUG(
"Beep emitted");
952 #ifdef __DO_NOT_COMPILE_ME__ 953 N_(
"Unable to connect to VNC server")
954 N_("Couldn’t convert '%s' to host address")
955 N_("VNC connection failed: %s")
956 N_("Your connection has been rejected.")
959 #define MAX_ERROR_LENGTH 1000 960 static gchar vnc_error[MAX_ERROR_LENGTH + 1];
961 static gboolean vnc_encryption_disable_requested;
963 static void remmina_plugin_vnc_rfb_output(
const char *format, ...)
965 TRACE_CALL(__func__);
968 if (!rfbEnableClientLogging)
972 va_start(args, format);
974 f = g_strdup(format);
975 if (f[strlen(f) - 1] ==
'\n') f[strlen(f) - 1] =
'\0';
977 if (g_strcmp0(f,
"VNC connection failed: %s") == 0) {
978 p = va_arg(args, gchar *);
979 g_snprintf(vnc_error, MAX_ERROR_LENGTH, _(f), _(p));
980 }
else if (g_strcmp0(f,
"The VNC server requested an unknown authentication method. %s") == 0) {
981 p = va_arg(args, gchar *);
982 if (vnc_encryption_disable_requested) {
983 ff = g_strconcat(_(
"The VNC server requested an unknown authentication method. %s"),
985 _(
"Please retry after turning on encryption for this profile."),
987 g_snprintf(vnc_error, MAX_ERROR_LENGTH, ff, p);
990 g_snprintf(vnc_error, MAX_ERROR_LENGTH, _(f), p);
993 g_vsnprintf(vnc_error, MAX_ERROR_LENGTH, _(f), args);
998 REMMINA_PLUGIN_DEBUG(
"VNC returned: %s", vnc_error);
1003 TRACE_CALL(__func__);
1007 ptr = g_strdup_printf(
"%s\n", text);
1014 TRACE_CALL(__func__);
1021 TRACE_CALL(__func__);
1022 guint keys[] = { GDK_KEY_Control_L, GDK_KEY_Alt_L, GDK_KEY_Delete };
1026 keys, G_N_ELEMENTS(keys), GDK_KEY_PRESS | GDK_KEY_RELEASE);
1031 TRACE_CALL(__func__);
1038 TRACE_CALL(__func__);
1042 cl = (rfbClient *)gpdata->
client;
1052 TRACE_CALL(__func__);
1057 case rfbTextChatOpen:
1060 case rfbTextChatClose:
1063 case rfbTextChatFinished:
1075 TRACE_CALL(__func__);
1083 gpdata->
listen_sock = ListenAtTcpPort(cl->listenPort);
1095 select(gpdata->
listen_sock + 1, &fds, NULL, NULL, NULL);
1104 cl->sock = AcceptTcpConnection(gpdata->
listen_sock);
1105 if (cl->sock >= 0) {
1109 if (cl->sock < 0 || !SetNonBlocking(cl->sock))
1118 TRACE_CALL(__func__);
1124 struct timeval timeout;
1131 cl = (rfbClient *)gpdata->
client;
1140 goto handle_buffered;
1142 timeout.tv_sec = 10;
1143 timeout.tv_usec = 0;
1145 FD_SET(cl->sock, &fds);
1147 ret = select(MAX(cl->sock, gpdata->
vnc_event_pipe[0]) + 1, &fds, NULL, NULL, &timeout);
1156 if (FD_ISSET(cl->sock, &fds)) {
1157 i = WaitForMessage(cl, 500);
1161 if (!HandleRFBServerMessage(cl)) {
1174 TRACE_CALL(__func__);
1177 rfbClient *cl = NULL;
1184 rfbClientLog = rfbClientErr = remmina_plugin_vnc_rfb_output;
1186 gint colordepth = remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32);
1187 gint quality = remmina_plugin_service->
file_get_int(remminafile,
"quality", 9);
1195 REMMINA_PLUGIN_DEBUG(
"host is null");
1201 switch (colordepth) {
1203 cl = rfbGetClient(2, 3, 1);
1207 cl = rfbGetClient(5, 3, 2);
1210 cl = rfbGetClient(6, 3, 3);
1214 cl = rfbGetClient(8, 3, 4);
1217 REMMINA_PLUGIN_DEBUG(
"Color depth: %d", colordepth);
1219 cl->canHandleNewFBSize = TRUE;
1235 remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE) ?
1245 rfbClientSetClientData(cl, NULL, gp);
1247 if (host[0] ==
'\0') {
1248 cl->serverHost = g_strdup(host);
1249 cl->listenSpecified = TRUE;
1250 if (remmina_plugin_service->
file_get_int(remminafile,
"ssh_tunnel_enabled", FALSE))
1254 cl->listenPort = 5500;
1256 cl->listenPort = remmina_plugin_service->
file_get_int(remminafile,
"listenport", 5500);
1260 if (strstr(host,
"unix://") == host) {
1261 cl->serverHost = g_strdup(host + strlen(
"unix://"));
1264 remmina_plugin_service->
get_server_port(host, VNC_DEFAULT_PORT, &s, &cl->serverPort);
1265 cl->serverHost = g_strdup(s);
1268 if (cl->serverPort < 100)
1269 cl->serverPort += VNC_DEFAULT_PORT;
1275 if (cl->serverHost && strstr(cl->serverHost,
"unix://") != cl->serverHost && remmina_plugin_service->
file_get_string(remminafile,
"proxy")) {
1286 REMMINA_PLUGIN_DEBUG(
"cl->serverHost: %s", cl->serverHost);
1287 REMMINA_PLUGIN_DEBUG(
"cl->serverPort: %d", cl->serverPort);
1288 REMMINA_PLUGIN_DEBUG(
"cl->destHost: %s", cl->destHost);
1289 REMMINA_PLUGIN_DEBUG(
"cl->destPort: %d", cl->destPort);
1292 cl->appData.useRemoteCursor = (
1293 remmina_plugin_service->
file_get_int(remminafile,
"showcursor", FALSE) ? FALSE : TRUE);
1297 if ((cl->format.depth == 8) && (quality == 9))
1298 cl->appData.encodingsString =
"copyrect zlib hextile raw";
1299 else if ((cl->format.depth == 8) && (quality == 2))
1300 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1301 else if ((cl->format.depth == 8) && (quality == 1))
1302 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1303 else if ((cl->format.depth == 8) && (quality == 0))
1304 cl->appData.encodingsString =
"zrle ultra copyrect hextile zlib corre rre raw";
1305 SetFormatAndEncodings(cl);
1307 if (remmina_plugin_service->
file_get_int(remminafile,
"disableencryption", FALSE)) {
1308 vnc_encryption_disable_requested = TRUE;
1311 vnc_encryption_disable_requested = FALSE;
1314 if (rfbInitClient(cl, NULL, NULL)) {
1315 REMMINA_PLUGIN_DEBUG(
"Client initialization successfull");
1318 REMMINA_PLUGIN_DEBUG(
"Client initialization failed");
1323 REMMINA_PLUGIN_DEBUG(
"Client not authenticated");
1329 if (strstr(vnc_error,
"The server is already in use")) {
1336 if (strstr(vnc_error,
"read (") || strstr(vnc_error,
"select\n") ||
1337 strstr(vnc_error,
"write\n") || strstr(vnc_error,
"Connection timed out")) {
1344 remmina_plugin_service->
file_set_string(remminafile,
"password", NULL);
1358 REMMINA_PLUGIN_DEBUG(
"Client not connected with error: %s", vnc_error);
1368 REMMINA_PLUGIN_DEBUG(
"Client connected");
1375 if (remmina_plugin_service->
file_get_int(remminafile,
"disableserverinput", FALSE))
1376 PermitServerInput(cl, 1);
1393 TRACE_CALL(__func__);
1394 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
1404 GtkAllocation widget_allocation;
1408 gtk_widget_get_allocation(widget, &widget_allocation);
1421 TRACE_CALL(__func__);
1429 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1440 TRACE_CALL(__func__);
1449 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1453 if (event->button < 1 || event->button > 3)
1456 if (event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE)
1459 mask = (1 << (
event->button - 1));
1469 static gint
delta_to_mask(
float delta,
float *accum, gint mask_plus, gint mask_minus)
1472 if (*accum >= 1.0) {
1475 }
else if (*accum <= -1.0) {
1484 TRACE_CALL(__func__);
1493 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1496 switch (event->direction) {
1501 case GDK_SCROLL_DOWN:
1505 case GDK_SCROLL_LEFT:
1509 case GDK_SCROLL_RIGHT:
1513 #if GTK_CHECK_VERSION(3, 4, 0) 1514 case GDK_SCROLL_SMOOTH:
1538 TRACE_CALL(__func__);
1551 GINT_TO_POINTER(FALSE), NULL);
1561 g_ptr_array_remove_index_fast(gpdata->
pressed_keys, i);
1570 TRACE_CALL(__func__);
1580 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1589 event_keyval =
event->keyval;
1590 if (event->type == GDK_KEY_RELEASE) {
1593 if (k->
keycode == event->hardware_keycode) {
1594 event_keyval = k->
keyval;
1604 GINT_TO_POINTER(event->type == GDK_KEY_PRESS ? TRUE : FALSE), NULL);
1607 if (event->type == GDK_KEY_PRESS) {
1610 k->
keycode =
event->hardware_keycode;
1620 TRACE_CALL(__func__);
1626 const char *cur_charset;
1630 t = g_date_time_new_now_utc();
1638 g_get_charset(&cur_charset);
1639 latin1_text = g_convert_with_fallback(text, -1,
"ISO-8859-1", cur_charset,
"?", &br, &bw, NULL);
1641 g_free(latin1_text);
1647 TRACE_CALL(__func__);
1654 if (remmina_plugin_service->
file_get_int(remminafile,
"viewonly", FALSE))
1662 TRACE_CALL(__func__);
1669 if (remmina_plugin_service->
file_get_int(remminafile,
"showcursor", FALSE)) {
1673 g_object_unref(pixbuf);
1674 gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(gp)), cursor);
1675 g_object_unref(cursor);
1683 TRACE_CALL(__func__);
1692 const gchar* raw_server;
1704 if (!remmina_plugin_service->
file_get_int(remminafile,
"disableclipboard", FALSE))
1705 gpdata->
clipboard_handler = g_signal_connect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)),
1711 g_print(
"Could not initialize pthread. Falling back to non-thread mode…\n");
1716 raw_server = remmina_plugin_service->
file_get_string(remminafile,
"server");
1718 if (raw_server && strstr(raw_server,
"unix://") == raw_server) {
1719 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s via VNC"), raw_server);
1726 REMMINA_PLUGIN_AUDIT(_(
"Connected to %s:%d via VNC"), server, port);
1727 g_free(server), server = NULL;
1729 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 1737 TRACE_CALL(__func__);
1749 REMMINA_PLUGIN_AUDIT(_(
"Disconnected from %s:%d via VNC"), server, port);
1750 g_free(server), server = NULL;
1758 g_signal_handler_disconnect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)), gpdata->
clipboard_handler);
1778 rfbClientCleanup((rfbClient *)gpdata->
client);
1806 TRACE_CALL(__func__);
1812 pthread_cancel(gpdata->
thread);
1813 if (gpdata->
thread) pthread_join(gpdata->
thread, NULL);
1825 TRACE_CALL(__func__);
1827 switch (feature->
id) {
1828 case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT:
1829 return SupportsClient2Server((rfbClient *)(gpdata->
client), rfbSetServerInput) ? TRUE : FALSE;
1830 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT:
1831 return SupportsClient2Server((rfbClient *)(gpdata->
client), rfbTextChat) ? TRUE : FALSE;
1839 TRACE_CALL(__func__);
1843 uint8_t previous_bpp;
1845 switch (feature->
id) {
1846 case REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY:
1848 remmina_plugin_service->
file_get_int(remminafile,
"quality", 9));
1850 remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32));
1851 SetFormatAndEncodings((rfbClient *)(gpdata->
client));
1853 case REMMINA_PLUGIN_VNC_FEATURE_PREF_COLOR:
1854 client = (rfbClient *)(gpdata->
client);
1855 previous_bpp = client->format.bitsPerPixel;
1857 remmina_plugin_service->
file_get_int(remminafile,
"colordepth", 32));
1858 SetFormatAndEncodings(client);
1860 if (client->format.bitsPerPixel > previous_bpp){
1862 SendFramebufferUpdateRequest((rfbClient *)(gpdata->
client), 0, 0,
1867 case REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY:
1869 case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT:
1870 PermitServerInput((rfbClient *)(gpdata->
client),
1871 remmina_plugin_service->
file_get_int(remminafile,
"disableserverinput", FALSE) ? 1 : 0);
1873 case REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS:
1876 case REMMINA_PLUGIN_VNC_FEATURE_SCALE:
1879 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH:
1880 SendFramebufferUpdateRequest((rfbClient *)(gpdata->
client), 0, 0,
1884 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT:
1887 case REMMINA_PLUGIN_VNC_FEATURE_TOOL_SENDCTRLALTDEL:
1898 TRACE_CALL(__func__);
1902 keystrokes, keylen, GDK_KEY_PRESS | GDK_KEY_RELEASE);
1906 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 1909 TRACE_CALL(__func__);
1915 sprintf(str,
"DEBUG: %d x %d", alloc->width, alloc->height);
1918 SendExtDesktopSize(gpdata->
client, alloc->width, alloc->height);
1927 TRACE_CALL(__func__);
1929 cairo_surface_t *surface;
1931 GtkAllocation widget_allocation;
1937 UNLOCK_BUFFER(FALSE);
1945 gtk_widget_get_allocation(widget, &widget_allocation);
1946 cairo_scale(context,
1947 (
double)widget_allocation.width / width,
1948 (
double)widget_allocation.height / height);
1951 cairo_rectangle(context, 0, 0, width, height);
1952 cairo_set_source_surface(context, surface, 0, 0);
1953 cairo_fill(context);
1955 UNLOCK_BUFFER(FALSE);
1961 TRACE_CALL(__func__);
1964 gdouble aspect_ratio;
1967 g_object_set_data_full(G_OBJECT(gp),
"plugin-data", gpdata, g_free);
1969 gboolean disable_smooth_scrolling = FALSE;
1972 disable_smooth_scrolling = remmina_plugin_service->
file_get_int(remminafile,
"disablesmoothscrolling", FALSE);
1973 REMMINA_PLUGIN_DEBUG(
"Disable smooth scrolling is set to %d", disable_smooth_scrolling);
1978 aspect_ratio = remmina_plugin_service->
file_get_double(remminafile,
"aspect_ratio", 0);
1979 if (aspect_ratio > 0){
1980 GtkWidget* aspectframe = gtk_aspect_frame_new(NULL, 0, 0, aspect_ratio, FALSE);
1982 gtk_frame_set_shadow_type(GTK_FRAME(aspectframe), GTK_SHADOW_NONE);
1983 gtk_widget_show(aspectframe);
1984 gtk_container_add(GTK_CONTAINER(aspectframe), gpdata->
drawing_area);
1985 gtk_container_add(GTK_CONTAINER(gp), aspectframe);
1988 gtk_container_add(GTK_CONTAINER(gp), gpdata->
drawing_area);
1991 gtk_widget_add_events(
1993 GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK
1994 | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK
1995 | GDK_KEY_RELEASE_MASK
1999 if (!disable_smooth_scrolling) {
2000 REMMINA_PLUGIN_DEBUG(
"Adding GDK_SMOOTH_SCROLL_MASK");
2001 gtk_widget_add_events(gpdata->
drawing_area, GDK_SMOOTH_SCROLL_MASK);
2006 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 2016 g_print(
"Error creating pipes.\n");
2029 "32",
N_(
"True colour (32 bpp)"),
2030 "16",
N_(
"High colour (16 bpp)"),
2031 "8",
N_(
"256 colours (8 bpp)"),
2039 "9",
N_(
"Best (slowest)"),
2041 "0",
N_(
"Poor (fastest)"),
2046 N_(
"Connect to VNC using a repeater:\n" 2047 " • The server field must contain the repeater ID, e.g. ID:123456789\n" 2048 " • The repeater field have to be set to the repeater IP and port, like:\n" 2049 " 10.10.10.12:5901\n" 2050 " • From the remote VNC server, you will connect to\n" 2051 " the repeater, e.g. with x11vnc:\n" 2052 " x11vnc -connect repeater=ID:123456789+10.10.10.12:5500");
2055 N_(
"Listening for remote VNC connection:\n" 2056 " • The “Listen on port” field is the port Remmina will listen to,\n" 2058 " • From the remote VNC server, you will connect to\n" 2059 " Remmina, e.g. with x11vnc:\n" 2060 " x11vnc -display :0 -connect 192.168.1.36:8888");
2063 N_(
"Lock the aspect ratio when dynamic resolution is enabled:\n" 2065 " • The aspect ratio should be entered as a decimal number, e.g. 1.777\n" 2066 " • 16:9 corresponds roughly to 1.7777, 4:3 corresponds roughly to 1.333\n" 2067 " • The default value of 0 does not enforce any aspect ratio");
2070 N_(
"Overriding the pre-set VNC encoding quality:\n" 2072 " • “Poor (fastest)” sets encoding to “copyrect zlib hextile raw”\n" 2073 " • “Medium” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n" 2074 " • “Good” sets encoding to “tight zrle ultra copyrect hextile zlib corre rre raw”\n" 2075 " • “Best (slowest)” sets encoding to “copyrect zrle ultra zlib hextile corre rre raw”");
2153 {
REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT, GINT_TO_POINTER(REMMINA_PROTOCOL_FEATURE_PREF_CHECK),
"disableserverinput",
N_(
"Prevent local interaction on the server") },
2159 #if LIBVNCSERVER_CHECK_VERSION_VERSION(0, 9, 14) 2170 VNC_PLUGIN_DESCRIPTION,
2174 VNC_PLUGIN_SSH_APPICON,
2192 VNCI_PLUGIN_DESCRIPTION,
2195 VNCI_PLUGIN_APPICON,
2196 VNCI_PLUGIN_SSH_APPICON,
2212 G_MODULE_EXPORT gboolean
2215 TRACE_CALL(__func__);
2216 remmina_plugin_service = service;
2218 bindtextdomain(GETTEXT_PACKAGE, REMMINA_RUNTIME_LOCALEDIR);
2219 bind_textdomain_codeset(GETTEXT_PACKAGE,
"UTF-8");
static void remmina_plugin_vnc_on_cuttext(GtkClipboard *clipboard, GdkEvent *event, RemminaProtocolWidget *gp)
static gboolean remmina_plugin_vnc_on_size_allocate(GtkWidget *widget, GtkAllocation *alloc, RemminaProtocolWidget *gp)
@@ -95,7 +95,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
gchar *(* protocol_plugin_init_get_cacert)(RemminaProtocolWidget *gp)
-
static gchar repeater_tooltip[]
+
static gchar repeater_tooltip[]
void(* protocol_plugin_chat_close)(RemminaProtocolWidget *gp)
static void remmina_plugin_vnc_on_realize(RemminaProtocolWidget *gp, gpointer data)
@@ -105,7 +105,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static void remmina_plugin_vnc_rfb_finished(rfbClient *cl) __attribute__((unused))
RemminaScaleMode(* remmina_protocol_widget_get_current_scale_mode)(RemminaProtocolWidget *gp)
-
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
+
static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp)
void(* protocol_plugin_set_error)(RemminaProtocolWidget *gp, const gchar *fmt,...)
@@ -115,9 +115,9 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
void(* protocol_plugin_init_save_cred)(RemminaProtocolWidget *gp)
-
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
+
static const RemminaProtocolFeature remmina_plugin_vnc_features[]
static int dot_cursor_y_hot
-
static gpointer colordepth_list[]
+
static gpointer colordepth_list[]
typedefG_BEGIN_DECLS struct _RemminaFile RemminaFile
void(* protocol_plugin_init_show_retry)(RemminaProtocolWidget *gp)
@@ -152,7 +152,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static gboolean remmina_plugin_vnc_close_chat(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_vnc_queue_draw_area_real(RemminaProtocolWidget *gp)
static const uint32_t remmina_plugin_vnc_no_encrypt_auth_types[]
-
static RemminaProtocolPlugin remmina_plugin_vnci
+
static RemminaProtocolPlugin remmina_plugin_vnci
gboolean(* protocol_plugin_is_closed)(RemminaProtocolWidget *gp)
static void remmina_plugin_vnc_event_push(RemminaProtocolWidget *gp, gint event_type, gpointer p1, gpointer p2, gpointer p3)
@@ -165,12 +165,12 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static void remmina_plugin_vnc_rfb_led_state(rfbClient *cl, int value, int pad)
void(* get_server_port)(const gchar *server, gint defaultport, gchar **host, gint *port)
-
static gchar vnciport_tooltip[]
+
static gchar vnciport_tooltip[]
gint(* file_get_int)(RemminaFile *remminafile, const gchar *setting, gint default_value)
static gint delta_to_mask(float delta, float *accum, gint mask_plus, gint mask_minus)
static void remmina_plugin_vnc_rfb_chat(rfbClient *cl, int value, char *text)
static char * remmina_plugin_vnc_rfb_password(rfbClient *cl)
-
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[]
void(* protocol_plugin_update_align)(RemminaProtocolWidget *gp)
void(* protocol_plugin_chat_receive)(RemminaProtocolWidget *gp, const gchar *text)
@@ -180,7 +180,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static void remmina_plugin_vnc_rfb_cursor_shape(rfbClient *cl, int xhot, int yhot, int width, int height, int bytesPerPixel)
-
static RemminaProtocolPlugin remmina_plugin_vnc
+
static RemminaProtocolPlugin remmina_plugin_vnc
@@ -220,7 +220,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static void remmina_plugin_vnc_on_cuttext_request(GtkClipboard *clipboard, const gchar *text, RemminaProtocolWidget *gp)
-
static gchar vncencodings_tooltip[]
+
static gchar vncencodings_tooltip[]
gint(* protocol_plugin_get_height)(RemminaProtocolWidget *gp)
gint(* protocol_plugin_init_auth)(RemminaProtocolWidget *gp, RemminaMessagePanelFlags pflags, const gchar *title, const gchar *default_username, const gchar *default_password, const gchar *default_domain, const gchar *password_prompt)
@@ -248,7 +248,7 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
static gboolean remmina_plugin_vnc_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature)
static gboolean remmina_plugin_vnc_main(RemminaProtocolWidget *gp)
-
static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[]
struct _RemminaPluginVncEvent::@63::@65 pointer
gchar *(* protocol_plugin_init_get_username)(RemminaProtocolWidget *gp)
@@ -279,28 +279,28 @@ $(document).ready(function(){initNavTree('vnc__plugin_8c_source.html','');});
gchar *(* protocol_plugin_init_get_cacrl)(RemminaProtocolWidget *gp)
-
static gpointer quality_list[]
+
static gpointer quality_list[]
static gboolean remmina_plugin_vnc_on_motion(GtkWidget *widget, GdkEventMotion *event, RemminaProtocolWidget *gp)
const gchar *(* file_get_string)(RemminaFile *remminafile, const gchar *setting)
static gboolean remmina_plugin_vnc_close_connection_timeout(RemminaProtocolWidget *gp)
static gboolean remmina_plugin_vnc_incoming_connection(RemminaProtocolWidget *gp, rfbClient *cl)
-
static gchar aspect_ratio_tooltip[]
+
static gchar aspect_ratio_tooltip[]
N_("Unable to connect to VNC server")
gboolean remmina_plugin_vnc_setcursor(RemminaProtocolWidget *gp)
gboolean(* is_main_thread)(void)
pthread_mutex_t vnc_event_queue_mutex
-
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
+
G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service)
static gboolean remmina_plugin_vnc_on_button(GtkWidget *widget, GdkEventButton *event, RemminaProtocolWidget *gp)
void(* protocol_plugin_init_show_listen)(RemminaProtocolWidget *gp, gint port)
-
static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[]
+
static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[]
static void remmina_plugin_vnc_event_free(RemminaPluginVncEvent *event)
static void remmina_plugin_vnc_keystroke(RemminaProtocolWidget *gp, const guint keystrokes[], const gint keylen)
-
static gboolean remmina_plugin_vnc_on_draw(GtkWidget *widget, cairo_t *context, RemminaProtocolWidget *gp)
+
static gboolean remmina_plugin_vnc_on_draw(GtkWidget *widget, cairo_t *context, RemminaProtocolWidget *gp)
--
cgit v1.2.3