diff --git a/input/input_driver.c b/input/input_driver.c index f1abed8726..8a6751c06f 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1745,6 +1745,41 @@ bool input_joypad_hat_raw(const input_device_driver_t *drv, return drv->button(port, HAT_MAP(hat, hat_dir)); } +/** + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned id) +{ + int16_t res; + rarch_joypad_info_t joypad_info; + settings_t *settings = config_get_ptr(); + + /*ignore axes*/ + if ( id == RETRO_DEVICE_ID_MOUSE_X || id == RETRO_DEVICE_ID_MOUSE_Y ) { + return false; + } + + joypad_info.axis_threshold = input_driver_axis_threshold; + joypad_info.joy_idx = settings->uints.input_joypad_map[port]; + joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; + + res = current_input->input_state(current_input_data, + joypad_info, libretro_input_binds, port, RETRO_DEVICE_MOUSE, 0, id); + + if ( res ) { + return true; + } + return false; +} + /** * input_conv_analog_id_to_bind_id: * @idx : Analog key index. diff --git a/input/input_driver.h b/input/input_driver.h index 7cd3c068a6..c3084979a9 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -608,7 +608,20 @@ bool input_joypad_hat_raw(const input_device_driver_t *driver, unsigned joypad, unsigned hat_dir, unsigned hat); /** - * input_joypad_name: + * input_mouse_button_raw: + * @port : Mouse number. + * @button : Identifier of key (libretro mouse constant). + * + * Checks if key (@button) was being pressed by user + * with mouse number @port. + * + * Returns: true (1) if key was pressed, otherwise + * false (0). + **/ +bool input_mouse_button_raw(unsigned port, unsigned button); + +/** + * input_joypad_name: * @drv : Input device driver handle. * @port : Joystick number. * diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 960110fcb8..456ae54b46 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -30,9 +30,11 @@ #define MENU_MAX_BUTTONS 219 #define MENU_MAX_AXES 32 #define MENU_MAX_HATS 4 +#define MENU_MAX_MBUTTONS 32 /*enough to cover largest libretro constant*/ struct menu_bind_state_port { + bool mbuttons[MENU_MAX_MBUTTONS]; bool buttons[MENU_MAX_BUTTONS]; int16_t axes[MENU_MAX_AXES]; uint16_t hats[MENU_MAX_HATS]; @@ -206,6 +208,7 @@ static void menu_input_key_bind_poll_bind_state( unsigned port, bool timed_out) { + unsigned b; rarch_joypad_info_t joypad_info; const input_device_driver_t *joypad = input_driver_get_joypad_driver(); @@ -217,6 +220,11 @@ static void menu_input_key_bind_poll_bind_state( memset(state->state, 0, sizeof(state->state)); + /* poll mouse (on the relevant port) */ + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + state->state[port].mbuttons[b] = + input_mouse_button_raw(port, b); + joypad_info.joy_idx = 0; joypad_info.auto_binds = NULL; joypad_info.axis_threshold = 0.0f; @@ -277,6 +285,30 @@ static bool menu_input_key_bind_poll_find_trigger_pad( const struct menu_bind_state_port *o = (const struct menu_bind_state_port*) &state->state[p]; + for (b = 0; b < MENU_MAX_MBUTTONS; b++) + { + bool iterate = n->mbuttons[b] && !o->mbuttons[b]; + + if (!iterate) + continue; + + switch ( b ) + { + + case RETRO_DEVICE_ID_MOUSE_LEFT: + case RETRO_DEVICE_ID_MOUSE_RIGHT: + case RETRO_DEVICE_ID_MOUSE_MIDDLE: + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: + case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: + state->target->mbutton = b; + return true; + } + } + for (b = 0; b < MENU_MAX_BUTTONS; b++) { bool iterate = n->buttons[b] && !o->buttons[b]; @@ -398,7 +430,7 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) } snprintf(bind->s, bind->len, - "[%s]\npress keyboard or joypad\n(timeout %d %s)", + "[%s]\npress keyboard, mouse or joypad\n(timeout %d %s)", input_config_bind_map_get_desc( menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), rarch_timer_get_timeout(&menu_input_binds.timer),