diff --git a/apple/common/apple_input.c b/apple/common/apple_input.c index 3313cffe3f..bfabbe5a24 100644 --- a/apple/common/apple_input.c +++ b/apple/common/apple_input.c @@ -49,8 +49,63 @@ const unsigned char MAC_NATIVE_TO_HID[128] = { // Main thread interface static bool icade_enabled; +static bool small_keyboard_enabled; +static bool small_keyboard_active; static uint32_t icade_buttons; +static bool handle_small_keyboard(unsigned* code, bool down) +{ + static const struct { uint8_t orig; uint8_t mod; } mapping_def[] = + { + { KEY_Grave, KEY_Escape }, { KEY_1, KEY_F1 }, + { KEY_2, KEY_F2 }, { KEY_3, KEY_F3 }, + { KEY_4, KEY_F4 }, { KEY_5, KEY_F5 }, + { KEY_6, KEY_F6 }, { KEY_7, KEY_F7 }, + { KEY_8, KEY_F8 }, { KEY_9, KEY_F9 }, + { KEY_0, KEY_F10 }, { KEY_Minus, KEY_F11 }, + { KEY_Equals, KEY_F12 }, { KEY_Up, KEY_PageUp }, + { KEY_Down, KEY_PageDown }, { KEY_Left, KEY_Home }, + { KEY_Right, KEY_End }, { KEY_Q, KP_7 }, + { KEY_W, KP_8 }, { KEY_E, KP_9 }, + { KEY_A, KP_4 }, { KEY_S, KP_5 }, + { KEY_D, KP_6 }, { KEY_Z, KP_1 }, + { KEY_X, KP_2 }, { KEY_C, KP_3 }, + { 0 } + }; + + static uint8_t mapping[128]; + static bool map_initialized; + + if (!map_initialized) + { + for (int i = 0; mapping_def[i].orig; i ++) + mapping[mapping_def[i].orig] = mapping_def[i].mod; + map_initialized = true; + } + + if (*code == KEY_RightShift) + { + small_keyboard_active = down; + *code = 0; + return true; + } + + unsigned translated_code = (*code < 128) ? mapping[*code] : 0; + + // Allow old keys to be released + if (!down && g_current_input_data.keys[*code]) + return false; + + if ((!down && g_current_input_data.keys[translated_code]) || + small_keyboard_active) + { + *code = translated_code; + return true; + } + + return false; +} + static void handle_icade_event(unsigned keycode) { static const struct @@ -86,6 +141,11 @@ void apple_input_enable_icade(bool on) icade_buttons = 0; } +void apple_input_enable_small_keyboard(bool on) +{ + small_keyboard_enabled = on; +} + uint32_t apple_input_get_icade_buttons(void) { return icade_enabled ? icade_buttons : 0; @@ -106,9 +166,14 @@ void apple_input_keyboard_event(bool down, unsigned code, uint32_t character, ui return; } - if (code < MAX_KEYS) - g_current_input_data.keys[code] = down; + if (small_keyboard_enabled && handle_small_keyboard(&code, down)) + character = 0; + + if (code == 0 || code >= MAX_KEYS) + return; + g_current_input_data.keys[code] = down; + enum { NSAlphaShiftKeyMask = 1 << 16, diff --git a/apple/common/apple_input.h b/apple/common/apple_input.h index b8f75c19c8..2535f95f5f 100644 --- a/apple/common/apple_input.h +++ b/apple/common/apple_input.h @@ -71,6 +71,7 @@ extern apple_input_data_t g_polled_input_data; // Main thread only void apple_input_enable_icade(bool on); +void apple_input_enable_small_keyboard(bool on); uint32_t apple_input_get_icade_buttons(void); void apple_input_reset_icade_buttons(void); void apple_input_keyboard_event(bool down, unsigned code, uint32_t character, uint32_t mod); diff --git a/apple/iOS/platform.m b/apple/iOS/platform.m index d095311685..1f04da40b4 100644 --- a/apple/iOS/platform.m +++ b/apple/iOS/platform.m @@ -44,6 +44,7 @@ int get_ios_version_major(void) void ios_set_bluetooth_mode(NSString* mode) { + apple_input_enable_small_keyboard([mode isEqualToString:@"small_keyboard"]); apple_input_enable_icade([mode isEqualToString:@"icade"]); btstack_set_poweron([mode isEqualToString:@"btstack"]); } @@ -71,9 +72,9 @@ const void* apple_get_frontend_settings(void) // Set ios_btmode options based on runtime environment if (btstack_try_load()) - settings[4].values = "none|icade|keyboard|btstack"; + settings[4].values = "icade|keyboard|small_keyboard|btstack"; else - settings[4].values = "none|icade|keyboard"; + settings[4].values = "icade|keyboard|small_keyboard"; settings[5] = setting_data_string_setting(ST_STRING, "ios_orientations", "Screen Orientations", apple_frontend_settings.orientations, sizeof(apple_frontend_settings.orientations), "both");