Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/Remmina/Remmina.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorheadkaze <headkaze@gmail.com>2021-12-17 15:05:02 +0300
committerheadkaze <headkaze@gmail.com>2021-12-17 15:05:02 +0300
commit2143beac690d085506a02fd6038d5dae8e16e724 (patch)
tree61de674281f1a41aa5d5d8e472a5210753b1400d /plugins
parentf26ff86d520cd384c1dfa7a1b099225cd9c1b321 (diff)
Add Keyboard mapping per client RDP
Diffstat (limited to 'plugins')
-rw-r--r--plugins/rdp/rdp_plugin.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/plugins/rdp/rdp_plugin.c b/plugins/rdp/rdp_plugin.c
index ff9de75b5..6d33531ac 100644
--- a/plugins/rdp/rdp_plugin.c
+++ b/plugins/rdp/rdp_plugin.c
@@ -80,6 +80,9 @@
#include <pthread_np.h>
#endif
+#include "../remmina_pref.h"
+#include <freerdp/locale/keyboard.h>
+
#define REMMINA_RDP_FEATURE_TOOL_REFRESH 1
#define REMMINA_RDP_FEATURE_SCALE 2
#define REMMINA_RDP_FEATURE_UNFOCUS 3
@@ -1288,6 +1291,36 @@ static gboolean remmina_rdp_set_connection_type(rdpSettings *settings, guint32 t
return TRUE;
}
+static gchar *remmina_get_rdp_kbd_remap(const gchar *keymap)
+{
+ TRACE_CALL(__func__);
+ guint *table;
+ gchar keys[20];
+ gchar *rdp_kbd_remap = NULL;
+ gint i;
+ Display *display;
+
+ if (!keymap || keymap[0] == '\0')
+ return rdp_kbd_remap;
+
+ table = (guint *)g_hash_table_lookup(remmina_keymap_table, keymap);
+ if (!table)
+ return rdp_kbd_remap;
+ rdp_kbd_remap = g_malloc0(512);
+ display = XOpenDisplay(0);
+ for (i = 0; table[i] > 0; i += 2) {
+ g_snprintf(keys, sizeof(keys), "0x%02x=0x%02x", freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i])), freerdp_keyboard_get_rdp_scancode_from_x11_keycode(XKeysymToKeycode(display, table[i + 1])));
+
+ if (i > 0)
+ g_strlcat(rdp_kbd_remap, ",", 512);
+
+ g_strlcat(rdp_kbd_remap, keys, 512);
+ }
+ XCloseDisplay(display);
+
+ return rdp_kbd_remap;
+}
+
static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
{
TRACE_CALL(__func__);
@@ -1302,6 +1335,7 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
gint gateway_port;
gchar *datapath = NULL;
gboolean status = TRUE;
+ gchar *rdp_kbd_remap;
gint i;
gint desktopOrientation, desktopScaleFactor, deviceScaleFactor;
@@ -1642,8 +1676,16 @@ static gboolean remmina_rdp_main(RemminaProtocolWidget *gp)
freerdp_performance_flags_split(rfi->settings);
#if FREERDP_CHECK_VERSION(2, 3, 0)
- freerdp_settings_set_string(rfi->settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->pref_get_value("rdp_kbd_remap"));
- REMMINA_PLUGIN_DEBUG("rdp_keyboard_remapping_list: %s", rfi->settings->KeyboardRemappingList);
+ rdp_kbd_remap = remmina_get_rdp_kbd_remap(remmina_plugin_service->file_get_string(remminafile, "keymap"));
+ if (rdp_kbd_remap != NULL) {
+ freerdp_settings_set_string(rfi->settings, FreeRDP_KeyboardRemappingList, rdp_kbd_remap);
+ REMMINA_PLUGIN_DEBUG("rdp_keyboard_remapping_list: %s", rfi->settings->KeyboardRemappingList);
+ g_free(rdp_kbd_remap);
+ }
+ else {
+ freerdp_settings_set_string(rfi->settings, FreeRDP_KeyboardRemappingList, remmina_plugin_service->pref_get_value("rdp_kbd_remap"));
+ REMMINA_PLUGIN_DEBUG("rdp_keyboard_remapping_list: %s", rfi->settings->KeyboardRemappingList);
+ }
#endif
freerdp_settings_set_uint32(rfi->settings, FreeRDP_KeyboardLayout, remmina_rdp_settings_get_keyboard_layout());