diff --git a/input/input_driver.c b/input/input_driver.c index f8285fa689..d03187012c 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1783,6 +1783,209 @@ void input_overlay_auto_rotate_( } } } + +void input_poll_overlay( + bool keyboard_mapping_blocked, + settings_t *settings, + void *ol_data, + enum overlay_visibility *overlay_visibility, + float opacity, + unsigned analog_dpad_mode, + float axis_threshold) +{ + input_overlay_state_t old_key_state; + unsigned i, j; + input_overlay_t *ol = (input_overlay_t*)ol_data; + uint16_t key_mod = 0; + bool polled = false; + bool button_pressed = false; + input_driver_state_t *input_st = input_state_get_ptr(); + void *input_data = input_st->current_data; + input_overlay_state_t *ol_state = &ol->overlay_state; + input_driver_t *current_input = input_st->current_driver; + enum overlay_show_input_type + input_overlay_show_inputs = (enum overlay_show_input_type) + settings->uints.input_overlay_show_inputs; + unsigned input_overlay_show_inputs_port = settings->uints.input_overlay_show_inputs_port; + float touch_scale = (float)settings->uints.input_touch_scale; + + if (!ol_state) + return; + + memcpy(old_key_state.keys, ol_state->keys, + sizeof(ol_state->keys)); + memset(ol_state, 0, sizeof(*ol_state)); + + if (current_input->input_state) + { + rarch_joypad_info_t joypad_info; + unsigned device = ol->active->full_screen + ? RARCH_DEVICE_POINTER_SCREEN + : RETRO_DEVICE_POINTER; + const input_device_driver_t + *joypad = input_st->primary_joypad; +#ifdef HAVE_MFI + const input_device_driver_t + *sec_joypad = input_st->secondary_joypad; +#else + const input_device_driver_t + *sec_joypad = NULL; +#endif + + joypad_info.joy_idx = 0; + joypad_info.auto_binds = NULL; + joypad_info.axis_threshold = 0.0f; + + for (i = 0; + current_input->input_state( + input_data, + joypad, + sec_joypad, + &joypad_info, + NULL, + keyboard_mapping_blocked, + 0, + device, + i, + RETRO_DEVICE_ID_POINTER_PRESSED); + i++) + { + input_overlay_state_t polled_data; + int16_t x = current_input->input_state( + input_data, + joypad, + sec_joypad, + &joypad_info, + NULL, + keyboard_mapping_blocked, + 0, + device, + i, + RETRO_DEVICE_ID_POINTER_X); + int16_t y = current_input->input_state( + input_data, + joypad, + sec_joypad, + &joypad_info, + NULL, + keyboard_mapping_blocked, + 0, + device, + i, + RETRO_DEVICE_ID_POINTER_Y); + + memset(&polled_data, 0, sizeof(struct input_overlay_state)); + + if (ol->enable) + input_overlay_poll(ol, &polled_data, x, y, touch_scale); + else + ol->blocked = false; + + bits_or_bits(ol_state->buttons.data, + polled_data.buttons.data, + ARRAY_SIZE(polled_data.buttons.data)); + + for (j = 0; j < ARRAY_SIZE(ol_state->keys); j++) + ol_state->keys[j] |= polled_data.keys[j]; + + /* Fingers pressed later take priority and matched up + * with overlay poll priorities. */ + for (j = 0; j < 4; j++) + if (polled_data.analog[j]) + ol_state->analog[j] = polled_data.analog[j]; + + polled = true; + } + } + + if ( OVERLAY_GET_KEY(ol_state, RETROK_LSHIFT) || + OVERLAY_GET_KEY(ol_state, RETROK_RSHIFT)) + key_mod |= RETROKMOD_SHIFT; + + if (OVERLAY_GET_KEY(ol_state, RETROK_LCTRL) || + OVERLAY_GET_KEY(ol_state, RETROK_RCTRL)) + key_mod |= RETROKMOD_CTRL; + + if ( OVERLAY_GET_KEY(ol_state, RETROK_LALT) || + OVERLAY_GET_KEY(ol_state, RETROK_RALT)) + key_mod |= RETROKMOD_ALT; + + if ( OVERLAY_GET_KEY(ol_state, RETROK_LMETA) || + OVERLAY_GET_KEY(ol_state, RETROK_RMETA)) + key_mod |= RETROKMOD_META; + + /* CAPSLOCK SCROLLOCK NUMLOCK */ + for (i = 0; i < ARRAY_SIZE(ol_state->keys); i++) + { + if (ol_state->keys[i] != old_key_state.keys[i]) + { + uint32_t orig_bits = old_key_state.keys[i]; + uint32_t new_bits = ol_state->keys[i]; + + for (j = 0; j < 32; j++) + if ((orig_bits & (1 << j)) != (new_bits & (1 << j))) + input_keyboard_event(new_bits & (1 << j), + i * 32 + j, 0, key_mod, RETRO_DEVICE_POINTER); + } + } + + /* Map "analog" buttons to analog axes like regular input drivers do. */ + for (j = 0; j < 4; j++) + { + unsigned bind_plus = RARCH_ANALOG_LEFT_X_PLUS + 2 * j; + unsigned bind_minus = bind_plus + 1; + + if (ol_state->analog[j]) + continue; + + if ((BIT256_GET(ol->overlay_state.buttons, bind_plus))) + ol_state->analog[j] += 0x7fff; + if ((BIT256_GET(ol->overlay_state.buttons, bind_minus))) + ol_state->analog[j] -= 0x7fff; + } + + /* Check for analog_dpad_mode. + * Map analogs to d-pad buttons when configured. */ + switch (analog_dpad_mode) + { + case ANALOG_DPAD_LSTICK: + case ANALOG_DPAD_RSTICK: + { + float analog_x, analog_y; + unsigned analog_base = 2; + + if (analog_dpad_mode == ANALOG_DPAD_LSTICK) + analog_base = 0; + + analog_x = (float)ol_state->analog[analog_base + 0] / 0x7fff; + analog_y = (float)ol_state->analog[analog_base + 1] / 0x7fff; + + if (analog_x <= -axis_threshold) + BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_LEFT); + if (analog_x >= axis_threshold) + BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_RIGHT); + if (analog_y <= -axis_threshold) + BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_UP); + if (analog_y >= axis_threshold) + BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_DOWN); + break; + } + + default: + break; + } + + if (input_overlay_show_inputs != OVERLAY_SHOW_INPUT_NONE) + button_pressed = input_overlay_add_inputs(ol, + (input_overlay_show_inputs == OVERLAY_SHOW_INPUT_TOUCHED), + input_overlay_show_inputs_port); + + if (button_pressed || polled) + input_overlay_post_poll(overlay_visibility, ol, + button_pressed, opacity); + else + input_overlay_poll_clear(overlay_visibility, ol, opacity); +} #endif /** diff --git a/input/input_driver.h b/input/input_driver.h index ca5e8f77a1..9b6a46af88 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -22,16 +22,16 @@ #include #include -#ifdef HAVE_CONFIG_H -#include "../config.h" -#endif /* HAVE_CONFIG_H */ - #include #include #include #include #include +#ifdef HAVE_CONFIG_H +#include "../config.h" +#endif /* HAVE_CONFIG_H */ + #include "input_defines.h" #include "input_types.h" #ifdef HAVE_OVERLAY @@ -47,61 +47,6 @@ RETRO_BEGIN_DECLS -struct retro_keybind -{ - /** - * Human-readable label for the control. - */ - char *joykey_label; - - /** - * Human-readable label for an analog axis. - */ - char *joyaxis_label; - - /** - * Joypad axis. Negative and positive axes are both represented by this variable. - */ - uint32_t joyaxis; - - /** - * Default joy axis binding value for resetting bind to default. - */ - uint32_t def_joyaxis; - - /** - * Used by input_{push,pop}_analog_dpad(). - */ - uint32_t orig_joyaxis; - - enum msg_hash_enums enum_idx; - - enum retro_key key; - - uint16_t id; - - /** - * What mouse button ID has been mapped to this control. - */ - uint16_t mbutton; - - /** - * Joypad key. Joypad POV (hats) are embedded into this key as well. - **/ - uint16_t joykey; - - /** - * Default key binding value (for resetting bind). - */ - uint16_t def_joykey; - - /** - * Determines whether or not the binding is valid. - */ - bool valid; -}; - - /** * line_complete callback (when carriage return is pressed) * @@ -871,6 +816,22 @@ const char *joypad_driver_name(unsigned i); void joypad_driver_reinit(void *data, const char *joypad_driver_name); +#ifdef HAVE_OVERLAY +/* + * input_poll_overlay: + * + * Poll pressed buttons/keys on currently active overlay. + **/ +void input_poll_overlay( + bool keyboard_mapping_blocked, + settings_t *settings, + void *ol_data, + enum overlay_visibility *overlay_visibility, + float opacity, + unsigned analog_dpad_mode, + float axis_threshold); +#endif + #if defined(ANDROID) #define DEFAULT_MAX_PADS 8 #define ANDROID_KEYBOARD_PORT DEFAULT_MAX_PADS diff --git a/input/input_overlay.h b/input/input_overlay.h index 102fab5290..5a8868a5e4 100644 --- a/input/input_overlay.h +++ b/input/input_overlay.h @@ -25,7 +25,7 @@ #include #include -#include "input_driver.h" +#include "input_types.h" #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) diff --git a/input/input_remapping.h b/input/input_remapping.h index 2eef5fb252..37eee5ef02 100644 --- a/input/input_remapping.h +++ b/input/input_remapping.h @@ -23,6 +23,9 @@ #include #include +#include "input_defines.h" +#include "input_types.h" + typedef struct input_mapper { /* Left X, Left Y, Right X, Right Y */ diff --git a/input/input_types.h b/input/input_types.h index f6c99cc1ac..715c932249 100644 --- a/input/input_types.h +++ b/input/input_types.h @@ -17,6 +17,8 @@ #ifndef __INPUT_TYPES__H #define __INPUT_TYPES__H +#include "../msg_hash.h" + enum input_auto_game_focus_type { AUTO_GAME_FOCUS_OFF = 0, @@ -25,11 +27,36 @@ enum input_auto_game_focus_type AUTO_GAME_FOCUS_LAST }; -typedef struct rarch_joypad_driver input_device_driver_t; -typedef struct input_keyboard_line input_keyboard_line_t; -typedef struct rarch_joypad_info rarch_joypad_info_t; -typedef struct input_driver input_driver_t; -typedef struct input_keyboard_ctx_wait input_keyboard_ctx_wait_t; +struct retro_keybind +{ + /* Human-readable label for the control. */ + char *joykey_label; + /* Human-readable label for an analog axis. */ + char *joyaxis_label; + /* + * Joypad axis. Negative and positive axes are both + * represented by this variable. + */ + uint32_t joyaxis; + /* Default joy axis binding value for resetting bind to default. */ + uint32_t def_joyaxis; + /* Used by input_{push,pop}_analog_dpad(). */ + uint32_t orig_joyaxis; + + enum msg_hash_enums enum_idx; + + enum retro_key key; + + uint16_t id; + /* What mouse button ID has been mapped to this control. */ + uint16_t mbutton; + /* Joypad key. Joypad POV (hats) are embedded into this key as well. */ + uint16_t joykey; + /* Default key binding value (for resetting bind). */ + uint16_t def_joykey; + /* Determines whether or not the binding is valid. */ + bool valid; +}; typedef struct { @@ -38,6 +65,12 @@ typedef struct uint16_t analog_buttons[16]; } input_bits_t; +typedef struct rarch_joypad_driver input_device_driver_t; +typedef struct input_keyboard_line input_keyboard_line_t; +typedef struct rarch_joypad_info rarch_joypad_info_t; +typedef struct input_driver input_driver_t; +typedef struct input_keyboard_ctx_wait input_keyboard_ctx_wait_t; + typedef struct joypad_connection joypad_connection_t; typedef struct pad_connection_listener_interface pad_connection_listener_t; diff --git a/retroarch.c b/retroarch.c index 379a33e787..e6e1f8ca7c 100644 --- a/retroarch.c +++ b/retroarch.c @@ -14794,210 +14794,6 @@ void input_overlay_set_visibility(int overlay_idx, ol->iface->set_alpha(ol->iface_data, overlay_idx, 0.0); } -/* - * input_poll_overlay: - * - * Poll pressed buttons/keys on currently active overlay. - **/ -static void input_poll_overlay( - struct rarch_state *p_rarch, - settings_t *settings, - input_overlay_t *ol, float opacity, - unsigned analog_dpad_mode, - float axis_threshold) -{ - input_overlay_state_t old_key_state; - unsigned i, j; - uint16_t key_mod = 0; - bool polled = false; - bool button_pressed = false; - input_driver_state_t *input_st = input_state_get_ptr(); - void *input_data = input_st->current_data; - input_overlay_state_t *ol_state = &ol->overlay_state; - input_driver_t *current_input = input_st->current_driver; - enum overlay_show_input_type - input_overlay_show_inputs = (enum overlay_show_input_type) - settings->uints.input_overlay_show_inputs; - unsigned input_overlay_show_inputs_port = settings->uints.input_overlay_show_inputs_port; - float touch_scale = (float)settings->uints.input_touch_scale; - - if (!ol_state) - return; - - memcpy(old_key_state.keys, ol_state->keys, - sizeof(ol_state->keys)); - memset(ol_state, 0, sizeof(*ol_state)); - - if (current_input->input_state) - { - rarch_joypad_info_t joypad_info; - unsigned device = ol->active->full_screen - ? RARCH_DEVICE_POINTER_SCREEN - : RETRO_DEVICE_POINTER; - const input_device_driver_t - *joypad = input_st->primary_joypad; -#ifdef HAVE_MFI - const input_device_driver_t - *sec_joypad = input_st->secondary_joypad; -#else - const input_device_driver_t - *sec_joypad = NULL; -#endif - - joypad_info.joy_idx = 0; - joypad_info.auto_binds = NULL; - joypad_info.axis_threshold = 0.0f; - - for (i = 0; - current_input->input_state( - input_data, - joypad, - sec_joypad, - &joypad_info, - NULL, - p_rarch->keyboard_mapping_blocked, - 0, - device, - i, - RETRO_DEVICE_ID_POINTER_PRESSED); - i++) - { - input_overlay_state_t polled_data; - int16_t x = current_input->input_state( - input_data, - joypad, - sec_joypad, - &joypad_info, - NULL, - p_rarch->keyboard_mapping_blocked, - 0, - device, - i, - RETRO_DEVICE_ID_POINTER_X); - int16_t y = current_input->input_state( - input_data, - joypad, - sec_joypad, - &joypad_info, - NULL, - p_rarch->keyboard_mapping_blocked, - 0, - device, - i, - RETRO_DEVICE_ID_POINTER_Y); - - memset(&polled_data, 0, sizeof(struct input_overlay_state)); - - if (ol->enable) - input_overlay_poll(ol, &polled_data, x, y, touch_scale); - else - ol->blocked = false; - - bits_or_bits(ol_state->buttons.data, - polled_data.buttons.data, - ARRAY_SIZE(polled_data.buttons.data)); - - for (j = 0; j < ARRAY_SIZE(ol_state->keys); j++) - ol_state->keys[j] |= polled_data.keys[j]; - - /* Fingers pressed later take priority and matched up - * with overlay poll priorities. */ - for (j = 0; j < 4; j++) - if (polled_data.analog[j]) - ol_state->analog[j] = polled_data.analog[j]; - - polled = true; - } - } - - if ( OVERLAY_GET_KEY(ol_state, RETROK_LSHIFT) || - OVERLAY_GET_KEY(ol_state, RETROK_RSHIFT)) - key_mod |= RETROKMOD_SHIFT; - - if (OVERLAY_GET_KEY(ol_state, RETROK_LCTRL) || - OVERLAY_GET_KEY(ol_state, RETROK_RCTRL)) - key_mod |= RETROKMOD_CTRL; - - if ( OVERLAY_GET_KEY(ol_state, RETROK_LALT) || - OVERLAY_GET_KEY(ol_state, RETROK_RALT)) - key_mod |= RETROKMOD_ALT; - - if ( OVERLAY_GET_KEY(ol_state, RETROK_LMETA) || - OVERLAY_GET_KEY(ol_state, RETROK_RMETA)) - key_mod |= RETROKMOD_META; - - /* CAPSLOCK SCROLLOCK NUMLOCK */ - for (i = 0; i < ARRAY_SIZE(ol_state->keys); i++) - { - if (ol_state->keys[i] != old_key_state.keys[i]) - { - uint32_t orig_bits = old_key_state.keys[i]; - uint32_t new_bits = ol_state->keys[i]; - - for (j = 0; j < 32; j++) - if ((orig_bits & (1 << j)) != (new_bits & (1 << j))) - input_keyboard_event(new_bits & (1 << j), - i * 32 + j, 0, key_mod, RETRO_DEVICE_POINTER); - } - } - - /* Map "analog" buttons to analog axes like regular input drivers do. */ - for (j = 0; j < 4; j++) - { - unsigned bind_plus = RARCH_ANALOG_LEFT_X_PLUS + 2 * j; - unsigned bind_minus = bind_plus + 1; - - if (ol_state->analog[j]) - continue; - - if ((BIT256_GET(ol->overlay_state.buttons, bind_plus))) - ol_state->analog[j] += 0x7fff; - if ((BIT256_GET(ol->overlay_state.buttons, bind_minus))) - ol_state->analog[j] -= 0x7fff; - } - - /* Check for analog_dpad_mode. - * Map analogs to d-pad buttons when configured. */ - switch (analog_dpad_mode) - { - case ANALOG_DPAD_LSTICK: - case ANALOG_DPAD_RSTICK: - { - float analog_x, analog_y; - unsigned analog_base = 2; - - if (analog_dpad_mode == ANALOG_DPAD_LSTICK) - analog_base = 0; - - analog_x = (float)ol_state->analog[analog_base + 0] / 0x7fff; - analog_y = (float)ol_state->analog[analog_base + 1] / 0x7fff; - - if (analog_x <= -axis_threshold) - BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_LEFT); - if (analog_x >= axis_threshold) - BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_RIGHT); - if (analog_y <= -axis_threshold) - BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_UP); - if (analog_y >= axis_threshold) - BIT256_SET(ol_state->buttons, RETRO_DEVICE_ID_JOYPAD_DOWN); - break; - } - - default: - break; - } - - if (input_overlay_show_inputs != OVERLAY_SHOW_INPUT_NONE) - button_pressed = input_overlay_add_inputs(ol, - (input_overlay_show_inputs == OVERLAY_SHOW_INPUT_TOUCHED), - input_overlay_show_inputs_port); - - if (button_pressed || polled) - input_overlay_post_poll(p_rarch->overlay_visibility, ol, button_pressed, opacity); - else - input_overlay_poll_clear(p_rarch->overlay_visibility, ol, opacity); -} - static void retroarch_overlay_deinit(struct rarch_state *p_rarch) { input_overlay_free(p_rarch->overlay_ptr); @@ -15199,9 +14995,11 @@ static void input_driver_poll(void) break; } - input_poll_overlay(p_rarch, + input_poll_overlay( + p_rarch->keyboard_mapping_blocked, settings, p_rarch->overlay_ptr, + p_rarch->overlay_visibility, input_overlay_opacity, input_analog_dpad_mode, settings->floats.input_axis_threshold);