From da87247d61e976d084e3968d0b4d9adb426c9404 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Thu, 7 Nov 2019 19:31:26 +0100 Subject: [PATCH] Added KeyboardCodePage option Thanks to @byteboon for the hint. --- client/common/cmdline.c | 13 +++++++++++++ client/common/cmdline.h | 2 ++ include/freerdp/settings.h | 4 +++- libfreerdp/common/settings_getters.c | 7 +++++++ libfreerdp/core/info.c | 4 ++-- libfreerdp/core/test/settings_property_lists.h | 1 + 6 files changed, 28 insertions(+), 3 deletions(-) diff --git a/client/common/cmdline.c b/client/common/cmdline.c index 71b8c2a..43e7c91 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -2003,6 +2003,19 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, settings->KeyboardLayout = (UINT32)val; } + CommandLineSwitchCase(arg, "kbd-lang") + { + LONGLONG val; + + if (!value_to_int(arg->Value, &val, 1, UINT32_MAX)) + { + WLog_ERR(TAG, "Could not identify keyboard active language %s", arg->Value); + WLog_ERR(TAG, "Use /kbd-list to list available layouts"); + return COMMAND_LINE_ERROR_UNEXPECTED_VALUE; + } + + settings->KeyboardCodePage = (UINT32)val; + } CommandLineSwitchCase(arg, "kbd-type") { LONGLONG val; diff --git a/client/common/cmdline.h b/client/common/cmdline.h index e47a264..a3c25a0 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -172,6 +172,8 @@ static const COMMAND_LINE_ARGUMENT_A args[] = { #endif { "kbd", COMMAND_LINE_VALUE_REQUIRED, "0x or ", NULL, NULL, -1, NULL, "Keyboard layout" }, + { "kbd-lang", COMMAND_LINE_VALUE_REQUIRED, "0x", NULL, NULL, -1, NULL, + "Keyboard active language identifier" }, { "kbd-fn-key", COMMAND_LINE_VALUE_REQUIRED, "", NULL, NULL, -1, NULL, "Function key value" }, { "kbd-list", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT, NULL, NULL, NULL, -1, NULL, diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index fcc749f..1f85a08 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -796,6 +796,7 @@ typedef struct _RDPDR_PARALLEL RDPDR_PARALLEL; #define FreeRDP_BitmapCacheV2CellInfo (2502) #define FreeRDP_ColorPointerFlag (2560) #define FreeRDP_PointerCacheSize (2561) +#define FreeRDP_KeyboardCodePage (2623) #define FreeRDP_KeyboardLayout (2624) #define FreeRDP_KeyboardType (2625) #define FreeRDP_KeyboardSubType (2626) @@ -1320,9 +1321,10 @@ struct rdp_settings /* Pointer Capabilities */ ALIGN64 BOOL ColorPointerFlag; /* 2560 */ ALIGN64 UINT32 PointerCacheSize; /* 2561 */ - UINT64 padding2624[2624 - 2562]; /* 2562 */ + UINT64 padding2624[2623 - 2562]; /* 2562 */ /* Input Capabilities */ + ALIGN64 UINT32 KeyboardCodePage; /* 2623 */ ALIGN64 UINT32 KeyboardLayout; /* 2624 */ ALIGN64 UINT32 KeyboardType; /* 2625 */ ALIGN64 UINT32 KeyboardSubType; /* 2626 */ diff --git a/libfreerdp/common/settings_getters.c b/libfreerdp/common/settings_getters.c index d1e0d74..7972dee 100644 --- a/libfreerdp/common/settings_getters.c +++ b/libfreerdp/common/settings_getters.c @@ -1453,6 +1453,9 @@ UINT32 freerdp_settings_get_uint32(rdpSettings* settings, size_t id) case FreeRDP_PointerCacheSize: return settings->PointerCacheSize; + case FreeRDP_KeyboardCodePage: + return settings->KeyboardCodePage; + case FreeRDP_KeyboardLayout: return settings->KeyboardLayout; @@ -1857,6 +1860,10 @@ BOOL freerdp_settings_set_uint32(rdpSettings* settings, size_t id, UINT32 val) settings->PointerCacheSize = val; break; + case FreeRDP_KeyboardCodePage: + settings->KeyboardCodePage = val; + break; + case FreeRDP_KeyboardLayout: settings->KeyboardLayout = val; break; diff --git a/libfreerdp/core/info.c b/libfreerdp/core/info.c index efc4889..87870a6 100644 --- a/libfreerdp/core/info.c +++ b/libfreerdp/core/info.c @@ -491,7 +491,7 @@ static BOOL rdp_read_info_packet(rdpRdp* rdp, wStream* s) if (Stream_GetRemainingLength(s) < 18) return FALSE; - Stream_Seek_UINT32(s); /* CodePage (4 bytes ) */ + Stream_Read_UINT32(s, settings->KeyboardCodePage); /* CodePage (4 bytes ) */ Stream_Read_UINT32(s, flags); /* flags (4 bytes) */ settings->AudioCapture = ((flags & INFO_AUDIOCAPTURE) ? TRUE : FALSE); settings->AudioPlayback = ((flags & INFO_NOAUDIOPLAYBACK) ? FALSE : TRUE); @@ -891,7 +891,7 @@ static BOOL rdp_write_info_packet(rdpRdp* rdp, wStream* s) /* excludes (!) the length of the mandatory null terminator */ cbWorkingDir = cbWorkingDir >= 2 ? cbWorkingDir - 2 : cbWorkingDir; - Stream_Write_UINT32(s, 0); /* CodePage (4 bytes) */ + Stream_Write_UINT32(s, settings->KeyboardCodePage); /* CodePage (4 bytes) */ Stream_Write_UINT32(s, flags); /* flags (4 bytes) */ Stream_Write_UINT16(s, cbDomain); /* cbDomain (2 bytes) */ Stream_Write_UINT16(s, cbUserName); /* cbUserName (2 bytes) */ diff --git a/libfreerdp/core/test/settings_property_lists.h b/libfreerdp/core/test/settings_property_lists.h index f762927..0db1631 100644 --- a/libfreerdp/core/test/settings_property_lists.h +++ b/libfreerdp/core/test/settings_property_lists.h @@ -247,6 +247,7 @@ static const size_t uint32_list_indices[] = { FreeRDP_BitmapCacheVersion, FreeRDP_BitmapCacheV2NumCells, FreeRDP_PointerCacheSize, + FreeRDP_KeyboardCodePage, FreeRDP_KeyboardLayout, FreeRDP_KeyboardType, FreeRDP_KeyboardSubType, -- 2.7.4