From df5e2fd962f68c7124774d45b87c864db2b5d066 Mon Sep 17 00:00:00 2001 From: mather Date: Thu, 6 Feb 2020 16:01:41 +0900 Subject: [PATCH 1/6] GUACAMOLE-951: Add ability to set KeyboardType for FreeRDP KeyboardType, KeyboardSubtype, KeyboardFunctionKey is required for Japanese keyboard setting actually, but the patch has been applied to overwrite values only for Japanese keyboards. see: https://github.com/FreeRDP/FreeRDP/pull/707 I think it should be specified from Guacamole as FreeRDP user side. --- src/protocols/rdp/keymap.h | 18 ++++++++++++ src/protocols/rdp/keymaps/generate.pl | 28 +++++++++++++++++++ src/protocols/rdp/keymaps/ja_jp_qwerty.keymap | 3 ++ src/protocols/rdp/settings.c | 3 ++ 4 files changed, 52 insertions(+) diff --git a/src/protocols/rdp/keymap.h b/src/protocols/rdp/keymap.h index bac1a7fa..b3a4ee4c 100644 --- a/src/protocols/rdp/keymap.h +++ b/src/protocols/rdp/keymap.h @@ -103,6 +103,24 @@ struct guac_rdp_keymap { */ const UINT32 freerdp_keyboard_layout; + /** + * FreeRDP keyboard type definition. + * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype + */ + const UINT32 freerdp_keyboard_type; + + /** + * FreeRDP keyboard subtype definition. + * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype + */ + const UINT32 freerdp_keyboard_subtype; + + /** + * FreeRDP keyboard number of function keys. + * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype#remarks + */ + const UINT32 freerdp_keyboard_function_key; + }; /** diff --git a/src/protocols/rdp/keymaps/generate.pl b/src/protocols/rdp/keymaps/generate.pl index f1059a75..1da9f694 100755 --- a/src/protocols/rdp/keymaps/generate.pl +++ b/src/protocols/rdp/keymaps/generate.pl @@ -81,6 +81,22 @@ for my $filename (@ARGV) { elsif ((my $name) = m/^\s*freerdp\s+"(.*)"\s*(?:#.*)?$/) { $freerdp = $name; } + + # FreeRDP keyboard type + elsif ((my $name) = m/^\s*freerdp_keyboard_type\s+"(.*)"\s*(?:#.*)?$/) { + $freerdp_keyboard_type = $name; + } + + # FreeRDP keyboard subtype + elsif ((my $name) = m/^\s*freerdp_keyboard_subtype\s+"(.*)"\s*(?:#.*)?$/) { + $freerdp_keyboard_subtype = $name; + } + + # FreeRDP keyboard function key + elsif ((my $name) = m/^\s*freerdp_keyboard_function_key\s+"(.*)"\s*(?:#.*)?$/) { + $freerdp_keyboard_function_key = $name; + } + # Map elsif ((my $range, my $onto) = @@ -253,6 +269,18 @@ for my $filename (@ARGV) { if ($freerdp) { print OUTPUT " .freerdp_keyboard_layout = $freerdp,\n"; } + # FreeRDP keyboard type (if any) + if ($freerdp_keyboard_type) { + print OUTPUT " .freerdp_keyboard_type = $freerdp_keyboard_type,\n"; + } + # FreeRDP layout (if any) + if ($freerdp_keyboard_subtype) { + print OUTPUT " .freerdp_keyboard_subtype = $freerdp_keyboard_subtype,\n"; + } + # FreeRDP layout (if any) + if ($freerdp_keyboard_function_key) { + print OUTPUT " .freerdp_keyboard_function_key = $freerdp_keyboard_function_key,\n"; + } # Desc footer print OUTPUT diff --git a/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap b/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap index 673b10fd..63e0e53a 100644 --- a/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap +++ b/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap @@ -20,6 +20,9 @@ parent "base" name "ja-jp-qwerty" freerdp "KBD_JAPANESE" +freerdp_keyboard_type "KBD_TYPE_JAPANESE" +freerdp_keyboard_subtype "2" +freerdp_keyboard_function_key "12" map -shift 0x02..0x0D 0x7D ~ "1234567890-^\" map -shift 0x10..0x1B ~ "qwertyuiop@[" diff --git a/src/protocols/rdp/settings.c b/src/protocols/rdp/settings.c index fe2cf672..618a694b 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -1189,6 +1189,9 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_rdp_strdup(guac_settings->initial_program); rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; + rdp_settings->KeyboardType = guac_settings->server_layout->freerdp_keyboard_type; + rdp_settings->KeyboardSubType = guac_settings->server_layout->freerdp_keyboard_subtype; + rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->freerdp_keyboard_function_key; /* Performance flags */ /* Explicitly set flag value */ From 0492f40b5f29fa9df853a2d3c4abbe00bc5a9eab Mon Sep 17 00:00:00 2001 From: mather Date: Wed, 12 Feb 2020 14:11:53 +0900 Subject: [PATCH 2/6] GUACAMOLE-951: Replace reference URLs to English page. --- src/protocols/rdp/keymap.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/protocols/rdp/keymap.h b/src/protocols/rdp/keymap.h index b3a4ee4c..5aa0c038 100644 --- a/src/protocols/rdp/keymap.h +++ b/src/protocols/rdp/keymap.h @@ -105,19 +105,19 @@ struct guac_rdp_keymap { /** * FreeRDP keyboard type definition. - * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ const UINT32 freerdp_keyboard_type; /** * FreeRDP keyboard subtype definition. - * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ const UINT32 freerdp_keyboard_subtype; /** * FreeRDP keyboard number of function keys. - * See https://docs.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-getkeyboardtype#remarks + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ const UINT32 freerdp_keyboard_function_key; From 341dc445b00fb948b8e6b83273de79b97b0ada3b Mon Sep 17 00:00:00 2001 From: mather Date: Wed, 12 Feb 2020 14:14:21 +0900 Subject: [PATCH 3/6] GUACAMOLE-951: Initialize parameters in generate.pl --- src/protocols/rdp/keymaps/generate.pl | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/protocols/rdp/keymaps/generate.pl b/src/protocols/rdp/keymaps/generate.pl index 1da9f694..fe2152ca 100755 --- a/src/protocols/rdp/keymaps/generate.pl +++ b/src/protocols/rdp/keymaps/generate.pl @@ -56,6 +56,9 @@ for my $filename (@ARGV) { my $parent = ""; my $layout_name = ""; my $freerdp = ""; + my $freerdp_keyboard_type = ""; + my $freerdp_keyboard_subtype = ""; + my $freerdp_keyboard_function_key = ""; # Parse file open INPUT, '<', "$filename"; From f0e3fe67c160cbf022ba0aa6d0b1b0102d12498e Mon Sep 17 00:00:00 2001 From: mather Date: Wed, 12 Feb 2020 14:53:17 +0900 Subject: [PATCH 4/6] GUACAMOLE-951: Guard if keyboard_type not specified. --- src/protocols/rdp/settings.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/protocols/rdp/settings.c b/src/protocols/rdp/settings.c index 618a694b..0b8b3bfd 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -1189,9 +1189,15 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_rdp_strdup(guac_settings->initial_program); rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; - rdp_settings->KeyboardType = guac_settings->server_layout->freerdp_keyboard_type; - rdp_settings->KeyboardSubType = guac_settings->server_layout->freerdp_keyboard_subtype; - rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->freerdp_keyboard_function_key; + if (guac_settings->server_layout->freerdp_keyboard_type > 0) { + rdp_settings->KeyboardType = guac_settings->server_layout->freerdp_keyboard_type; + } + if (guac_settings->server_layout->freerdp_keyboard_subtype > 0) { + rdp_settings->KeyboardSubType = guac_settings->server_layout->freerdp_keyboard_subtype; + } + if (guac_settings->server_layout->freerdp_keyboard_function_key > 0) { + rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->freerdp_keyboard_function_key; + } /* Performance flags */ /* Explicitly set flag value */ From b85fff7c0868fd87d0a6f0b8e31257c627e992e0 Mon Sep 17 00:00:00 2001 From: mather Date: Thu, 27 Feb 2020 10:29:05 +0900 Subject: [PATCH 5/6] GUACAMOLE-951: Fix condition for UINT32 --- src/protocols/rdp/settings.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/protocols/rdp/settings.c b/src/protocols/rdp/settings.c index 0b8b3bfd..bcb172a9 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -1189,13 +1189,13 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_rdp_strdup(guac_settings->initial_program); rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; - if (guac_settings->server_layout->freerdp_keyboard_type > 0) { + if (guac_settings->server_layout->freerdp_keyboard_type != 0) { rdp_settings->KeyboardType = guac_settings->server_layout->freerdp_keyboard_type; } - if (guac_settings->server_layout->freerdp_keyboard_subtype > 0) { + if (guac_settings->server_layout->freerdp_keyboard_subtype != 0) { rdp_settings->KeyboardSubType = guac_settings->server_layout->freerdp_keyboard_subtype; } - if (guac_settings->server_layout->freerdp_keyboard_function_key > 0) { + if (guac_settings->server_layout->freerdp_keyboard_function_key != 0) { rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->freerdp_keyboard_function_key; } From 5a8c59c8fdea95149dc9fda6aa52dd953539a5c1 Mon Sep 17 00:00:00 2001 From: Eisuke Kuwahata Date: Wed, 11 Nov 2020 17:14:13 +0900 Subject: [PATCH 6/6] Rename freerdp_* variables. --- src/protocols/rdp/keymap.h | 16 +++--- src/protocols/rdp/keymaps/generate.pl | 54 +++++++++---------- src/protocols/rdp/keymaps/ja_jp_qwerty.keymap | 8 +-- src/protocols/rdp/settings.c | 14 ++--- 4 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/protocols/rdp/keymap.h b/src/protocols/rdp/keymap.h index 5aa0c038..7ac45396 100644 --- a/src/protocols/rdp/keymap.h +++ b/src/protocols/rdp/keymap.h @@ -97,29 +97,29 @@ struct guac_rdp_keymap { const guac_rdp_keysym_desc* mapping; /** - * FreeRDP keyboard layout associated with this + * Keyboard layout associated with this * keymap. If this keymap is selected, this layout * will be requested from the server. */ - const UINT32 freerdp_keyboard_layout; + const UINT32 keyboard_layout; /** - * FreeRDP keyboard type definition. + * Keyboard type definition. * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ - const UINT32 freerdp_keyboard_type; + const UINT32 keyboard_type; /** - * FreeRDP keyboard subtype definition. + * Keyboard subtype definition. * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ - const UINT32 freerdp_keyboard_subtype; + const UINT32 keyboard_subtype; /** - * FreeRDP keyboard number of function keys. + * Keyboard number of function keys. * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype */ - const UINT32 freerdp_keyboard_function_key; + const UINT32 keyboard_function_key; }; diff --git a/src/protocols/rdp/keymaps/generate.pl b/src/protocols/rdp/keymaps/generate.pl index fe2152ca..5c1ed079 100755 --- a/src/protocols/rdp/keymaps/generate.pl +++ b/src/protocols/rdp/keymaps/generate.pl @@ -55,10 +55,10 @@ for my $filename (@ARGV) { my $content = ""; my $parent = ""; my $layout_name = ""; - my $freerdp = ""; - my $freerdp_keyboard_type = ""; - my $freerdp_keyboard_subtype = ""; - my $freerdp_keyboard_function_key = ""; + my $keyboard_layout = ""; + my $keyboard_type = ""; + my $keyboard_subtype = ""; + my $keyboard_function_key = ""; # Parse file open INPUT, '<', "$filename"; @@ -80,24 +80,24 @@ for my $filename (@ARGV) { $parent = keymap_symbol($name); } - # FreeRDP equiv + # FreeRDP equiv keyboard layout elsif ((my $name) = m/^\s*freerdp\s+"(.*)"\s*(?:#.*)?$/) { - $freerdp = $name; + $keyboard_layout = $name; } - # FreeRDP keyboard type - elsif ((my $name) = m/^\s*freerdp_keyboard_type\s+"(.*)"\s*(?:#.*)?$/) { - $freerdp_keyboard_type = $name; + # keyboard type + elsif ((my $name) = m/^\s*keyboard_type\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_type = $name; } - # FreeRDP keyboard subtype - elsif ((my $name) = m/^\s*freerdp_keyboard_subtype\s+"(.*)"\s*(?:#.*)?$/) { - $freerdp_keyboard_subtype = $name; + # keyboard subtype + elsif ((my $name) = m/^\s*keyboard_subtype\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_subtype = $name; } - # FreeRDP keyboard function key - elsif ((my $name) = m/^\s*freerdp_keyboard_function_key\s+"(.*)"\s*(?:#.*)?$/) { - $freerdp_keyboard_function_key = $name; + # keyboard function key + elsif ((my $name) = m/^\s*keyboard_function_key\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_function_key = $name; } @@ -268,21 +268,21 @@ for my $filename (@ARGV) { print OUTPUT " .parent = &$parent,\n"; } - # FreeRDP layout (if any) - if ($freerdp) { - print OUTPUT " .freerdp_keyboard_layout = $freerdp,\n"; + # Keyboard layout (if any) + if ($keyboard_layout) { + print OUTPUT " .keyboard_layout = $keyboard_layout,\n"; } - # FreeRDP keyboard type (if any) - if ($freerdp_keyboard_type) { - print OUTPUT " .freerdp_keyboard_type = $freerdp_keyboard_type,\n"; + # Keyboard type (if any) + if ($keyboard_type) { + print OUTPUT " .keyboard_type = $keyboard_type,\n"; } - # FreeRDP layout (if any) - if ($freerdp_keyboard_subtype) { - print OUTPUT " .freerdp_keyboard_subtype = $freerdp_keyboard_subtype,\n"; + # Keyboard subtype (if any) + if ($keyboard_subtype) { + print OUTPUT " .keyboard_subtype = $keyboard_subtype,\n"; } - # FreeRDP layout (if any) - if ($freerdp_keyboard_function_key) { - print OUTPUT " .freerdp_keyboard_function_key = $freerdp_keyboard_function_key,\n"; + # Keyboard funtion keys (if any) + if ($keyboard_function_key) { + print OUTPUT " .keyboard_function_key = $keyboard_function_key,\n"; } # Desc footer diff --git a/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap b/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap index 63e0e53a..2b424811 100644 --- a/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap +++ b/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap @@ -19,10 +19,10 @@ parent "base" name "ja-jp-qwerty" -freerdp "KBD_JAPANESE" -freerdp_keyboard_type "KBD_TYPE_JAPANESE" -freerdp_keyboard_subtype "2" -freerdp_keyboard_function_key "12" +keyboard_layout "KBD_JAPANESE" +keyboard_type "KBD_TYPE_JAPANESE" +keyboard_subtype "2" +keyboard_function_key "12" map -shift 0x02..0x0D 0x7D ~ "1234567890-^\" map -shift 0x10..0x1B ~ "qwertyuiop@[" diff --git a/src/protocols/rdp/settings.c b/src/protocols/rdp/settings.c index bcb172a9..ce2b2018 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -1188,15 +1188,15 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->DesktopWidth = guac_settings->width; rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_rdp_strdup(guac_settings->initial_program); - rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; - if (guac_settings->server_layout->freerdp_keyboard_type != 0) { - rdp_settings->KeyboardType = guac_settings->server_layout->freerdp_keyboard_type; + rdp_settings->KeyboardLayout = guac_settings->server_layout->keyboard_layout; + if (guac_settings->server_layout->keyboard_type != 0) { + rdp_settings->KeyboardType = guac_settings->server_layout->keyboard_type; } - if (guac_settings->server_layout->freerdp_keyboard_subtype != 0) { - rdp_settings->KeyboardSubType = guac_settings->server_layout->freerdp_keyboard_subtype; + if (guac_settings->server_layout->keyboard_subtype != 0) { + rdp_settings->KeyboardSubType = guac_settings->server_layout->keyboard_subtype; } - if (guac_settings->server_layout->freerdp_keyboard_function_key != 0) { - rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->freerdp_keyboard_function_key; + if (guac_settings->server_layout->keyboard_function_key != 0) { + rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->keyboard_function_key; } /* Performance flags */