diff --git a/client/common/cmdline.c b/client/common/cmdline.c index d04eb05b9..c20db6e03 100644 --- a/client/common/cmdline.c +++ b/client/common/cmdline.c @@ -62,23 +62,30 @@ static BOOL freerdp_client_print_codepages(const char* arg) { - size_t count = 0, x; + size_t count = 0; DWORD column = 2; const char* filter = NULL; - char buffer[80]; RDP_CODEPAGE* pages; if (arg) - filter = strchr(arg, ',') + 1; + { + filter = strchr(arg, ','); + if (!filter) + filter = arg; + else + filter++; + } pages = freerdp_keyboard_get_matching_codepages(column, filter, &count); if (!pages) return TRUE; printf("%-10s %-8s %-60s %-36s %-48s\n", "", "", "", "", ""); - for (x = 0; x < count; x++) + for (size_t x = 0; x < count; x++) { const RDP_CODEPAGE* page = &pages[x]; + char buffer[80] = { 0 }; + if (strnlen(page->subLanguageSymbol, ARRAYSIZE(page->subLanguageSymbol)) > 0) _snprintf(buffer, sizeof(buffer), "[%s|%s]", page->primaryLanguageSymbol, page->subLanguageSymbol); @@ -1210,59 +1217,41 @@ BOOL freerdp_set_connection_type(rdpSettings* settings, UINT32 type) return TRUE; } -static int freerdp_map_keyboard_layout_name_to_id(char* name) +static UINT32 freerdp_get_keyboard_layout_for_type(const char* name, DWORD type) { - int i; - int id = 0; - RDP_KEYBOARD_LAYOUT* layouts; - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); + size_t count = 0, x; + RDP_KEYBOARD_LAYOUT* layouts = + freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD, &count); - if (!layouts) - return -1; + if (!layouts || (count == 0)) + return FALSE; - for (i = 0; layouts[i].code; i++) + for (x = 0; x < count; x++) { - if (_stricmp(layouts[i].name, name) == 0) - id = (int)layouts[i].code; + const RDP_KEYBOARD_LAYOUT* layout = &layouts[x]; + if (_stricmp(layout->name, name) == 0) + { + return layout->code; + } } - freerdp_keyboard_layouts_free(layouts); + freerdp_keyboard_layouts_free(layouts, count); + return 0; +} - if (id) - return id; +static UINT32 freerdp_map_keyboard_layout_name_to_id(const char* name) +{ + size_t x; + const UINT32 variants[] = { RDP_KEYBOARD_LAYOUT_TYPE_STANDARD, RDP_KEYBOARD_LAYOUT_TYPE_VARIANT, + RDP_KEYBOARD_LAYOUT_TYPE_IME }; - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); - - if (!layouts) - return -1; - - for (i = 0; layouts[i].code; i++) + for (x = 0; x < ARRAYSIZE(variants); x++) { - if (_stricmp(layouts[i].name, name) == 0) - id = (int)layouts[i].code; + UINT32 rc = freerdp_get_keyboard_layout_for_type(name, variants[x]); + if (rc > 0) + return rc; } - freerdp_keyboard_layouts_free(layouts); - - if (id) - return id; - - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME); - - if (!layouts) - return -1; - - for (i = 0; layouts[i].code; i++) - { - if (_stricmp(layouts[i].name, name) == 0) - id = (int)layouts[i].code; - } - - freerdp_keyboard_layouts_free(layouts); - - if (id) - return id; - return 0; } @@ -1430,6 +1419,90 @@ int freerdp_client_settings_command_line_status_print(rdpSettings* settings, int return freerdp_client_settings_command_line_status_print_ex(settings, status, argc, argv, NULL); } +static void freerdp_client_print_keyboard_type_list(const char* msg, DWORD type) +{ + + size_t x, count = 0; + RDP_KEYBOARD_LAYOUT* layouts; + layouts = freerdp_keyboard_get_layouts(type, &count); + + printf("\n%s\n", msg); + + for (x = 0; x < count; x++) + { + const RDP_KEYBOARD_LAYOUT* layout = &layouts[x]; + printf("0x%08" PRIX32 "\t%s\n", layout->code, layout->name); + } + + freerdp_keyboard_layouts_free(layouts, count); +} + +static void freerdp_client_print_keyboard_list(void) +{ + freerdp_client_print_keyboard_type_list("Keyboard Layouts", RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); + freerdp_client_print_keyboard_type_list("Keyboard Layout Variants", + RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); + freerdp_client_print_keyboard_type_list("Keyboard Layout Variants", + RDP_KEYBOARD_LAYOUT_TYPE_IME); +} + +static void freerdp_client_print_tune_list(const rdpSettings* settings) +{ + size_t x; + SSIZE_T type = 0; + + printf("%s\t%50s\t%s\t%s", "", "", "", "\n"); + for (x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++) + { + const char* name = freerdp_settings_get_name_for_key(x); + type = freerdp_settings_get_type_for_key(x); + + switch (type) + { + case RDP_SETTINGS_TYPE_BOOL: + printf("%" PRIuz "\t%50s\tBOOL\t%s\n", x, name, + freerdp_settings_get_bool(settings, x) ? "TRUE" : "FALSE"); + break; + case RDP_SETTINGS_TYPE_UINT16: + printf("%" PRIuz "\t%50s\tUINT16\t%" PRIu16 "\n", x, name, + freerdp_settings_get_uint16(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT16: + printf("%" PRIuz "\t%50s\tINT16\t%" PRId16 "\n", x, name, + freerdp_settings_get_int16(settings, x)); + break; + case RDP_SETTINGS_TYPE_UINT32: + printf("%" PRIuz "\t%50s\tUINT32\t%" PRIu32 "\n", x, name, + freerdp_settings_get_uint32(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT32: + printf("%" PRIuz "\t%50s\tINT32\t%" PRId32 "\n", x, name, + freerdp_settings_get_int32(settings, x)); + break; + case RDP_SETTINGS_TYPE_UINT64: + printf("%" PRIuz "\t%50s\tUINT64\t%" PRIu64 "\n", x, name, + freerdp_settings_get_uint64(settings, x)); + break; + case RDP_SETTINGS_TYPE_INT64: + printf("%" PRIuz "\t%50s\tINT64\t%" PRId64 "\n", x, name, + freerdp_settings_get_int64(settings, x)); + break; + case RDP_SETTINGS_TYPE_STRING: + printf("%" PRIuz "\t%50s\tSTRING\t%s" + "\n", + x, name, freerdp_settings_get_string(settings, x)); + break; + case RDP_SETTINGS_TYPE_POINTER: + printf("%" PRIuz "\t%50s\tPOINTER\t%p" + "\n", + x, name, freerdp_settings_get_pointer(settings, x)); + break; + default: + break; + } + } +} + int freerdp_client_settings_command_line_status_print_ex(rdpSettings* settings, int status, int argc, char** argv, const COMMAND_LINE_ARGUMENT_A* custom) @@ -1455,6 +1528,7 @@ int freerdp_client_settings_command_line_status_print_ex(rdpSettings* settings, CommandLineParseArgumentsA(argc, argv, largs, 0x112, NULL, NULL, NULL); arg = CommandLineFindArgumentA(largs, "kbd-lang-list"); + WINPR_ASSERT(arg); if (arg->Flags & COMMAND_LINE_ARGUMENT_PRESENT) { @@ -1462,39 +1536,15 @@ int freerdp_client_settings_command_line_status_print_ex(rdpSettings* settings, } arg = CommandLineFindArgumentA(largs, "kbd-list"); + WINPR_ASSERT(arg); if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { - DWORD i; - RDP_KEYBOARD_LAYOUT* layouts; - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD); - // if (!layouts) /* FIXME*/ - printf("\nKeyboard Layouts\n"); - - for (i = 0; layouts[i].code; i++) - printf("0x%08" PRIX32 "\t%s\n", layouts[i].code, layouts[i].name); - - freerdp_keyboard_layouts_free(layouts); - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); - // if (!layouts) /* FIXME*/ - printf("\nKeyboard Layout Variants\n"); - - for (i = 0; layouts[i].code; i++) - printf("0x%08" PRIX32 "\t%s\n", layouts[i].code, layouts[i].name); - - freerdp_keyboard_layouts_free(layouts); - layouts = freerdp_keyboard_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_IME); - // if (!layouts) /* FIXME*/ - printf("\nKeyboard Input Method Editors (IMEs)\n"); - - for (i = 0; layouts[i].code; i++) - printf("0x%08" PRIX32 "\t%s\n", layouts[i].code, layouts[i].name); - - freerdp_keyboard_layouts_free(layouts); - printf("\n"); + freerdp_client_print_keyboard_list(); } arg = CommandLineFindArgumentA(largs, "monitor-list"); + WINPR_ASSERT(arg); if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { @@ -1502,12 +1552,15 @@ int freerdp_client_settings_command_line_status_print_ex(rdpSettings* settings, } arg = CommandLineFindArgumentA(largs, "smartcard-list"); + WINPR_ASSERT(arg); + if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { freerdp_smartcard_list(settings); } arg = CommandLineFindArgumentA(largs, "kbd-scancode-list"); + WINPR_ASSERT(arg); if (arg->Flags & COMMAND_LINE_VALUE_PRESENT) { @@ -2079,10 +2132,6 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, free(ptr.p); } } - CommandLineSwitchCase(arg, "monitor-list") - { - settings->ListMonitors = enable; - } CommandLineSwitchCase(arg, "t") { if (!freerdp_settings_set_string(settings, FreeRDP_WindowTitle, arg->Value)) @@ -2178,9 +2227,9 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, if (!value_to_int(arg->Value, &val, 1, UINT32_MAX)) { - const int rc = freerdp_map_keyboard_layout_name_to_id(arg->Value); + const UINT32 rc = freerdp_map_keyboard_layout_name_to_id(arg->Value); - if (rc <= 0) + if (rc == 0) { WLog_ERR(TAG, "Could not identify keyboard layout: %s", arg->Value); WLog_ERR(TAG, "Use /kbd-list to list available layouts"); @@ -3555,59 +3604,7 @@ int freerdp_client_settings_parse_command_line_arguments(rdpSettings* settings, } CommandLineSwitchCase(arg, "tune-list") { - size_t x; - SSIZE_T type = 0; - - printf("%s\t%50s\t%s\t%s", "", "", "", "\n"); - for (x = 0; x < FreeRDP_Settings_StableAPI_MAX; x++) - { - const char* name = freerdp_settings_get_name_for_key(x); - type = freerdp_settings_get_type_for_key(x); - - switch (type) - { - case RDP_SETTINGS_TYPE_BOOL: - printf("%" PRIuz "\t%50s\tBOOL\t%s\n", x, name, - freerdp_settings_get_bool(settings, x) ? "TRUE" : "FALSE"); - break; - case RDP_SETTINGS_TYPE_UINT16: - printf("%" PRIuz "\t%50s\tUINT16\t%" PRIu16 "\n", x, name, - freerdp_settings_get_uint16(settings, x)); - break; - case RDP_SETTINGS_TYPE_INT16: - printf("%" PRIuz "\t%50s\tINT16\t%" PRId16 "\n", x, name, - freerdp_settings_get_int16(settings, x)); - break; - case RDP_SETTINGS_TYPE_UINT32: - printf("%" PRIuz "\t%50s\tUINT32\t%" PRIu32 "\n", x, name, - freerdp_settings_get_uint32(settings, x)); - break; - case RDP_SETTINGS_TYPE_INT32: - printf("%" PRIuz "\t%50s\tINT32\t%" PRId32 "\n", x, name, - freerdp_settings_get_int32(settings, x)); - break; - case RDP_SETTINGS_TYPE_UINT64: - printf("%" PRIuz "\t%50s\tUINT64\t%" PRIu64 "\n", x, name, - freerdp_settings_get_uint64(settings, x)); - break; - case RDP_SETTINGS_TYPE_INT64: - printf("%" PRIuz "\t%50s\tINT64\t%" PRId64 "\n", x, name, - freerdp_settings_get_int64(settings, x)); - break; - case RDP_SETTINGS_TYPE_STRING: - printf("%" PRIuz "\t%50s\tSTRING\t%s" - "\n", - x, name, freerdp_settings_get_string(settings, x)); - break; - case RDP_SETTINGS_TYPE_POINTER: - printf("%" PRIuz "\t%50s\tPOINTER\t%p" - "\n", - x, name, freerdp_settings_get_pointer(settings, x)); - break; - default: - break; - } - } + freerdp_client_print_tune_list(settings); return COMMAND_LINE_STATUS_PRINT; } CommandLineSwitchDefault(arg) diff --git a/client/common/cmdline.h b/client/common/cmdline.h index bfa0e1ea1..8a4c06ee2 100644 --- a/client/common/cmdline.h +++ b/client/common/cmdline.h @@ -401,7 +401,7 @@ static const COMMAND_LINE_ARGUMENT_A global_cmd_args[] = { "Alt+Ctrl+Enter to toggle fullscreen" }, { "tune", COMMAND_LINE_VALUE_REQUIRED, ",", "", NULL, -1, NULL, "[experimental] directly manipulate freerdp settings, use with extreme caution!" }, - { "tune-list", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, + { "tune-list", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT, NULL, NULL, NULL, -1, NULL, "Print options allowed for /tune" }, { "u", COMMAND_LINE_VALUE_REQUIRED, "[[\\]|[@]]", NULL, NULL, -1, NULL, "Username" },