diff --git a/apple/common/RAGameView.m b/apple/common/RAGameView.m index 64ab8d0047..67c346b914 100644 --- a/apple/common/RAGameView.m +++ b/apple/common/RAGameView.m @@ -166,10 +166,24 @@ static bool g_is_syncing = true; [g_view addSubview:g_pause_indicator_view]; self.view = g_view; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showPauseIndicator) name:UIApplicationWillEnterForegroundNotification object:nil]; return self; } // Pause Menus +- (void)viewDidAppear:(BOOL)animated +{ + [self showPauseIndicator]; +} + +- (void)showPauseIndicator +{ + g_pause_indicator_view.alpha = 1.0f; + [NSObject cancelPreviousPerformRequestsWithTarget:g_instance]; + [g_instance performSelector:@selector(hidePauseButton) withObject:g_instance afterDelay:3.0f]; +} + - (void)viewWillLayoutSubviews { UIInterfaceOrientation orientation = self.interfaceOrientation; @@ -419,16 +433,8 @@ static RAScreen* get_chosen_screen() bool apple_gfx_ctx_init(void) { // Make sure the view was created - [RAGameView get]; - -#ifdef IOS // Show pause button for a few seconds, so people know it's there - g_pause_indicator_view.alpha = 1.0f; - [NSObject cancelPreviousPerformRequestsWithTarget:g_instance]; - [g_instance performSelector:@selector(hidePauseButton) withObject:g_instance afterDelay:3.0f]; -#endif - + [RAGameView get]; g_initialized = true; - return true; } diff --git a/input/overlay.c b/input/overlay.c index eead9243c8..490b01e7e4 100644 --- a/input/overlay.c +++ b/input/overlay.c @@ -35,7 +35,8 @@ enum overlay_type { OVERLAY_TYPE_BUTTONS = 0, OVERLAY_TYPE_ANALOG_LEFT, - OVERLAY_TYPE_ANALOG_RIGHT + OVERLAY_TYPE_ANALOG_RIGHT, + OVERLAY_TYPE_KEYBOARD }; struct overlay_desc @@ -181,6 +182,162 @@ static unsigned input_str_to_bind(const char *str) return RARCH_BIND_LIST_END; } +static const struct str_to_bind_map str_to_keyboard[] = { + { "retrok_backspace", RETROK_BACKSPACE }, + { "retrok_tab", RETROK_TAB }, + { "retrok_clear", RETROK_CLEAR }, + { "retrok_return", RETROK_RETURN }, + { "retrok_pause", RETROK_PAUSE }, + { "retrok_escape", RETROK_ESCAPE }, + { "retrok_space", RETROK_SPACE }, + { "retrok_exclaim", RETROK_EXCLAIM }, + { "retrok_quotedbl", RETROK_QUOTEDBL }, + { "retrok_hash", RETROK_HASH }, + { "retrok_dollar", RETROK_DOLLAR }, + { "retrok_ampersand", RETROK_AMPERSAND }, + { "retrok_quote", RETROK_QUOTE }, + { "retrok_leftparen", RETROK_LEFTPAREN }, + { "retrok_rightparen", RETROK_RIGHTPAREN }, + { "retrok_asterisk", RETROK_ASTERISK }, + { "retrok_plus", RETROK_PLUS }, + { "retrok_comma", RETROK_COMMA }, + { "retrok_minus", RETROK_MINUS }, + { "retrok_period", RETROK_PERIOD }, + { "retrok_slash", RETROK_SLASH }, + { "retrok_0", RETROK_0 }, + { "retrok_1", RETROK_1 }, + { "retrok_2", RETROK_2 }, + { "retrok_3", RETROK_3 }, + { "retrok_4", RETROK_4 }, + { "retrok_5", RETROK_5 }, + { "retrok_6", RETROK_6 }, + { "retrok_7", RETROK_7 }, + { "retrok_8", RETROK_8 }, + { "retrok_9", RETROK_9 }, + { "retrok_colon", RETROK_COLON }, + { "retrok_semicolon", RETROK_SEMICOLON }, + { "retrok_less", RETROK_LESS }, + { "retrok_equals", RETROK_EQUALS }, + { "retrok_greater", RETROK_GREATER }, + { "retrok_question", RETROK_QUESTION }, + { "retrok_at", RETROK_AT }, + { "retrok_leftbracket", RETROK_LEFTBRACKET }, + { "retrok_backslash", RETROK_BACKSLASH }, + { "retrok_rightbracket", RETROK_RIGHTBRACKET }, + { "retrok_caret", RETROK_CARET }, + { "retrok_underscore", RETROK_UNDERSCORE }, + { "retrok_backquote", RETROK_BACKQUOTE }, + { "retrok_a", RETROK_a }, + { "retrok_b", RETROK_b }, + { "retrok_c", RETROK_c }, + { "retrok_d", RETROK_d }, + { "retrok_e", RETROK_e }, + { "retrok_f", RETROK_f }, + { "retrok_g", RETROK_g }, + { "retrok_h", RETROK_h }, + { "retrok_i", RETROK_i }, + { "retrok_j", RETROK_j }, + { "retrok_k", RETROK_k }, + { "retrok_l", RETROK_l }, + { "retrok_m", RETROK_m }, + { "retrok_n", RETROK_n }, + { "retrok_o", RETROK_o }, + { "retrok_p", RETROK_p }, + { "retrok_q", RETROK_q }, + { "retrok_r", RETROK_r }, + { "retrok_s", RETROK_s }, + { "retrok_t", RETROK_t }, + { "retrok_u", RETROK_u }, + { "retrok_v", RETROK_v }, + { "retrok_w", RETROK_w }, + { "retrok_x", RETROK_x }, + { "retrok_y", RETROK_y }, + { "retrok_z", RETROK_z }, + { "retrok_delete", RETROK_DELETE }, + + { "retrok_kp0", RETROK_KP0 }, + { "retrok_kp1", RETROK_KP1 }, + { "retrok_kp2", RETROK_KP2 }, + { "retrok_kp3", RETROK_KP3 }, + { "retrok_kp4", RETROK_KP4 }, + { "retrok_kp5", RETROK_KP5 }, + { "retrok_kp6", RETROK_KP6 }, + { "retrok_kp7", RETROK_KP7 }, + { "retrok_kp8", RETROK_KP8 }, + { "retrok_kp9", RETROK_KP9 }, + { "retrok_kp_period", RETROK_KP_PERIOD }, + { "retrok_kp_divide", RETROK_KP_DIVIDE }, + { "retrok_kp_multiply", RETROK_KP_MULTIPLY }, + { "retrok_kp_minus", RETROK_KP_MINUS }, + { "retrok_kp_plus", RETROK_KP_PLUS }, + { "retrok_kp_enter", RETROK_KP_ENTER }, + { "retrok_kp_equals", RETROK_KP_EQUALS }, + + { "retrok_up", RETROK_UP }, + { "retrok_down", RETROK_DOWN }, + { "retrok_right", RETROK_RIGHT }, + { "retrok_left", RETROK_LEFT }, + { "retrok_insert", RETROK_INSERT }, + { "retrok_home", RETROK_HOME }, + { "retrok_end", RETROK_END }, + { "retrok_pageup", RETROK_PAGEUP }, + { "retrok_pagedown", RETROK_PAGEDOWN }, + + { "retrok_f1", RETROK_F1 }, + { "retrok_f2", RETROK_F2 }, + { "retrok_f3", RETROK_F3 }, + { "retrok_f4", RETROK_F4 }, + { "retrok_f5", RETROK_F5 }, + { "retrok_f6", RETROK_F6 }, + { "retrok_f7", RETROK_F7 }, + { "retrok_f8", RETROK_F8 }, + { "retrok_f9", RETROK_F9 }, + { "retrok_f10", RETROK_F10 }, + { "retrok_f11", RETROK_F11 }, + { "retrok_f12", RETROK_F12 }, + { "retrok_f13", RETROK_F13 }, + { "retrok_f14", RETROK_F14 }, + { "retrok_f15", RETROK_F15 }, + + { "retrok_numlock", RETROK_NUMLOCK }, + { "retrok_capslock", RETROK_CAPSLOCK }, + { "retrok_scrollock", RETROK_SCROLLOCK }, + { "retrok_rshift", RETROK_RSHIFT }, + { "retrok_lshift", RETROK_LSHIFT }, + { "retrok_rctrl", RETROK_RCTRL }, + { "retrok_lctrl", RETROK_LCTRL }, + { "retrok_ralt", RETROK_RALT }, + { "retrok_lalt", RETROK_LALT }, + { "retrok_rmeta", RETROK_RMETA }, + { "retrok_lmeta", RETROK_LMETA }, + { "retrok_lsuper", RETROK_LSUPER }, + { "retrok_rsuper", RETROK_RSUPER }, + { "retrok_mode", RETROK_MODE }, + { "retrok_compose", RETROK_COMPOSE }, + + { "retrok_help", RETROK_HELP }, + { "retrok_print", RETROK_PRINT }, + { "retrok_sysreq", RETROK_SYSREQ }, + { "retrok_break", RETROK_BREAK }, + { "retrok_menu", RETROK_MENU }, + { "retrok_power", RETROK_POWER }, + { "retrok_euro", RETROK_EURO }, + { "retrok_undo", RETROK_UNDO }, +}; + +static unsigned input_str_to_keyboard(const char *str) +{ + unsigned i; + for (i = 0; i < ARRAY_SIZE(str_to_keyboard); i++) + { + if (!strcmp(str_to_keyboard[i].str, str)) + return str_to_keyboard[i].bind; + } + + RARCH_ERR("[Overlay] Unknown keyboard key: %s.\n", str); + return RETROK_UNKNOWN; +} + static void input_overlay_scale(struct overlay *overlay, float scale) { size_t i; @@ -322,6 +479,11 @@ static bool input_overlay_load_desc(input_overlay_t *ol, config_file_t *conf, st desc->type = OVERLAY_TYPE_ANALOG_LEFT; else if (strcmp(key, "analog_right") == 0) desc->type = OVERLAY_TYPE_ANALOG_RIGHT; + else if (strstr(key, "retrok_") == key) + { + desc->type = OVERLAY_TYPE_KEYBOARD; + desc->key_mask = input_str_to_keyboard(key); + } else { const char *tmp; @@ -357,7 +519,7 @@ static bool input_overlay_load_desc(input_overlay_t *ol, config_file_t *conf, st goto end; } - if (desc->type != OVERLAY_TYPE_BUTTONS) + if (desc->type == OVERLAY_TYPE_ANALOG_LEFT || desc->type == OVERLAY_TYPE_ANALOG_RIGHT) { if (desc->hitbox != OVERLAY_HITBOX_RADIAL) { @@ -760,6 +922,11 @@ void input_overlay_poll(input_overlay_t *ol, input_overlay_state_t *out, int16_t if (mask & (UINT64_C(1) << RARCH_OVERLAY_NEXT)) ol->next_index = desc->next_index; } + else if (desc->type == OVERLAY_TYPE_KEYBOARD) + { + if (desc->key_mask < RETROK_LAST) + OVERLAY_SET_KEY(out, desc->key_mask); + } else { float x_dist = x - desc->x; diff --git a/input/overlay.h b/input/overlay.h index 0ea51dddb2..fd7cb4f65e 100644 --- a/input/overlay.h +++ b/input/overlay.h @@ -34,8 +34,13 @@ typedef struct input_overlay_state { uint64_t buttons; // This is a bitmask of (1 << key_bind_id). int16_t analog[4]; // Left X, Left Y, Right X, Right Y + uint32_t keys[RETROK_LAST / 32 + 1]; } input_overlay_state_t; +#define OVERLAY_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1) +#define OVERLAY_SET_KEY(state, key) (state)->keys[(key) / 32] |= 1 << ((key) % 32) +#define OVERLAY_CLEAR_KEY(state, key) (state)->keys[(key) / 32] &= ~(1 << ((key) % 32)) + input_overlay_t *input_overlay_new(const char *overlay); void input_overlay_free(input_overlay_t *ol); diff --git a/media/overlays/qwerty/qwerty.cfg b/media/overlays/qwerty/qwerty.cfg new file mode 100644 index 0000000000..d765e18106 --- /dev/null +++ b/media/overlays/qwerty/qwerty.cfg @@ -0,0 +1,107 @@ +overlays = 1 +overlay0_normalized = true +overlay0_full_screen = true +overlay0_descs = 101 +overlay0_overlay = qwerty.png + +overlay0_desc0 = "retrok_escape,0.020833,0.784722,rect,0.020833,0.015625" +overlay0_desc1 = "retrok_f1,0.108796,0.784722,rect,0.020833,0.015625" +overlay0_desc2 = "retrok_f2,0.152778,0.784722,rect,0.020833,0.015625" +overlay0_desc3 = "retrok_f3,0.196759,0.784722,rect,0.020833,0.015625" +overlay0_desc4 = "retrok_f4,0.240741,0.784722,rect,0.020833,0.015625" +overlay0_desc5 = "retrok_f5,0.307870,0.784722,rect,0.020833,0.015625" +overlay0_desc6 = "retrok_f6,0.351852,0.784722,rect,0.020833,0.015625" +overlay0_desc7 = "retrok_f7,0.395833,0.784722,rect,0.020833,0.015625" +overlay0_desc8 = "retrok_f8,0.439815,0.784722,rect,0.020833,0.015625" +overlay0_desc9 = "retrok_f9,0.506944,0.784722,rect,0.020833,0.015625" +overlay0_desc10 = "retrok_f10,0.550926,0.784722,rect,0.020833,0.015625" +overlay0_desc11 = "retrok_f11,0.594907,0.784722,rect,0.020833,0.015625" +overlay0_desc12 = "retrok_f12,0.638889,0.784722,rect,0.020833,0.015625" +overlay0_desc13 = "retrok_print,0.699074,0.784722,rect,0.020833,0.015625" +overlay0_desc14 = "retrok_scrollock,0.743056,0.784722,rect,0.020833,0.015625" +overlay0_desc15 = "retrok_pause,0.787037,0.784722,rect,0.020833,0.015625" +overlay0_desc16 = "retrok_tilde,0.020833,0.852431,rect,0.020833,0.015625" +overlay0_desc17 = "retrok_1,0.064815,0.852431,rect,0.020833,0.015625" +overlay0_desc18 = "retrok_2,0.108796,0.852431,rect,0.020833,0.015625" +overlay0_desc19 = "retrok_3,0.152778,0.852431,rect,0.020833,0.015625" +overlay0_desc20 = "retrok_4,0.196759,0.852431,rect,0.020833,0.015625" +overlay0_desc21 = "retrok_5,0.240741,0.852431,rect,0.020833,0.015625" +overlay0_desc22 = "retrok_6,0.284722,0.852431,rect,0.020833,0.015625" +overlay0_desc23 = "retrok_7,0.328704,0.852431,rect,0.020833,0.015625" +overlay0_desc24 = "retrok_8,0.372685,0.852431,rect,0.020833,0.015625" +overlay0_desc25 = "retrok_9,0.416667,0.852431,rect,0.020833,0.015625" +overlay0_desc26 = "retrok_0,0.460648,0.852431,rect,0.020833,0.015625" +overlay0_desc27 = "retrok_minus,0.504630,0.852431,rect,0.020833,0.015625" +overlay0_desc28 = "retrok_equals,0.548611,0.852431,rect,0.020833,0.015625" +overlay0_desc29 = "retrok_backspace,0.615741,0.852431,rect,0.043981,0.015625" +overlay0_desc30 = "retrok_tab,0.032407,0.885417,rect,0.032407,0.015625" +overlay0_desc31 = "retrok_q,0.087963,0.885417,rect,0.020833,0.015625" +overlay0_desc32 = "retrok_w,0.131944,0.885417,rect,0.020833,0.015625" +overlay0_desc33 = "retrok_e,0.175926,0.885417,rect,0.020833,0.015625" +overlay0_desc34 = "retrok_r,0.219907,0.885417,rect,0.020833,0.015625" +overlay0_desc35 = "retrok_t,0.263889,0.885417,rect,0.020833,0.015625" +overlay0_desc36 = "retrok_y,0.307870,0.885417,rect,0.020833,0.015625" +overlay0_desc37 = "retrok_u,0.351852,0.885417,rect,0.020833,0.015625" +overlay0_desc38 = "retrok_i,0.395833,0.885417,rect,0.020833,0.015625" +overlay0_desc39 = "retrok_o,0.439815,0.885417,rect,0.020833,0.015625" +overlay0_desc40 = "retrok_p,0.483796,0.885417,rect,0.020833,0.015625" +overlay0_desc41 = "retrok_leftbracket,0.527778,0.885417,rect,0.020833,0.015625" +overlay0_desc42 = "retrok_rightbracket,0.571759,0.885417,rect,0.020833,0.015625" +overlay0_desc43 = "retrok_backslash,0.627315,0.885417,rect,0.032407,0.015625" +overlay0_desc44 = "retrok_capslock,0.038194,0.918403,rect,0.038194,0.015625" +overlay0_desc45 = "retrok_a,0.099537,0.918403,rect,0.020833,0.015625" +overlay0_desc46 = "retrok_s,0.143519,0.918403,rect,0.020833,0.015625" +overlay0_desc47 = "retrok_d,0.187500,0.918403,rect,0.020833,0.015625" +overlay0_desc48 = "retrok_f,0.231481,0.918403,rect,0.020833,0.015625" +overlay0_desc49 = "retrok_g,0.275463,0.918403,rect,0.020833,0.015625" +overlay0_desc50 = "retrok_h,0.319444,0.918403,rect,0.020833,0.015625" +overlay0_desc51 = "retrok_j,0.363426,0.918403,rect,0.020833,0.015625" +overlay0_desc52 = "retrok_k,0.407407,0.918403,rect,0.020833,0.015625" +overlay0_desc53 = "retrok_l,0.451389,0.918403,rect,0.020833,0.015625" +overlay0_desc54 = "retrok_semicolon,0.495370,0.918403,rect,0.020833,0.015625" +overlay0_desc55 = "retrok_quote,0.539352,0.918403,rect,0.020833,0.015625" +overlay0_desc56 = "retrok_return,0.611111,0.918403,rect,0.048611,0.015625" +overlay0_desc57 = "retrok_lshift,0.048611,0.951389,rect,0.048611,0.015625" +overlay0_desc58 = "retrok_z,0.120370,0.951389,rect,0.020833,0.015625" +overlay0_desc59 = "retrok_x,0.164352,0.951389,rect,0.020833,0.015625" +overlay0_desc60 = "retrok_c,0.208333,0.951389,rect,0.020833,0.015625" +overlay0_desc61 = "retrok_v,0.252315,0.951389,rect,0.020833,0.015625" +overlay0_desc62 = "retrok_b,0.296296,0.951389,rect,0.020833,0.015625" +overlay0_desc63 = "retrok_n,0.340278,0.951389,rect,0.020833,0.015625" +overlay0_desc64 = "retrok_m,0.384259,0.951389,rect,0.020833,0.015625" +overlay0_desc65 = "retrok_comma,0.428241,0.951389,rect,0.020833,0.015625" +overlay0_desc66 = "retrok_period,0.472222,0.951389,rect,0.020833,0.015625" +overlay0_desc67 = "retrok_slash,0.516204,0.951389,rect,0.020833,0.015625" +overlay0_desc68 = "retrok_rshift,0.599537,0.951389,rect,0.060185,0.015625" +overlay0_desc69 = "retrok_lctrl,0.031250,0.984375,rect,0.031250,0.015625" +overlay0_desc70 = "retrok_lalt,0.142361,0.984375,rect,0.031250,0.015625" +overlay0_desc71 = "retrok_space,0.329861,0.984375,rect,0.153935,0.015625" +overlay0_desc72 = "retrok_ralt,0.517361,0.984375,rect,0.031250,0.015625" +overlay0_desc73 = "retrok_rctrl,0.628472,0.984375,rect,0.031250,0.015625" +overlay0_desc74 = "retrok_insert,0.699074,0.852431,rect,0.020833,0.015625" +overlay0_desc75 = "retrok_home,0.743056,0.852431,rect,0.020833,0.015625" +overlay0_desc76 = "retrok_pageup,0.787037,0.852431,rect,0.020833,0.015625" +overlay0_desc77 = "retrok_delete,0.699074,0.885417,rect,0.020833,0.015625" +overlay0_desc78 = "retrok_end,0.743056,0.885417,rect,0.020833,0.015625" +overlay0_desc79 = "retrok_pagedown,0.787037,0.885417,rect,0.020833,0.015625" +overlay0_desc80 = "retrok_up,0.743056,0.951389,rect,0.020833,0.015625" +overlay0_desc81 = "retrok_left,0.699074,0.984375,rect,0.020833,0.015625" +overlay0_desc82 = "retrok_down,0.743056,0.984375,rect,0.020833,0.015625" +overlay0_desc83 = "retrok_right,0.787037,0.984375,rect,0.020833,0.015625" +overlay0_desc84 = "retrok_numlock,0.847222,0.852431,rect,0.020833,0.015625" +overlay0_desc85 = "retrok_kp_divide,0.891204,0.852431,rect,0.020833,0.015625" +overlay0_desc86 = "retrok_kp_multiply,0.935185,0.852431,rect,0.020833,0.015625" +overlay0_desc87 = "retrok_kp_minus,0.979167,0.852431,rect,0.020833,0.015625" +overlay0_desc88 = "retrok_kp7,0.847222,0.885417,rect,0.020833,0.015625" +overlay0_desc89 = "retrok_kp8,0.891204,0.885417,rect,0.020833,0.015625" +overlay0_desc90 = "retrok_kp9,0.935185,0.885417,rect,0.020833,0.015625" +overlay0_desc91 = "retrok_kp_plus,0.979167,0.901910,rect,0.020833,0.032118" +overlay0_desc92 = "retrok_kp4,0.847222,0.918403,rect,0.020833,0.015625" +overlay0_desc93 = "retrok_kp5,0.891204,0.918403,rect,0.020833,0.015625" +overlay0_desc94 = "retrok_kp6,0.935185,0.918403,rect,0.020833,0.015625" +overlay0_desc95 = "retrok_kp1,0.847222,0.951389,rect,0.020833,0.015625" +overlay0_desc96 = "retrok_kp2,0.891204,0.951389,rect,0.020833,0.015625" +overlay0_desc97 = "retrok_kp3,0.935185,0.951389,rect,0.020833,0.015625" +overlay0_desc98 = "retrok_kp_enter,0.979167,0.967882,rect,0.020833,0.032118" +overlay0_desc99 = "retrok_kp0,0.869213,0.984375,rect,0.042824,0.015625" +overlay0_desc100 = "retrok_kp_equals,0.935185,0.984375,rect,0.020833,0.015625" diff --git a/media/overlays/qwerty/qwerty.png b/media/overlays/qwerty/qwerty.png new file mode 100644 index 0000000000..18bffcb54f Binary files /dev/null and b/media/overlays/qwerty/qwerty.png differ diff --git a/retroarch.c b/retroarch.c index e51af4b1ac..6e935d9a2b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -492,6 +492,8 @@ size_t audio_sample_batch(const int16_t *data, size_t frames) #ifdef HAVE_OVERLAY static inline void input_poll_overlay(void) { + input_overlay_state_t old_key_state; + memcpy(old_key_state.keys, driver.overlay_state.keys, sizeof(driver.overlay_state.keys)); memset(&driver.overlay_state, 0, sizeof(driver.overlay_state)); unsigned device = input_overlay_full_screen(driver.overlay) ? @@ -512,6 +514,9 @@ static inline void input_poll_overlay(void) input_overlay_poll(driver.overlay, &polled_data, x, y); driver.overlay_state.buttons |= polled_data.buttons; + + for (j = 0; j < ARRAY_SIZE(driver.overlay_state.keys); j++) + driver.overlay_state.keys[j] |= polled_data.keys[j]; // Fingers pressed later take prio and matched up with overlay poll priorities. for (j = 0; j < 4; j++) @@ -521,6 +526,29 @@ static inline void input_poll_overlay(void) polled = true; } + for (i = 0; i < ARRAY_SIZE(driver.overlay_state.keys); i++) + if (driver.overlay_state.keys[i] != old_key_state.keys[i]) + { + uint32_t orig = old_key_state.keys[i]; + uint32_t new = driver.overlay_state.keys[i]; + + uint16_t mod = 0; + mod |= (OVERLAY_GET_KEY(&driver.overlay_state, RETROK_LSHIFT) || + OVERLAY_GET_KEY(&driver.overlay_state, RETROK_RSHIFT)) ? RETROKMOD_SHIFT : 0; + mod |= (OVERLAY_GET_KEY(&driver.overlay_state, RETROK_LCTRL) || + OVERLAY_GET_KEY(&driver.overlay_state, RETROK_RCTRL)) ? RETROKMOD_CTRL : 0; + mod |= (OVERLAY_GET_KEY(&driver.overlay_state, RETROK_LALT) || + OVERLAY_GET_KEY(&driver.overlay_state, RETROK_RALT)) ? RETROKMOD_ALT : 0; + mod |= (OVERLAY_GET_KEY(&driver.overlay_state, RETROK_LMETA) || + OVERLAY_GET_KEY(&driver.overlay_state, RETROK_RMETA)) ? RETROKMOD_META : 0; +// CAPSLOCK SCROLLOCK NUMLOCK + + for (j = 0; j < 32; j++) + if ((orig & (1 << j)) != (new & (1 << j))) + input_keyboard_event(new & (1 << j), i * 32 + j, 0, mod); + } + + if (polled) input_overlay_post_poll(driver.overlay); else @@ -589,6 +617,8 @@ static int16_t input_state(unsigned port, unsigned device, unsigned index, unsig #ifdef HAVE_OVERLAY if (device == RETRO_DEVICE_JOYPAD && port == 0) res |= driver.overlay_state.buttons & (UINT64_C(1) << id) ? 1 : 0; + else if (device == RETRO_DEVICE_KEYBOARD && port == 0 && id < RETROK_LAST) + res |= OVERLAY_GET_KEY(&driver.overlay_state, id) ? 1 : 0; else if (device == RETRO_DEVICE_ANALOG && port == 0) { unsigned base = (index == RETRO_DEVICE_INDEX_ANALOG_RIGHT) ? 2 : 0;