diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 0e726025c2..bb6dd75d6b 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -879,6 +879,11 @@ static bool android_input_key_pressed(void *data, int key) 0, settings->input.binds[0], key); } +static bool android_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static void android_input_free_input(void *data) { android_input_t *android = (android_input_t*)data; @@ -1024,6 +1029,7 @@ input_driver_t input_android = { android_input_poll, android_input_state, android_input_key_pressed, + android_input_meta_key_pressed, android_input_free_input, android_input_set_sensor_state, android_input_get_sensor_input, diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index c433deed2c..cb7ff9ab0e 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -369,6 +369,11 @@ static bool cocoa_input_key_pressed(void *data, int key) input_joypad_pressed(apple->joypad, 0, settings->input.binds[0], key); } +static bool cocoa_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static void cocoa_input_free(void *data) { cocoa_input_data_t *apple = (cocoa_input_data_t*)data; @@ -442,6 +447,7 @@ input_driver_t input_cocoa = { cocoa_input_poll, cocoa_input_state, cocoa_input_key_pressed, + cocoa_input_meta_key_pressed, cocoa_input_free, NULL, NULL, diff --git a/input/drivers/ctr_input.c b/input/drivers/ctr_input.c index 3c9f204831..9b6aab30a1 100644 --- a/input/drivers/ctr_input.c +++ b/input/drivers/ctr_input.c @@ -88,8 +88,12 @@ static bool ctr_input_key_pressed(void *data, int key) settings_t *settings = config_get_ptr(); ctr_input_t *ctr = (ctr_input_t*)data; - return (BIT64_GET(lifecycle_state, key)) || - (input_joypad_pressed(ctr->joypad, 0, settings->input.binds[0], key); + return (input_joypad_pressed(ctr->joypad, 0, settings->input.binds[0], key); +} + +static bool ctr_input_meta_key_pressed(void *data, int key) +{ + return (BIT64_GET(lifecycle_state, key)); } static uint64_t ctr_input_get_capabilities(void *data) @@ -145,6 +149,7 @@ input_driver_t input_ctr = { ctr_input_poll, ctr_input_state, ctr_input_key_pressed, + ctr_input_meta_key_pressed, ctr_input_free_input, NULL, NULL, diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e70f64c1db..472bafb762 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -383,6 +383,11 @@ static bool dinput_key_pressed(void *data, int key) settings->input.binds[0], 0, key); } +static bool dinput_meta_key_pressed(void *data, int key) +{ + return false; +} + static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id) { switch (id) @@ -802,6 +807,7 @@ input_driver_t input_dinput = { dinput_poll, dinput_input_state, dinput_key_pressed, + dinput_meta_key_pressed, dinput_free, NULL, NULL, diff --git a/input/drivers/gx_input.c b/input/drivers/gx_input.c index 11dcc6d4f7..0e0a89a741 100644 --- a/input/drivers/gx_input.c +++ b/input/drivers/gx_input.c @@ -97,8 +97,12 @@ static bool gx_input_key_pressed(void *data, int key) { settings_t *settings = config_get_ptr(); gx_input_t *gx = (gx_input_t*)data; - return (BIT64_GET(lifecycle_state, key)) || - input_joypad_pressed(gx->joypad, 0, settings->input.binds[0], key); + return input_joypad_pressed(gx->joypad, 0, settings->input.binds[0], key); +} + +static bool gx_input_meta_key_pressed(void *data, int key) +{ + return (BIT64_GET(lifecycle_state, key)); } static uint64_t gx_input_get_capabilities(void *data) @@ -154,6 +158,7 @@ input_driver_t input_gx = { gx_input_poll, gx_input_state, gx_input_key_pressed, + gx_input_meta_key_pressed, gx_input_free_input, NULL, NULL, diff --git a/input/drivers/linuxraw_input.c b/input/drivers/linuxraw_input.c index 27de832fc6..25da4c0643 100644 --- a/input/drivers/linuxraw_input.c +++ b/input/drivers/linuxraw_input.c @@ -182,6 +182,11 @@ static bool linuxraw_input_key_pressed(void *data, int key) input_joypad_pressed(linuxraw->joypad, 0, settings->input.binds[0], key); } +static bool linuxraw_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static int16_t linuxraw_input_state(void *data, const struct retro_keybind **binds, unsigned port, unsigned device, unsigned idx, unsigned id) @@ -302,6 +307,7 @@ input_driver_t input_linuxraw = { linuxraw_input_poll, linuxraw_input_state, linuxraw_input_key_pressed, + linuxraw_input_meta_key_pressed, linuxraw_input_free, NULL, NULL, diff --git a/input/drivers/nullinput.c b/input/drivers/nullinput.c index a485c25527..520fa58960 100644 --- a/input/drivers/nullinput.c +++ b/input/drivers/nullinput.c @@ -49,6 +49,14 @@ static bool nullinput_input_key_pressed(void *data, int key) return false; } +static bool nullinput_input_meta_key_pressed(void *data, int key) +{ + (void)data; + (void)key; + + return false; +} + static void nullinput_input_free_input(void *data) { (void)data; @@ -91,6 +99,7 @@ input_driver_t input_null = { nullinput_input_poll, nullinput_input_state, nullinput_input_key_pressed, + nullinput_input_meta_key_pressed, nullinput_input_free_input, nullinput_set_sensor_state, NULL, diff --git a/input/drivers/ps3_input.c b/input/drivers/ps3_input.c index 9a25104423..ef3f204a0d 100644 --- a/input/drivers/ps3_input.c +++ b/input/drivers/ps3_input.c @@ -182,6 +182,11 @@ static bool ps3_input_key_pressed(void *data, int key) return input_joypad_pressed(ps3->joypad, 0, settings->input.binds[0], key); } +static bool ps3_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static uint64_t ps3_input_get_capabilities(void *data) { (void)data; @@ -265,6 +270,7 @@ input_driver_t input_ps3 = { ps3_input_poll, ps3_input_state, ps3_input_key_pressed, + ps3_input_meta_key_pressed, ps3_input_free_input, ps3_input_set_sensor_state, NULL, diff --git a/input/drivers/psp_input.c b/input/drivers/psp_input.c index 8cfc1cc44d..02b41c91de 100644 --- a/input/drivers/psp_input.c +++ b/input/drivers/psp_input.c @@ -103,8 +103,12 @@ static bool psp_input_key_pressed(void *data, int key) settings_t *settings = config_get_ptr(); psp_input_t *psp = (psp_input_t*)data; - return (BIT64_GET(lifecycle_state, key)) || - input_joypad_pressed(psp->joypad, 0, settings->input.binds[0], key); + return input_joypad_pressed(psp->joypad, 0, settings->input.binds[0], key); +} + +static bool psp_input_meta_key_pressed(void *data, int key) +{ + return (BIT64_GET(lifecycle_state, key)); } static uint64_t psp_input_get_capabilities(void *data) @@ -160,6 +164,7 @@ input_driver_t input_psp = { psp_input_poll, psp_input_state, psp_input_key_pressed, + psp_input_meta_key_pressed, psp_input_free_input, NULL, NULL, diff --git a/input/drivers/qnx_input.c b/input/drivers/qnx_input.c index f3cc96d4b1..483e7e8c9f 100644 --- a/input/drivers/qnx_input.c +++ b/input/drivers/qnx_input.c @@ -794,6 +794,11 @@ static bool qnx_input_key_pressed(void *data, int key) return input_joypad_pressed(qnx->joypad, 0, settings->input.binds[0], key); } +static bool qnx_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static void qnx_input_free_input(void *data) { if (data) @@ -859,6 +864,7 @@ input_driver_t input_qnx = { qnx_input_poll, qnx_input_state, qnx_input_key_pressed, + NULL, qnx_input_free_input, NULL, NULL, diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index dbbaf3e39b..ac2ff56e87 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -82,6 +82,11 @@ static bool rwebinput_key_pressed(rwebinput_input_t *rwebinput, int key) return ret; } +static bool rwebinput_meta_key_pressed(rwebinput_input_t *rwebinput, int key) +{ + return false; +} + static bool rwebinput_is_pressed(rwebinput_input_t *rwebinput, const struct retro_keybind *binds, unsigned id) { @@ -97,7 +102,7 @@ static bool rwebinput_is_pressed(rwebinput_input_t *rwebinput, static bool rwebinput_key_pressed(void *data, int key) { rwebinput_input_t *rwebinput = (rwebinput_input_t*)data; - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); return rwebinput_is_pressed(rwebinput, settings->input.binds[0], key); } @@ -250,6 +255,7 @@ input_driver_t input_rwebinput = { rwebinput_input_poll, rwebinput_input_state, rwebinput_key_pressed, + rwebinput_meta_key_pressed, rwebinput_input_free, NULL, NULL, diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 7e1d5f5ff8..53b527f3fb 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -291,6 +291,11 @@ static bool sdl_input_key_pressed(void *data, int key) return false; } +static bool sdl_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static int16_t sdl_joypad_device_state(sdl_input_t *sdl, const struct retro_keybind **binds_, unsigned port_num, unsigned id) { @@ -583,6 +588,7 @@ input_driver_t input_sdl = { sdl_input_poll, sdl_input_state, sdl_input_key_pressed, + sdl_input_meta_key_pressed, sdl_input_free, NULL, NULL, diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 4625d59868..f2908c733b 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -561,6 +561,11 @@ static bool udev_input_key_pressed(void *data, int key) input_joypad_pressed(udev->joypad, 0, settings->input.binds[0], key); } +static bool udev_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static void udev_input_free(void *data) { unsigned i; @@ -881,6 +886,7 @@ input_driver_t input_udev = { udev_input_poll, udev_input_state, udev_input_key_pressed, + udev_input_meta_key_pressed, udev_input_free, NULL, NULL, diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 57cc2a0f21..8166ed67b5 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -265,6 +265,11 @@ static bool x_input_key_pressed(void *data, int key) input_joypad_pressed(x11->joypad, 0, settings->input.binds[0], key); } +static bool x_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static int16_t x_mouse_state(x11_input_t *x11, unsigned id) { switch (id) @@ -546,6 +551,7 @@ input_driver_t input_x = { x_input_poll, x_input_state, x_input_key_pressed, + x_input_meta_key_pressed, x_input_free, NULL, NULL, diff --git a/input/drivers/xdk_xinput_input.c b/input/drivers/xdk_xinput_input.c index c7fde9e2c0..7040461cc4 100644 --- a/input/drivers/xdk_xinput_input.c +++ b/input/drivers/xdk_xinput_input.c @@ -96,6 +96,11 @@ static bool xdk_input_key_pressed(void *data, int key) return input_joypad_pressed(xdk->joypad, 0, settings->input.binds[0], key); } +static bool xdk_input_meta_key_pressed(void *data, int key) +{ + return false; +} + static uint64_t xdk_input_get_capabilities(void *data) { (void)data; @@ -173,6 +178,7 @@ input_driver_t input_xinput = { xdk_input_poll, xdk_input_state, xdk_input_key_pressed, + xdk_input_meta_key_pressed, xdk_input_free_input, NULL, NULL, diff --git a/input/drivers/xenon360_input.c b/input/drivers/xenon360_input.c index e90bcb9fad..165ecca86a 100644 --- a/input/drivers/xenon360_input.c +++ b/input/drivers/xenon360_input.c @@ -93,6 +93,11 @@ static bool xenon360_input_key_pressed(void *data, int key) return (lifecycle_state & (UINT64_C(1) << key)); } +static bool xenon360_input_meta_key_pressed(void *data, int key) +{ + return (lifecycle_state & (UINT64_C(1) << key)); +} + static uint64_t xenon360_get_capabilities(void *data) { uint64_t caps = 0; @@ -124,6 +129,7 @@ input_driver_t input_xenon360 = { xenon360_input_poll, xenon360_input_state, xenon360_input_key_pressed, + xenon360_input_meta_key_pressed, xenon360_input_free_input, NULL, NULL, diff --git a/input/input_driver.c b/input/input_driver.c index 73e3df6d62..61b426cdc1 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -209,11 +209,13 @@ retro_input_t input_driver_keys_pressed(void) for (key = 0; key < RARCH_BIND_LIST_END; key++) { bool state = false; - if ((!driver->block_libretro_input && - (((key < RARCH_FIRST_META_KEY) || key == RARCH_MENU_TOGGLE))) + if ((!driver->block_libretro_input && ((key < RARCH_FIRST_META_KEY))) || !driver->block_hotkey) state = input->key_pressed(driver->input_data, key); + if (key >= RARCH_FIRST_META_KEY) + state |= input->meta_key_pressed(driver->input_data, key); + #ifdef HAVE_OVERLAY state |= input_overlay_key_pressed(key); #endif diff --git a/input/input_driver.h b/input/input_driver.h index 2d22e5bbc7..a7afd2565f 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -64,6 +64,7 @@ typedef struct input_driver const struct retro_keybind **retro_keybinds, unsigned port, unsigned device, unsigned index, unsigned id); bool (*key_pressed)(void *data, int key); + bool (*meta_key_pressed)(void *data, int key); void (*free)(void *data); bool (*set_sensor_state)(void *data, unsigned port, enum retro_sensor_action action, unsigned rate);