From 77c0cc8b5fab28a4c1437d03fe231162e83814e5 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 29 Feb 2020 23:07:14 -0500 Subject: [PATCH] Provisionally adds logical keyboard support to SDL. --- OSBindings/SDL/main.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/OSBindings/SDL/main.cpp b/OSBindings/SDL/main.cpp index dec48042a..9bbfaad5d 100644 --- a/OSBindings/SDL/main.cpp +++ b/OSBindings/SDL/main.cpp @@ -469,7 +469,7 @@ int main(int argc, char *argv[]) { ParsedArguments arguments = parse_arguments(argc, argv); // This may be printed either as - const std::string usage_suffix = " [file] [OPTIONS] [--rompath={path to ROMs}] [--speed={speed multiplier, e.g. 1.5}]"; + const std::string usage_suffix = " [file] [OPTIONS] [--rompath={path to ROMs}] [--speed={speed multiplier, e.g. 1.5}] [--logical-keyboard]"; // Print a help message if requested. if(arguments.selections.find("help") != arguments.selections.end() || arguments.selections.find("h") != arguments.selections.end()) { @@ -610,6 +610,9 @@ int main(int argc, char *argv[]) { } } + // Check whether a 'logical' keyboard has been requested. + const bool logical_keyboard = arguments.selections.find("logical_keyboard") != arguments.selections.end(); + // Wire up the best-effort updater, its delegate, and the speaker delegate. machine_runner.machine = machine.get(); machine_runner.machine_mutex = &machine_mutex; @@ -890,14 +893,21 @@ int main(int argc, char *argv[]) { const bool is_pressed = event.type == SDL_KEYDOWN; if(keyboard_machine) { + // Grab the key's symbol. + char key_value = '\0'; + const char *key_name = SDL_GetKeyName(event.key.keysym.sym); + if(key_name[0] >= 0) key_value = key_name[0]; + + // If a logical mapping was selected and a symbol was found, type it. + if(logical_keyboard && key_value != '\0') { + keyboard_machine->type_string(string); + break; + } + + // Otherwise, supply as a normal keypress. Inputs::Keyboard::Key key = Inputs::Keyboard::Key::Space; if(!KeyboardKeyForSDLScancode(event.key.keysym.scancode, key)) break; - if(keyboard_machine->get_keyboard().observed_keys().find(key) != keyboard_machine->get_keyboard().observed_keys().end()) { - char key_value = '\0'; - const char *key_name = SDL_GetKeyName(event.key.keysym.sym); - if(key_name[0] >= 0) key_value = key_name[0]; - keyboard_machine->get_keyboard().set_key_pressed(key, key_value, is_pressed); break; }