diff --git a/src/protocols/rdp/keymap.h b/src/protocols/rdp/keymap.h index 121b85f3..d0fa580b 100644 --- a/src/protocols/rdp/keymap.h +++ b/src/protocols/rdp/keymap.h @@ -177,11 +177,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; + + /** + * Keyboard type definition. + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype + */ + const UINT32 keyboard_type; + + /** + * Keyboard subtype definition. + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype + */ + const UINT32 keyboard_subtype; + + /** + * Keyboard number of function keys. + * See https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getkeyboardtype + */ + const UINT32 keyboard_function_key; }; diff --git a/src/protocols/rdp/keymaps/generate.pl b/src/protocols/rdp/keymaps/generate.pl index 446de9a2..8a7f8735 100755 --- a/src/protocols/rdp/keymaps/generate.pl +++ b/src/protocols/rdp/keymaps/generate.pl @@ -55,7 +55,10 @@ for my $filename (@ARGV) { my $content = ""; my $parent = ""; my $layout_name = ""; - my $freerdp = ""; + my $keyboard_layout = ""; + my $keyboard_type = ""; + my $keyboard_subtype = ""; + my $keyboard_function_key = ""; # Parse file open INPUT, '<', "$filename"; @@ -77,10 +80,26 @@ 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; } + + # keyboard type + elsif ((my $name) = m/^\s*keyboard_type\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_type = $name; + } + + # keyboard subtype + elsif ((my $name) = m/^\s*keyboard_subtype\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_subtype = $name; + } + + # keyboard function key + elsif ((my $name) = m/^\s*keyboard_function_key\s+"(.*)"\s*(?:#.*)?$/) { + $keyboard_function_key = $name; + } + # Map elsif ((my $range, my $onto) = @@ -241,9 +260,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"; + } + # Keyboard type (if any) + if ($keyboard_type) { + print OUTPUT " .keyboard_type = $keyboard_type,\n"; + } + # Keyboard subtype (if any) + if ($keyboard_subtype) { + print OUTPUT " .keyboard_subtype = $keyboard_subtype,\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 305cb73d..a5dea246 100644 --- a/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap +++ b/src/protocols/rdp/keymaps/ja_jp_qwerty.keymap @@ -19,7 +19,10 @@ parent "base" name "ja-jp-qwerty" -freerdp "KBD_JAPANESE" +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 c4292417..6f9028f5 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -1783,7 +1783,16 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->DesktopWidth = guac_settings->width; rdp_settings->DesktopHeight = guac_settings->height; rdp_settings->AlternateShell = guac_strdup(guac_settings->initial_program); - rdp_settings->KeyboardLayout = guac_settings->server_layout->freerdp_keyboard_layout; + 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->keyboard_subtype != 0) { + rdp_settings->KeyboardSubType = guac_settings->server_layout->keyboard_subtype; + } + if (guac_settings->server_layout->keyboard_function_key != 0) { + rdp_settings->KeyboardFunctionKey = guac_settings->server_layout->keyboard_function_key; + } /* Performance flags */ /* Explicitly set flag value */