diff --git a/config.def.keybinds.h b/config.def.keybinds.h
index 5ed2203f51..6a999a0e32 100644
--- a/config.def.keybinds.h
+++ b/config.def.keybinds.h
@@ -22,163 +22,166 @@
/* User 1 */
static const struct retro_keybind retro_keybinds_1[] = {
- /* | RetroPad button | enum | keyboard key | js btn | js axis | */
+ /* | RetroPad button | enum | keyboard key | m-btn | js btn | js axis | */
#ifdef __QNX__
- { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_v, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_b, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_d, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_j, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_g, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+
+ { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE },
#else
- { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_RSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_x, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_s, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_q, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_w, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, 0, AXIS_NONE },
- { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+
+ { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY,RETROK_l, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_F4, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_F2, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY,RETROK_f, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_F7, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_F6, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_r, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MOVIE_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MOVIE_RECORD_TOGGLE, RETROK_o, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_p, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_k, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_h, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_m, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_n, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_y, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_t, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_u, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_F8, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_F9, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_F12, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_NETPLAY_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FLIP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_i, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_SLOWMOTION, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION, RETROK_e, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_KP_PLUS, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_KP_MINUS,NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_F11, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_SCROLLOCK, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_F1, NO_BTN, NO_BTN, 0, AXIS_NONE },
#endif
};
/* Users 2 to MAX_USERS */
static const struct retro_keybind retro_keybinds_rest[] = {
- /* | RetroPad button | desc | keyboard key | js btn | js axis | */
- { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
+ /* | RetroPad button | desc | keyboard key | js btn | js axis | */
+ { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
- { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+ { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
+
+ { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE },
};
#endif
diff --git a/configuration.c b/configuration.c
index 9d95452cdb..7f2fa1fc91 100644
--- a/configuration.c
+++ b/configuration.c
@@ -2143,6 +2143,24 @@ static void read_keybinds_axis(config_file_t *conf, unsigned user,
input_config_bind_map_get_base(idx), bind);
}
+static void read_keybinds_mbutton(config_file_t *conf, unsigned user,
+ unsigned idx, struct retro_keybind *bind)
+{
+ const char *prefix = NULL;
+
+ if (!input_config_bind_map_get_valid(idx))
+ return;
+ if (!input_config_bind_map_get_base(idx))
+ return;
+
+ prefix = input_config_get_prefix(user,
+ input_config_bind_map_get_meta(idx));
+
+ if (prefix)
+ input_config_parse_mouse_button(conf, prefix,
+ input_config_bind_map_get_base(idx), bind);
+}
+
static void read_keybinds_user(config_file_t *conf, unsigned user)
{
unsigned i;
@@ -2157,6 +2175,7 @@ static void read_keybinds_user(config_file_t *conf, unsigned user)
read_keybinds_keyboard(conf, user, i, bind);
read_keybinds_button(conf, user, i, bind);
read_keybinds_axis(conf, user, i, bind);
+ read_keybinds_mbutton(conf, user, i, bind);
}
}
@@ -3349,6 +3368,38 @@ static void save_keybind_axis(config_file_t *conf, const char *prefix,
}
}
+static void save_keybind_mbutton(config_file_t *conf, const char *prefix,
+ const char *base, const struct retro_keybind *bind, bool save_empty)
+{
+ char key[64];
+
+ key[0] = '\0';
+
+ fill_pathname_join_delim_concat(key, prefix,
+ base, '_', "_mbtn", sizeof(key));
+
+ switch ( bind->mbutton )
+ {
+
+ case RETRO_DEVICE_ID_MOUSE_LEFT: config_set_uint64(conf, key, 1); break;
+ case RETRO_DEVICE_ID_MOUSE_RIGHT: config_set_uint64(conf, key, 2); break;
+ case RETRO_DEVICE_ID_MOUSE_MIDDLE: config_set_uint64(conf, key, 3); break;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_4: config_set_uint64(conf, key, 4); break;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_5: config_set_uint64(conf, key, 5); break;
+
+ case RETRO_DEVICE_ID_MOUSE_WHEELUP: config_set_string(conf, key, "wu"); break;
+ case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: config_set_string(conf, key, "wd"); break;
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP: config_set_string(conf, key, "whu"); break;
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN: config_set_string(conf, key, "whd"); break;
+
+ default:
+ if ( save_empty ) {
+ config_set_string(conf, key, file_path_str(FILE_PATH_NUL));
+ }
+ break;
+ }
+}
+
/**
* save_keybind:
* @conf : pointer to config file object
@@ -3369,6 +3420,7 @@ static void save_keybind(config_file_t *conf, const char *prefix,
save_keybind_key(conf, prefix, base, bind);
save_keybind_joykey(conf, prefix, base, bind, save_empty);
save_keybind_axis(conf, prefix, base, bind, save_empty);
+ save_keybind_mbutton(conf, prefix, base, bind, save_empty);
}
/**
diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c
index f890444e46..23fe84a719 100644
--- a/input/drivers/dinput.c
+++ b/input/drivers/dinput.c
@@ -49,6 +49,7 @@
#include "../../gfx/video_driver.h"
+#include "../../configuration.h"
#include "../../verbosity.h"
/* Keep track of which pad indexes are 360 controllers.
@@ -267,6 +268,58 @@ static bool dinput_keyboard_pressed(struct dinput_input *di, unsigned key)
return di->state[sym] & 0x80;
}
+static bool dinput_mbutton_pressed(struct dinput_input *di, unsigned port, unsigned key)
+{
+ bool result;
+ settings_t *settings = config_get_ptr();
+
+ if (port >= MAX_USERS)
+ return false;
+
+ /* the driver only supports one mouse */
+ if ( settings->uints.input_mouse_index[ port ] != 0 ) {
+ return false;
+ }
+
+ switch ( key )
+ {
+
+ case RETRO_DEVICE_ID_MOUSE_LEFT:
+ return di->mouse_l;
+ case RETRO_DEVICE_ID_MOUSE_RIGHT:
+ return di->mouse_r;
+ case RETRO_DEVICE_ID_MOUSE_MIDDLE:
+ return di->mouse_m;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
+ return di->mouse_b4;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
+ return di->mouse_b5;
+
+ case RETRO_DEVICE_ID_MOUSE_WHEELUP:
+ result = di->mouse_wu;
+ di->mouse_wu = false;
+ return result;
+
+ case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
+ result = di->mouse_wd;
+ di->mouse_wd = false;
+ return result;
+
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
+ result = di->mouse_hwu;
+ di->mouse_hwu = false;
+ return result;
+
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
+ result = di->mouse_hwd;
+ di->mouse_hwd = false;
+ return result;
+
+ }
+
+ return false;
+}
+
static bool dinput_is_pressed(struct dinput_input *di,
rarch_joypad_info_t joypad_info,
const struct retro_keybind *binds,
@@ -276,8 +329,13 @@ static bool dinput_is_pressed(struct dinput_input *di,
if (!di->blocked && (bind->key < RETROK_LAST) && dinput_keyboard_pressed(di, bind->key))
return true;
- if (binds && binds[id].valid && input_joypad_pressed(di->joypad, joypad_info, port, binds, id))
- return true;
+ if (binds && binds[id].valid)
+ {
+ if (dinput_mbutton_pressed(di, port, bind->mbutton))
+ return true;
+ if (input_joypad_pressed(di->joypad, joypad_info, port, binds, id))
+ return true;
+ }
return false;
}
@@ -334,10 +392,20 @@ static int16_t dinput_lightgun_state(struct dinput_input *di, unsigned id)
return 0;
}
-static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id)
+static int16_t dinput_mouse_state(struct dinput_input *di, unsigned port, unsigned id)
{
int16_t state = 0;
+ settings_t *settings = config_get_ptr();
+
+ if (port >= MAX_USERS)
+ return false;
+
+ /* the driver only supports one mouse */
+ if ( settings->uints.input_mouse_index[ port ] != 0 ) {
+ return 0;
+ }
+
switch (id)
{
case RETRO_DEVICE_ID_MOUSE_X:
@@ -379,8 +447,18 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id)
return 0;
}
-static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id)
+static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned port, unsigned id)
{
+ settings_t *settings = config_get_ptr();
+
+ if (port >= MAX_USERS)
+ return false;
+
+ /* the driver only supports one mouse */
+ if ( settings->uints.input_mouse_index[ port ] != 0 ) {
+ return 0;
+ }
+
switch (id)
{
case RETRO_DEVICE_ID_MOUSE_X:
@@ -391,7 +469,7 @@ static int16_t dinput_mouse_state_screen(struct dinput_input *di, unsigned id)
break;
}
- return dinput_mouse_state(di, id);
+ return dinput_mouse_state(di, port, id);
}
static int16_t dinput_pointer_state(struct dinput_input *di,
@@ -494,10 +572,10 @@ static int16_t dinput_input_state(void *data,
return 0;
case RETRO_DEVICE_MOUSE:
- return dinput_mouse_state(di, id);
+ return dinput_mouse_state(di, port, id);
case RARCH_DEVICE_MOUSE_SCREEN:
- return dinput_mouse_state_screen(di, id);
+ return dinput_mouse_state_screen(di, port, id);
case RETRO_DEVICE_POINTER:
case RARCH_DEVICE_POINTER_SCREEN:
diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c
index cd844e838e..c7397d39d8 100644
--- a/input/drivers/winraw_input.c
+++ b/input/drivers/winraw_input.c
@@ -1,717 +1,764 @@
-/* RetroArch - A frontend for libretro.
- * Copyright (C) 2011-2017 - Daniel De Matteis
- *
- * RetroArch is free software: you can redistribute it and/or modify it under the terms
- * of the GNU General Public License as published by the Free Software Found-
- * ation, either version 3 of the License, or (at your option) any later version.
- *
- * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
- * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along with RetroArch.
- * If not, see .
- */
-
-#include
-
-#include "../input_driver.h"
-#include "../input_keymaps.h"
-
-#include "../../configuration.h"
-#include "../../gfx/video_driver.h"
-#include "../../verbosity.h"
-
-typedef struct
-{
- uint8_t keys[256];
-} winraw_keyboard_t;
-
-typedef struct
-{
- HANDLE hnd;
- LONG x, y, dlt_x, dlt_y;
- LONG whl_u, whl_d;
- bool btn_l, btn_m, btn_r, btn_b4, btn_b5;
-} winraw_mouse_t;
-
-typedef struct
-{
- bool kbd_mapp_block;
- bool mouse_grab;
- winraw_keyboard_t keyboard;
- HWND window;
- winraw_mouse_t *mice;
- const input_device_driver_t *joypad;
-} winraw_input_t;
-
-static winraw_keyboard_t *g_keyboard = NULL;
-static winraw_mouse_t *g_mice = NULL;
-static unsigned g_mouse_cnt = 0;
-static bool g_mouse_xy_mapping_ready = false;
-static double g_view_abs_ratio_x = 0.0;
-static double g_view_abs_ratio_y = 0.0;
-
-static HWND winraw_create_window(WNDPROC wnd_proc)
-{
- HWND wnd;
- WNDCLASSA wc = {0};
-
- wc.hInstance = GetModuleHandleA(NULL);
-
- if (!wc.hInstance)
- {
- RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError());
- return NULL;
- }
-
- wc.lpfnWndProc = wnd_proc;
- wc.lpszClassName = "winraw-input";
- if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
- {
- RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError());
- return NULL;
- }
-
- wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0,
- HWND_MESSAGE, NULL, NULL, NULL);
- if (!wnd)
- {
- RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError());
- goto error;
- }
-
- return wnd;
-
-error:
- UnregisterClassA(wc.lpszClassName, NULL);
- return NULL;
-}
-
-static void winraw_destroy_window(HWND wnd)
-{
- BOOL r;
-
- if (!wnd)
- return;
-
- r = DestroyWindow(wnd);
-
- if (!r)
- {
- RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError());
- }
-
- r = UnregisterClassA("winraw-input", NULL);
-
- if (!r)
- {
- RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError());
- }
-}
-
-static bool winraw_set_keyboard_input(HWND window)
-{
- RAWINPUTDEVICE rid;
- BOOL r;
-
- rid.dwFlags = window ? 0 : RIDEV_REMOVE;
- rid.hwndTarget = window;
- rid.usUsagePage = 0x01; /* generic desktop */
- rid.usUsage = 0x06; /* keyboard */
-
- r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
-
- if (!r)
- {
- RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError());
- return false;
- }
-
- return true;
-}
-
-static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt)
-{
- UINT r;
- unsigned i;
- char name[256];
- UINT name_size = sizeof(name);
-
- for (i = 0; i < mouse_cnt; ++i)
- {
- r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size);
- if (r == (UINT)-1 || r == 0)
- name[0] = '\0';
- RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name);
- }
-}
-
-static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt)
-{
- UINT i;
- POINT crs_pos;
- winraw_mouse_t *mice_r = NULL;
- unsigned mouse_cnt_r = 0;
- RAWINPUTDEVICELIST *devs = NULL;
- UINT dev_cnt = 0;
- UINT r = GetRawInputDeviceList(
- NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST));
-
- if (r == (UINT)-1)
- {
- RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError());
- goto error;
- }
-
- devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST));
- if (!devs)
- goto error;
-
- dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST));
- if (dev_cnt == (UINT)-1)
- {
- RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError());
- goto error;
- }
-
- for (i = 0; i < dev_cnt; ++i)
- mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0;
-
- if (mouse_cnt_r)
- {
- mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t));
- if (!mice_r)
- goto error;
-
- if (!GetCursorPos(&crs_pos))
- goto error;
-
- for (i = 0; i < mouse_cnt_r; ++i)
- {
- mice_r[i].x = crs_pos.x;
- mice_r[i].y = crs_pos.y;
- }
- }
-
- /* count is already checked, so this is safe */
- for (i = mouse_cnt_r = 0; i < dev_cnt; ++i)
- {
- if (devs[i].dwType == RIM_TYPEMOUSE)
- mice_r[mouse_cnt_r++].hnd = devs[i].hDevice;
- }
-
- winraw_log_mice_info(mice_r, mouse_cnt_r);
-
- *mice = mice_r;
- *mouse_cnt = mouse_cnt_r;
-
- return true;
-
-error:
- free(devs);
- free(mice_r);
- *mice = NULL;
- *mouse_cnt = 0;
- return false;
-}
-
-static bool winraw_set_mouse_input(HWND window, bool grab)
-{
- RAWINPUTDEVICE rid;
- BOOL r;
-
- if (window)
- rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0;
- else
- rid.dwFlags = RIDEV_REMOVE;
-
- rid.hwndTarget = window;
- rid.usUsagePage = 0x01; /* generic desktop */
- rid.usUsage = 0x02; /* mouse */
-
- r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
-
- if (!r)
- {
- RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError());
- return false;
- }
-
- return true;
-}
-
-static int16_t winraw_mouse_state(winraw_input_t *wr,
- unsigned port, bool abs, unsigned id)
-{
- unsigned i;
- settings_t *settings = config_get_ptr();
- winraw_mouse_t *mouse = NULL;
-
- if (port >= MAX_USERS)
- return 0;
-
- for (i = 0; i < g_mouse_cnt; ++i)
- {
- if (i == settings->uints.input_mouse_index[port])
- {
- mouse = &wr->mice[i];
- break;
- }
- }
-
- if (!mouse)
- return 0;
-
- switch (id)
- {
- case RETRO_DEVICE_ID_MOUSE_X:
- return abs ? mouse->x : mouse->dlt_x;
- case RETRO_DEVICE_ID_MOUSE_Y:
- return abs ? mouse->y : mouse->dlt_y;
- case RETRO_DEVICE_ID_MOUSE_LEFT:
- return mouse->btn_l ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_RIGHT:
- return mouse->btn_r ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_WHEELUP:
- return mouse->whl_u ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
- return mouse->whl_d ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_MIDDLE:
- return mouse->btn_m ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
- return mouse->btn_b4 ? 1 : 0;
- case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
- return mouse->btn_b5 ? 1 : 0;
- }
-
- return 0;
-}
-
-static int16_t winraw_joypad_state(winraw_input_t *wr,
- rarch_joypad_info_t joypad_info,
- const struct retro_keybind *binds,
- unsigned port, unsigned id)
-{
- const struct retro_keybind *bind = &binds[id];
- unsigned key = rarch_keysym_lut[(enum retro_key)bind->key];
-
- if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key])
- return 1;
-
- return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id);
-}
-
-static void winraw_init_mouse_xy_mapping()
-{
- struct video_viewport viewport;
- int center_x;
- int center_y;
- unsigned i;
-
- if (video_driver_get_viewport_info(&viewport))
- {
- center_x = viewport.x + viewport.width / 2;
- center_y = viewport.y + viewport.height / 2;
-
- for (i = 0; i < g_mouse_cnt; ++i)
- {
- g_mice[i].x = center_x;
- g_mice[i].y = center_y;
- }
-
- g_view_abs_ratio_x = (double)viewport.full_width / 65535.0;
- g_view_abs_ratio_y = (double)viewport.full_height / 65535.0;
-
- g_mouse_xy_mapping_ready = true;
- }
-}
-
-static int16_t winraw_lightgun_state(winraw_input_t *wr,
- unsigned port, unsigned id)
-{
- unsigned i;
- settings_t *settings = config_get_ptr();
- winraw_mouse_t *mouse = NULL;
-
- if (port >= MAX_USERS)
- return 0;
-
- for (i = 0; i < g_mouse_cnt; ++i)
- {
- if (i == settings->uints.input_mouse_index[port])
- {
- mouse = &wr->mice[i];
- break;
- }
- }
-
- if (!mouse)
- return 0;
-
- switch (id)
- {
- case RETRO_DEVICE_ID_LIGHTGUN_X:
- return mouse->dlt_x;
- case RETRO_DEVICE_ID_LIGHTGUN_Y:
- return mouse->dlt_y;
- case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
- return mouse->btn_l ? 1 : 0;
- case RETRO_DEVICE_ID_LIGHTGUN_CURSOR:
- return mouse->btn_m ? 1 : 0;
- case RETRO_DEVICE_ID_LIGHTGUN_TURBO:
- return mouse->btn_r ? 1 : 0;
- case RETRO_DEVICE_ID_LIGHTGUN_START:
- return (mouse->btn_m && mouse->btn_r) ? 1 : 0;
- case RETRO_DEVICE_ID_LIGHTGUN_PAUSE:
- return mouse->btn_m && mouse->btn_l ? 1 : 0;
- }
-
- return 0;
-}
-
-static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state)
-{
- POINT crs_pos;
-
- if (state->usFlags & MOUSE_MOVE_ABSOLUTE)
- {
- if (g_mouse_xy_mapping_ready)
- {
- state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX);
- state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY);
- InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x);
- InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y);
- mouse->x = state->lLastX;
- mouse->y = state->lLastY;
- }
- else
- winraw_init_mouse_xy_mapping();
- }
- else if (state->lLastX || state->lLastY)
- {
- InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX);
- InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY);
-
- if (!GetCursorPos(&crs_pos))
- {
- RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError());
- }
- else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos))
- {
- RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError());
- }
- else
- {
- mouse->x = crs_pos.x;
- mouse->y = crs_pos.y;
- }
- }
-
- if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
- mouse->btn_l = true;
- else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
- mouse->btn_l = false;
-
- if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
- mouse->btn_m = true;
- else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
- mouse->btn_m = false;
-
- if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
- mouse->btn_r = true;
- else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
- mouse->btn_r = false;
-
- if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
- mouse->btn_b4 = true;
- else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP)
- mouse->btn_b4 = false;
-
- if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN)
- mouse->btn_b5 = true;
- else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP)
- mouse->btn_b5 = false;
-
- if (state->usButtonFlags & RI_MOUSE_WHEEL)
- {
- if ((SHORT)state->usButtonData > 0)
- InterlockedExchange(&mouse->whl_u, 1);
- else if ((SHORT)state->usButtonData < 0)
- InterlockedExchange(&mouse->whl_d, 1);
- }
-}
-
-static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar)
-{
- static uint8_t data[1024];
- UINT r;
- unsigned i;
- RAWINPUT *ri = (RAWINPUT*)data;
- UINT size = sizeof(data);
-
- if (msg != WM_INPUT)
- return DefWindowProcA(wnd, msg, wpar, lpar);
-
- /* app is in the background */
- if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT)
- goto end;
-
- r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT,
- data, &size, sizeof(RAWINPUTHEADER));
- if (r == (UINT)-1)
- {
- RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n",
- GetLastError());
- goto end;
- }
-
- if (ri->header.dwType == RIM_TYPEKEYBOARD)
- {
- if (ri->data.keyboard.Message == WM_KEYDOWN)
- g_keyboard->keys[ri->data.keyboard.VKey] = 1;
- else if (ri->data.keyboard.Message == WM_KEYUP)
- g_keyboard->keys[ri->data.keyboard.VKey] = 0;
- }
- else if (ri->header.dwType == RIM_TYPEMOUSE)
- {
- for (i = 0; i < g_mouse_cnt; ++i)
- {
- if (g_mice[i].hnd == ri->header.hDevice)
- {
- winraw_update_mouse_state(&g_mice[i], &ri->data.mouse);
- break;
- }
- }
- }
-
-end:
- DefWindowProcA(wnd, msg, wpar, lpar);
- return 0;
-}
-
-static void *winraw_init(const char *joypad_driver)
-{
- bool r;
- winraw_input_t *wr = (winraw_input_t *)
- calloc(1, sizeof(winraw_input_t));
- g_keyboard = (winraw_keyboard_t*)
- calloc(1, sizeof(winraw_keyboard_t));
-
- if (!wr || !g_keyboard)
- goto error;
-
- RARCH_LOG("[WINRAW]: Initializing input driver... \n");
-
- input_keymaps_init_keyboard_lut(rarch_key_map_winraw);
-
- wr->window = winraw_create_window(winraw_callback);
- if (!wr->window)
- goto error;
-
- r = winraw_init_devices(&g_mice, &g_mouse_cnt);
- if (!r)
- goto error;
-
- if (!g_mouse_cnt)
- {
- RARCH_LOG("[WINRAW]: Mouse unavailable.\n");
- }
- else
- {
- wr->mice = (winraw_mouse_t*)
- malloc(g_mouse_cnt * sizeof(winraw_mouse_t));
- if (!wr->mice)
- goto error;
-
- memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t));
- }
-
- r = winraw_set_keyboard_input(wr->window);
- if (!r)
- goto error;
-
- r = winraw_set_mouse_input(wr->window, false);
- if (!r)
- goto error;
-
- wr->joypad = input_joypad_init_driver(joypad_driver, wr);
-
- return wr;
-
-error:
- if (wr && wr->window)
- {
- winraw_set_mouse_input(NULL, false);
- winraw_set_keyboard_input(NULL);
- winraw_destroy_window(wr->window);
- }
- free(g_keyboard);
- free(g_mice);
- if (wr)
- free(wr->mice);
- free(wr);
- return NULL;
-}
-
-static void winraw_poll(void *d)
-{
- unsigned i;
- winraw_input_t *wr = (winraw_input_t*)d;
-
- memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t));
-
- /* following keys are not handled by windows raw input api */
- wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0;
- wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0;
- wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0;
- wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0;
- wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0;
- wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0;
-
- for (i = 0; i < g_mouse_cnt; ++i)
- {
- wr->mice[i].x = g_mice[i].x;
- wr->mice[i].y = g_mice[i].y;
- wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0);
- wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0);
- wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0);
- wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0);
- wr->mice[i].btn_l = g_mice[i].btn_l;
- wr->mice[i].btn_m = g_mice[i].btn_m;
- wr->mice[i].btn_r = g_mice[i].btn_r;
- wr->mice[i].btn_b4 = g_mice[i].btn_b4;
- wr->mice[i].btn_b5 = g_mice[i].btn_b5;
- }
-
- if (wr->joypad)
- wr->joypad->poll();
-}
-
-static int16_t winraw_input_state(void *d,
- rarch_joypad_info_t joypad_info,
- const struct retro_keybind **binds,
- unsigned port, unsigned device, unsigned index, unsigned id)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- switch (device)
- {
- case RETRO_DEVICE_KEYBOARD:
- if (id < RETROK_LAST)
- {
- unsigned key = rarch_keysym_lut[(enum retro_key)id];
- return wr->keyboard.keys[key];
- }
- break;
- case RETRO_DEVICE_MOUSE:
- return winraw_mouse_state(wr, port, false, id);
- case RARCH_DEVICE_MOUSE_SCREEN:
- return winraw_mouse_state(wr, port, true, id);
- case RETRO_DEVICE_JOYPAD:
- return winraw_joypad_state(wr, joypad_info, binds[port], port, id);
- case RETRO_DEVICE_ANALOG:
- if (binds[port])
- return input_joypad_analog(wr->joypad, joypad_info,
- port, index, id, binds[port]);
- break;
- case RETRO_DEVICE_LIGHTGUN:
- return winraw_lightgun_state(wr, port, id);
- }
-
- return 0;
-}
-
-static bool winraw_meta_key_pressed(void *u1, int u2)
-{
- return false;
-}
-
-static void winraw_free(void *d)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- if (wr->joypad)
- wr->joypad->destroy();
- winraw_set_mouse_input(NULL, false);
- winraw_set_keyboard_input(NULL);
- winraw_destroy_window(wr->window);
- free(g_mice);
- free(g_keyboard);
- free(wr->mice);
- free(wr);
-
- g_mouse_xy_mapping_ready = false;
-}
-
-static uint64_t winraw_get_capabilities(void *u)
-{
- return (1 << RETRO_DEVICE_KEYBOARD) |
- (1 << RETRO_DEVICE_MOUSE) |
- (1 << RETRO_DEVICE_JOYPAD) |
- (1 << RETRO_DEVICE_ANALOG) |
- (1 << RETRO_DEVICE_LIGHTGUN);
-}
-
-static void winraw_grab_mouse(void *d, bool grab)
-{
- bool r = false;
- winraw_input_t *wr = (winraw_input_t*)d;
-
- if (grab == wr->mouse_grab)
- return;
-
- r = winraw_set_mouse_input(wr->window, grab);
- if (!r)
- return;
-
- wr->mouse_grab = grab;
-}
-
-static bool winraw_set_rumble(void *d, unsigned port,
- enum retro_rumble_effect effect, uint16_t strength)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- return input_joypad_set_rumble(wr->joypad, port, effect, strength);
-}
-
-static const input_device_driver_t *winraw_get_joypad_driver(void *d)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- return wr->joypad;
-}
-
-static bool winraw_keyboard_mapping_is_blocked(void *d)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- return wr->kbd_mapp_block;
-}
-
-static void winraw_keyboard_mapping_set_block(void *d, bool block)
-{
- winraw_input_t *wr = (winraw_input_t*)d;
-
- wr->kbd_mapp_block = block;
-}
-
-input_driver_t input_winraw = {
- winraw_init,
- winraw_poll,
- winraw_input_state,
- winraw_meta_key_pressed,
- winraw_free,
- NULL,
- NULL,
- winraw_get_capabilities,
- "raw",
- winraw_grab_mouse,
- NULL,
- winraw_set_rumble,
- winraw_get_joypad_driver,
- NULL,
- winraw_keyboard_mapping_is_blocked,
- winraw_keyboard_mapping_set_block,
-};
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2011-2017 - Daniel De Matteis
+ *
+ * RetroArch is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Found-
+ * ation, either version 3 of the License, or (at your option) any later version.
+ *
+ * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with RetroArch.
+ * If not, see .
+ */
+
+#include
+
+#include "../input_driver.h"
+#include "../input_keymaps.h"
+
+#include "../../configuration.h"
+#include "../../gfx/video_driver.h"
+#include "../../verbosity.h"
+
+typedef struct
+{
+ uint8_t keys[256];
+} winraw_keyboard_t;
+
+typedef struct
+{
+ HANDLE hnd;
+ LONG x, y, dlt_x, dlt_y;
+ LONG whl_u, whl_d;
+ bool btn_l, btn_m, btn_r, btn_b4, btn_b5;
+} winraw_mouse_t;
+
+typedef struct
+{
+ bool kbd_mapp_block;
+ bool mouse_grab;
+ winraw_keyboard_t keyboard;
+ HWND window;
+ winraw_mouse_t *mice;
+ const input_device_driver_t *joypad;
+} winraw_input_t;
+
+static winraw_keyboard_t *g_keyboard = NULL;
+static winraw_mouse_t *g_mice = NULL;
+static unsigned g_mouse_cnt = 0;
+static bool g_mouse_xy_mapping_ready = false;
+static double g_view_abs_ratio_x = 0.0;
+static double g_view_abs_ratio_y = 0.0;
+
+static HWND winraw_create_window(WNDPROC wnd_proc)
+{
+ HWND wnd;
+ WNDCLASSA wc = {0};
+
+ wc.hInstance = GetModuleHandleA(NULL);
+
+ if (!wc.hInstance)
+ {
+ RARCH_ERR("[WINRAW]: GetModuleHandleA failed with error %lu.\n", GetLastError());
+ return NULL;
+ }
+
+ wc.lpfnWndProc = wnd_proc;
+ wc.lpszClassName = "winraw-input";
+ if (!RegisterClassA(&wc) && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
+ {
+ RARCH_ERR("[WINRAW]: RegisterClassA failed with error %lu.\n", GetLastError());
+ return NULL;
+ }
+
+ wnd = CreateWindowExA(0, wc.lpszClassName, NULL, 0, 0, 0, 0, 0,
+ HWND_MESSAGE, NULL, NULL, NULL);
+ if (!wnd)
+ {
+ RARCH_ERR("[WINRAW]: CreateWindowExA failed with error %lu.\n", GetLastError());
+ goto error;
+ }
+
+ return wnd;
+
+error:
+ UnregisterClassA(wc.lpszClassName, NULL);
+ return NULL;
+}
+
+static void winraw_destroy_window(HWND wnd)
+{
+ BOOL r;
+
+ if (!wnd)
+ return;
+
+ r = DestroyWindow(wnd);
+
+ if (!r)
+ {
+ RARCH_WARN("[WINRAW]: DestroyWindow failed with error %lu.\n", GetLastError());
+ }
+
+ r = UnregisterClassA("winraw-input", NULL);
+
+ if (!r)
+ {
+ RARCH_WARN("[WINRAW]: UnregisterClassA failed with error %lu.\n", GetLastError());
+ }
+}
+
+static bool winraw_set_keyboard_input(HWND window)
+{
+ RAWINPUTDEVICE rid;
+ BOOL r;
+
+ rid.dwFlags = window ? 0 : RIDEV_REMOVE;
+ rid.hwndTarget = window;
+ rid.usUsagePage = 0x01; /* generic desktop */
+ rid.usUsage = 0x06; /* keyboard */
+
+ r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
+
+ if (!r)
+ {
+ RARCH_ERR("[WINRAW]: RegisterRawInputDevices failed with error %lu.\n", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+static void winraw_log_mice_info(winraw_mouse_t *mice, unsigned mouse_cnt)
+{
+ UINT r;
+ unsigned i;
+ char name[256];
+ UINT name_size = sizeof(name);
+
+ for (i = 0; i < mouse_cnt; ++i)
+ {
+ r = GetRawInputDeviceInfoA(mice[i].hnd, RIDI_DEVICENAME, name, &name_size);
+ if (r == (UINT)-1 || r == 0)
+ name[0] = '\0';
+ RARCH_LOG("[WINRAW]: Mouse #%u %s.\n", i, name);
+ }
+}
+
+static bool winraw_init_devices(winraw_mouse_t **mice, unsigned *mouse_cnt)
+{
+ UINT i;
+ POINT crs_pos;
+ winraw_mouse_t *mice_r = NULL;
+ unsigned mouse_cnt_r = 0;
+ RAWINPUTDEVICELIST *devs = NULL;
+ UINT dev_cnt = 0;
+ UINT r = GetRawInputDeviceList(
+ NULL, &dev_cnt, sizeof(RAWINPUTDEVICELIST));
+
+ if (r == (UINT)-1)
+ {
+ RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError());
+ goto error;
+ }
+
+ devs = (RAWINPUTDEVICELIST*)malloc(dev_cnt * sizeof(RAWINPUTDEVICELIST));
+ if (!devs)
+ goto error;
+
+ dev_cnt = GetRawInputDeviceList(devs, &dev_cnt, sizeof(RAWINPUTDEVICELIST));
+ if (dev_cnt == (UINT)-1)
+ {
+ RARCH_ERR("[WINRAW]: GetRawInputDeviceList failed with error %lu.\n", GetLastError());
+ goto error;
+ }
+
+ for (i = 0; i < dev_cnt; ++i)
+ mouse_cnt_r += devs[i].dwType == RIM_TYPEMOUSE ? 1 : 0;
+
+ if (mouse_cnt_r)
+ {
+ mice_r = (winraw_mouse_t*)calloc(1, mouse_cnt_r * sizeof(winraw_mouse_t));
+ if (!mice_r)
+ goto error;
+
+ if (!GetCursorPos(&crs_pos))
+ goto error;
+
+ for (i = 0; i < mouse_cnt_r; ++i)
+ {
+ mice_r[i].x = crs_pos.x;
+ mice_r[i].y = crs_pos.y;
+ }
+ }
+
+ /* count is already checked, so this is safe */
+ for (i = mouse_cnt_r = 0; i < dev_cnt; ++i)
+ {
+ if (devs[i].dwType == RIM_TYPEMOUSE)
+ mice_r[mouse_cnt_r++].hnd = devs[i].hDevice;
+ }
+
+ winraw_log_mice_info(mice_r, mouse_cnt_r);
+
+ *mice = mice_r;
+ *mouse_cnt = mouse_cnt_r;
+
+ return true;
+
+error:
+ free(devs);
+ free(mice_r);
+ *mice = NULL;
+ *mouse_cnt = 0;
+ return false;
+}
+
+static bool winraw_set_mouse_input(HWND window, bool grab)
+{
+ RAWINPUTDEVICE rid;
+ BOOL r;
+
+ if (window)
+ rid.dwFlags = grab ? RIDEV_CAPTUREMOUSE : 0;
+ else
+ rid.dwFlags = RIDEV_REMOVE;
+
+ rid.hwndTarget = window;
+ rid.usUsagePage = 0x01; /* generic desktop */
+ rid.usUsage = 0x02; /* mouse */
+
+ r = RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));
+
+ if (!r)
+ {
+ RARCH_ERR("[WINRAW]: RegisterRawInputDevice failed with error %lu.\n", GetLastError());
+ return false;
+ }
+
+ return true;
+}
+
+static int16_t winraw_mouse_state(winraw_input_t *wr,
+ unsigned port, bool abs, unsigned id)
+{
+ unsigned i;
+ settings_t *settings = config_get_ptr();
+ winraw_mouse_t *mouse = NULL;
+
+ if (port >= MAX_USERS)
+ return 0;
+
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ if (i == settings->uints.input_mouse_index[port])
+ {
+ mouse = &wr->mice[i];
+ break;
+ }
+ }
+
+ if (!mouse)
+ return 0;
+
+ switch (id)
+ {
+ case RETRO_DEVICE_ID_MOUSE_X:
+ return abs ? mouse->x : mouse->dlt_x;
+ case RETRO_DEVICE_ID_MOUSE_Y:
+ return abs ? mouse->y : mouse->dlt_y;
+ case RETRO_DEVICE_ID_MOUSE_LEFT:
+ return mouse->btn_l ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_RIGHT:
+ return mouse->btn_r ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_WHEELUP:
+ return mouse->whl_u ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
+ return mouse->whl_d ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_MIDDLE:
+ return mouse->btn_m ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
+ return mouse->btn_b4 ? 1 : 0;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
+ return mouse->btn_b5 ? 1 : 0;
+ }
+
+ return 0;
+}
+
+static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key)
+{
+ unsigned i;
+ bool result;
+ winraw_mouse_t *mouse = NULL;
+ settings_t *settings = config_get_ptr();
+
+ if (port >= MAX_USERS)
+ return false;
+
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ if (i == settings->uints.input_mouse_index[port])
+ {
+ mouse = &wr->mice[i];
+ break;
+ }
+ }
+
+ if (!mouse)
+ return false;
+
+ switch ( key )
+ {
+
+ case RETRO_DEVICE_ID_MOUSE_LEFT:
+ return mouse->btn_l;
+ case RETRO_DEVICE_ID_MOUSE_RIGHT:
+ return mouse->btn_r;
+ case RETRO_DEVICE_ID_MOUSE_MIDDLE:
+ return mouse->btn_m;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
+ return mouse->btn_b4;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
+ return mouse->btn_b5;
+ case RETRO_DEVICE_ID_MOUSE_WHEELUP:
+ return mouse->whl_u;
+ case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
+ return mouse->whl_d;
+ }
+
+ return false;
+}
+
+static int16_t winraw_joypad_state(winraw_input_t *wr,
+ rarch_joypad_info_t joypad_info,
+ const struct retro_keybind *binds,
+ unsigned port, unsigned id)
+{
+ const struct retro_keybind *bind = &binds[id];
+ unsigned key = rarch_keysym_lut[(enum retro_key)bind->key];
+
+ if (!wr->kbd_mapp_block && (bind->key < RETROK_LAST) && wr->keyboard.keys[key])
+ return 1;
+
+ if (binds && binds[id].valid && winraw_mbutton_pressed(wr, port, bind->mbutton))
+ return 1;
+
+ return input_joypad_pressed(wr->joypad, joypad_info, port, binds, id);
+}
+
+static void winraw_init_mouse_xy_mapping()
+{
+ struct video_viewport viewport;
+ int center_x;
+ int center_y;
+ unsigned i;
+
+ if (video_driver_get_viewport_info(&viewport))
+ {
+ center_x = viewport.x + viewport.width / 2;
+ center_y = viewport.y + viewport.height / 2;
+
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ g_mice[i].x = center_x;
+ g_mice[i].y = center_y;
+ }
+
+ g_view_abs_ratio_x = (double)viewport.full_width / 65535.0;
+ g_view_abs_ratio_y = (double)viewport.full_height / 65535.0;
+
+ g_mouse_xy_mapping_ready = true;
+ }
+}
+
+static int16_t winraw_lightgun_state(winraw_input_t *wr,
+ unsigned port, unsigned id)
+{
+ unsigned i;
+ settings_t *settings = config_get_ptr();
+ winraw_mouse_t *mouse = NULL;
+
+ if (port >= MAX_USERS)
+ return 0;
+
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ if (i == settings->uints.input_mouse_index[port])
+ {
+ mouse = &wr->mice[i];
+ break;
+ }
+ }
+
+ if (!mouse)
+ return 0;
+
+ switch (id)
+ {
+ case RETRO_DEVICE_ID_LIGHTGUN_X:
+ return mouse->dlt_x;
+ case RETRO_DEVICE_ID_LIGHTGUN_Y:
+ return mouse->dlt_y;
+ case RETRO_DEVICE_ID_LIGHTGUN_TRIGGER:
+ return mouse->btn_l ? 1 : 0;
+ case RETRO_DEVICE_ID_LIGHTGUN_CURSOR:
+ return mouse->btn_m ? 1 : 0;
+ case RETRO_DEVICE_ID_LIGHTGUN_TURBO:
+ return mouse->btn_r ? 1 : 0;
+ case RETRO_DEVICE_ID_LIGHTGUN_START:
+ return (mouse->btn_m && mouse->btn_r) ? 1 : 0;
+ case RETRO_DEVICE_ID_LIGHTGUN_PAUSE:
+ return mouse->btn_m && mouse->btn_l ? 1 : 0;
+ }
+
+ return 0;
+}
+
+static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state)
+{
+ POINT crs_pos;
+
+ if (state->usFlags & MOUSE_MOVE_ABSOLUTE)
+ {
+ if (g_mouse_xy_mapping_ready)
+ {
+ state->lLastX = (LONG)(g_view_abs_ratio_x * state->lLastX);
+ state->lLastY = (LONG)(g_view_abs_ratio_y * state->lLastY);
+ InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX - mouse->x);
+ InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY - mouse->y);
+ mouse->x = state->lLastX;
+ mouse->y = state->lLastY;
+ }
+ else
+ winraw_init_mouse_xy_mapping();
+ }
+ else if (state->lLastX || state->lLastY)
+ {
+ InterlockedExchangeAdd(&mouse->dlt_x, state->lLastX);
+ InterlockedExchangeAdd(&mouse->dlt_y, state->lLastY);
+
+ if (!GetCursorPos(&crs_pos))
+ {
+ RARCH_WARN("[WINRAW]: GetCursorPos failed with error %lu.\n", GetLastError());
+ }
+ else if (!ScreenToClient((HWND)video_driver_window_get(), &crs_pos))
+ {
+ RARCH_WARN("[WINRAW]: ScreenToClient failed with error %lu.\n", GetLastError());
+ }
+ else
+ {
+ mouse->x = crs_pos.x;
+ mouse->y = crs_pos.y;
+ }
+ }
+
+ if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_DOWN)
+ mouse->btn_l = true;
+ else if (state->usButtonFlags & RI_MOUSE_LEFT_BUTTON_UP)
+ mouse->btn_l = false;
+
+ if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_DOWN)
+ mouse->btn_m = true;
+ else if (state->usButtonFlags & RI_MOUSE_MIDDLE_BUTTON_UP)
+ mouse->btn_m = false;
+
+ if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_DOWN)
+ mouse->btn_r = true;
+ else if (state->usButtonFlags & RI_MOUSE_RIGHT_BUTTON_UP)
+ mouse->btn_r = false;
+
+ if (state->usButtonFlags & RI_MOUSE_BUTTON_4_DOWN)
+ mouse->btn_b4 = true;
+ else if (state->usButtonFlags & RI_MOUSE_BUTTON_4_UP)
+ mouse->btn_b4 = false;
+
+ if (state->usButtonFlags & RI_MOUSE_BUTTON_5_DOWN)
+ mouse->btn_b5 = true;
+ else if (state->usButtonFlags & RI_MOUSE_BUTTON_5_UP)
+ mouse->btn_b5 = false;
+
+ if (state->usButtonFlags & RI_MOUSE_WHEEL)
+ {
+ if ((SHORT)state->usButtonData > 0)
+ InterlockedExchange(&mouse->whl_u, 1);
+ else if ((SHORT)state->usButtonData < 0)
+ InterlockedExchange(&mouse->whl_d, 1);
+ }
+}
+
+static LRESULT CALLBACK winraw_callback(HWND wnd, UINT msg, WPARAM wpar, LPARAM lpar)
+{
+ static uint8_t data[1024];
+ UINT r;
+ unsigned i;
+ RAWINPUT *ri = (RAWINPUT*)data;
+ UINT size = sizeof(data);
+
+ if (msg != WM_INPUT)
+ return DefWindowProcA(wnd, msg, wpar, lpar);
+
+ /* app is in the background */
+ if (GET_RAWINPUT_CODE_WPARAM(wpar) != RIM_INPUT)
+ goto end;
+
+ r = GetRawInputData((HRAWINPUT)lpar, RID_INPUT,
+ data, &size, sizeof(RAWINPUTHEADER));
+ if (r == (UINT)-1)
+ {
+ RARCH_WARN("[WINRAW]: GetRawInputData failed with error %lu.\n",
+ GetLastError());
+ goto end;
+ }
+
+ if (ri->header.dwType == RIM_TYPEKEYBOARD)
+ {
+ if (ri->data.keyboard.Message == WM_KEYDOWN)
+ g_keyboard->keys[ri->data.keyboard.VKey] = 1;
+ else if (ri->data.keyboard.Message == WM_KEYUP)
+ g_keyboard->keys[ri->data.keyboard.VKey] = 0;
+ }
+ else if (ri->header.dwType == RIM_TYPEMOUSE)
+ {
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ if (g_mice[i].hnd == ri->header.hDevice)
+ {
+ winraw_update_mouse_state(&g_mice[i], &ri->data.mouse);
+ break;
+ }
+ }
+ }
+
+end:
+ DefWindowProcA(wnd, msg, wpar, lpar);
+ return 0;
+}
+
+static void *winraw_init(const char *joypad_driver)
+{
+ bool r;
+ winraw_input_t *wr = (winraw_input_t *)
+ calloc(1, sizeof(winraw_input_t));
+ g_keyboard = (winraw_keyboard_t*)
+ calloc(1, sizeof(winraw_keyboard_t));
+
+ if (!wr || !g_keyboard)
+ goto error;
+
+ RARCH_LOG("[WINRAW]: Initializing input driver... \n");
+
+ input_keymaps_init_keyboard_lut(rarch_key_map_winraw);
+
+ wr->window = winraw_create_window(winraw_callback);
+ if (!wr->window)
+ goto error;
+
+ r = winraw_init_devices(&g_mice, &g_mouse_cnt);
+ if (!r)
+ goto error;
+
+ if (!g_mouse_cnt)
+ {
+ RARCH_LOG("[WINRAW]: Mouse unavailable.\n");
+ }
+ else
+ {
+ wr->mice = (winraw_mouse_t*)
+ malloc(g_mouse_cnt * sizeof(winraw_mouse_t));
+ if (!wr->mice)
+ goto error;
+
+ memcpy(wr->mice, g_mice, g_mouse_cnt * sizeof(winraw_mouse_t));
+ }
+
+ r = winraw_set_keyboard_input(wr->window);
+ if (!r)
+ goto error;
+
+ r = winraw_set_mouse_input(wr->window, false);
+ if (!r)
+ goto error;
+
+ wr->joypad = input_joypad_init_driver(joypad_driver, wr);
+
+ return wr;
+
+error:
+ if (wr && wr->window)
+ {
+ winraw_set_mouse_input(NULL, false);
+ winraw_set_keyboard_input(NULL);
+ winraw_destroy_window(wr->window);
+ }
+ free(g_keyboard);
+ free(g_mice);
+ if (wr)
+ free(wr->mice);
+ free(wr);
+ return NULL;
+}
+
+static void winraw_poll(void *d)
+{
+ unsigned i;
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ memcpy(&wr->keyboard, g_keyboard, sizeof(winraw_keyboard_t));
+
+ /* following keys are not handled by windows raw input api */
+ wr->keyboard.keys[VK_LCONTROL] = GetAsyncKeyState(VK_LCONTROL) >> 1 ? 1 : 0;
+ wr->keyboard.keys[VK_RCONTROL] = GetAsyncKeyState(VK_RCONTROL) >> 1 ? 1 : 0;
+ wr->keyboard.keys[VK_LMENU] = GetAsyncKeyState(VK_LMENU) >> 1 ? 1 : 0;
+ wr->keyboard.keys[VK_RMENU] = GetAsyncKeyState(VK_RMENU) >> 1 ? 1 : 0;
+ wr->keyboard.keys[VK_LSHIFT] = GetAsyncKeyState(VK_LSHIFT) >> 1 ? 1 : 0;
+ wr->keyboard.keys[VK_RSHIFT] = GetAsyncKeyState(VK_RSHIFT) >> 1 ? 1 : 0;
+
+ for (i = 0; i < g_mouse_cnt; ++i)
+ {
+ wr->mice[i].x = g_mice[i].x;
+ wr->mice[i].y = g_mice[i].y;
+ wr->mice[i].dlt_x = InterlockedExchange(&g_mice[i].dlt_x, 0);
+ wr->mice[i].dlt_y = InterlockedExchange(&g_mice[i].dlt_y, 0);
+ wr->mice[i].whl_u = InterlockedExchange(&g_mice[i].whl_u, 0);
+ wr->mice[i].whl_d = InterlockedExchange(&g_mice[i].whl_d, 0);
+ wr->mice[i].btn_l = g_mice[i].btn_l;
+ wr->mice[i].btn_m = g_mice[i].btn_m;
+ wr->mice[i].btn_r = g_mice[i].btn_r;
+ wr->mice[i].btn_b4 = g_mice[i].btn_b4;
+ wr->mice[i].btn_b5 = g_mice[i].btn_b5;
+ }
+
+ if (wr->joypad)
+ wr->joypad->poll();
+}
+
+static int16_t winraw_input_state(void *d,
+ rarch_joypad_info_t joypad_info,
+ const struct retro_keybind **binds,
+ unsigned port, unsigned device, unsigned index, unsigned id)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ switch (device)
+ {
+ case RETRO_DEVICE_KEYBOARD:
+ if (id < RETROK_LAST)
+ {
+ unsigned key = rarch_keysym_lut[(enum retro_key)id];
+ return wr->keyboard.keys[key];
+ }
+ break;
+ case RETRO_DEVICE_MOUSE:
+ return winraw_mouse_state(wr, port, false, id);
+ case RARCH_DEVICE_MOUSE_SCREEN:
+ return winraw_mouse_state(wr, port, true, id);
+ case RETRO_DEVICE_JOYPAD:
+ return winraw_joypad_state(wr, joypad_info, binds[port], port, id);
+ case RETRO_DEVICE_ANALOG:
+ if (binds[port])
+ return input_joypad_analog(wr->joypad, joypad_info,
+ port, index, id, binds[port]);
+ break;
+ case RETRO_DEVICE_LIGHTGUN:
+ return winraw_lightgun_state(wr, port, id);
+ }
+
+ return 0;
+}
+
+static bool winraw_meta_key_pressed(void *u1, int u2)
+{
+ return false;
+}
+
+static void winraw_free(void *d)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ if (wr->joypad)
+ wr->joypad->destroy();
+ winraw_set_mouse_input(NULL, false);
+ winraw_set_keyboard_input(NULL);
+ winraw_destroy_window(wr->window);
+ free(g_mice);
+ free(g_keyboard);
+ free(wr->mice);
+ free(wr);
+
+ g_mouse_xy_mapping_ready = false;
+}
+
+static uint64_t winraw_get_capabilities(void *u)
+{
+ return (1 << RETRO_DEVICE_KEYBOARD) |
+ (1 << RETRO_DEVICE_MOUSE) |
+ (1 << RETRO_DEVICE_JOYPAD) |
+ (1 << RETRO_DEVICE_ANALOG) |
+ (1 << RETRO_DEVICE_LIGHTGUN);
+}
+
+static void winraw_grab_mouse(void *d, bool grab)
+{
+ bool r = false;
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ if (grab == wr->mouse_grab)
+ return;
+
+ r = winraw_set_mouse_input(wr->window, grab);
+ if (!r)
+ return;
+
+ wr->mouse_grab = grab;
+}
+
+static bool winraw_set_rumble(void *d, unsigned port,
+ enum retro_rumble_effect effect, uint16_t strength)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ return input_joypad_set_rumble(wr->joypad, port, effect, strength);
+}
+
+static const input_device_driver_t *winraw_get_joypad_driver(void *d)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ return wr->joypad;
+}
+
+static bool winraw_keyboard_mapping_is_blocked(void *d)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ return wr->kbd_mapp_block;
+}
+
+static void winraw_keyboard_mapping_set_block(void *d, bool block)
+{
+ winraw_input_t *wr = (winraw_input_t*)d;
+
+ wr->kbd_mapp_block = block;
+}
+
+input_driver_t input_winraw = {
+ winraw_init,
+ winraw_poll,
+ winraw_input_state,
+ winraw_meta_key_pressed,
+ winraw_free,
+ NULL,
+ NULL,
+ winraw_get_capabilities,
+ "raw",
+ winraw_grab_mouse,
+ NULL,
+ winraw_set_rumble,
+ winraw_get_joypad_driver,
+ NULL,
+ winraw_keyboard_mapping_is_blocked,
+ winraw_keyboard_mapping_set_block,
+};
diff --git a/input/input_driver.c b/input/input_driver.c
index 522f6caab8..8a6751c06f 100644
--- a/input/input_driver.c
+++ b/input/input_driver.c
@@ -381,6 +381,7 @@ static const void *hid_data = NULL;
#define check_input_driver_block_hotkey(normal_bind, autoconf_bind) \
( \
(((normal_bind)->key != RETROK_UNKNOWN) \
+ || ((normal_bind)->mbutton != NO_BTN) \
|| ((normal_bind)->joykey != NO_BTN) \
|| ((normal_bind)->joyaxis != AXIS_NONE) \
|| ((autoconf_bind)->key != RETROK_UNKNOWN ) \
@@ -1744,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.
@@ -2410,6 +2446,55 @@ void input_config_parse_joy_axis(void *data, const char *prefix,
}
}
+void input_config_parse_mouse_button(void *data, const char *prefix,
+ const char *btn, struct retro_keybind *bind)
+{
+ int val;
+ char str[256];
+ char tmp[64];
+ char key[64];
+ config_file_t *conf = (config_file_t*)data;
+
+ str[0] = tmp[0] = key[0] = '\0';
+
+ fill_pathname_join_delim(str, prefix, btn,
+ '_', sizeof(str));
+ fill_pathname_join_delim(key, str,
+ "mbtn", '_', sizeof(key));
+
+ if ( bind && config_get_array(conf, key, tmp, sizeof(tmp)) )
+ {
+ bind->mbutton = NO_BTN;
+
+ if ( tmp[0]=='w' )
+ {
+ switch ( tmp[1] ) {
+ case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELUP; break;
+ case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_WHEELDOWN; break;
+ case 'h':
+ {
+ switch ( tmp[2] ) {
+ case 'u': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP; break;
+ case 'd': bind->mbutton = RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN; break;
+ }
+ }
+ break;
+ }
+ }
+ else
+ {
+ val = atoi(tmp);
+ switch ( val ) {
+ case 1: bind->mbutton = RETRO_DEVICE_ID_MOUSE_LEFT; break;
+ case 2: bind->mbutton = RETRO_DEVICE_ID_MOUSE_RIGHT; break;
+ case 3: bind->mbutton = RETRO_DEVICE_ID_MOUSE_MIDDLE; break;
+ case 4: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_4; break;
+ case 5: bind->mbutton = RETRO_DEVICE_ID_MOUSE_BUTTON_5; break;
+ }
+ }
+ }
+}
+
static void input_config_get_bind_string_joykey(
char *buf, const char *prefix,
const struct retro_keybind *bind, size_t size)
@@ -2452,9 +2537,9 @@ static void input_config_get_bind_string_joykey(
{
if (bind->joykey_label &&
!string_is_empty(bind->joykey_label) && label_show)
- snprintf(buf, size, "%s%s (btn) ", prefix, bind->joykey_label);
+ snprintf(buf, size, "%s%s (btn)", prefix, bind->joykey_label);
else
- snprintf(buf, size, "%s%u (%s) ", prefix, (unsigned)bind->joykey,
+ snprintf(buf, size, "%s%u (%s)", prefix, (unsigned)bind->joykey,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE));
}
}
@@ -2482,7 +2567,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix,
dir = '+';
axis = AXIS_POS_GET(bind->joyaxis);
}
- snprintf(buf, size, "%s%c%u (%s) ", prefix, dir, axis,
+ snprintf(buf, size, "%s%c%u (%s)", prefix, dir, axis,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE));
}
}
@@ -2490,6 +2575,7 @@ static void input_config_get_bind_string_joyaxis(char *buf, const char *prefix,
void input_config_get_bind_string(char *buf, const struct retro_keybind *bind,
const struct retro_keybind *auto_bind, size_t size)
{
+ int delim = 0;
#ifndef RARCH_CONSOLE
char key[64];
char keybuf[64];
@@ -2507,17 +2593,68 @@ void input_config_get_bind_string(char *buf, const struct retro_keybind *bind,
else if (auto_bind && auto_bind->joyaxis != AXIS_NONE)
input_config_get_bind_string_joyaxis(buf, "Auto: ", auto_bind, size);
+ if ( *buf ) {
+ delim = 1;
+ }
+
#ifndef RARCH_CONSOLE
input_keymaps_translate_rk_to_str(bind->key, key, sizeof(key));
if (string_is_equal(key, file_path_str(FILE_PATH_NUL)))
*key = '\0';
/*empty?*/
if ( *key != '\0' ) {
+ if ( delim ) {
+ strlcat(buf, ", ", size);
+ }
snprintf(keybuf, sizeof(keybuf), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_KEY), key);
strlcat(buf, keybuf, size);
+ delim = 1;
}
#endif
+ if ( bind->mbutton != NO_BTN )
+ {
+ int tag = 0;
+ switch ( bind->mbutton )
+ {
+ case RETRO_DEVICE_ID_MOUSE_LEFT:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_RIGHT:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_MIDDLE:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_4:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_BUTTON_5:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_WHEELUP:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_WHEELDOWN:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP;
+ break;
+ case RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN:
+ tag = MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN;
+ break;
+ } /* switch ( bind->mbutton ) */
+
+ if ( tag != 0 ) {
+ if ( delim ) {
+ strlcat(buf, ", ", size);
+ }
+ strlcat( buf, msg_hash_to_str(tag), size );
+ delim = 1;
+ }
+ }
+
/*completely empty?*/
if ( *buf == '\0' ) {
strlcat(buf, "---", size);
diff --git a/input/input_driver.h b/input/input_driver.h
index d760e6fe43..c3084979a9 100644
--- a/input/input_driver.h
+++ b/input/input_driver.h
@@ -96,6 +96,8 @@ struct retro_keybind
enum msg_hash_enums enum_idx;
enum retro_key key;
+ uint16_t mbutton;
+
/* Joypad key. Joypad POV (hats)
* are embedded into this key as well. */
uint64_t joykey;
@@ -606,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.
*
@@ -759,6 +774,9 @@ void input_config_parse_joy_button(void *data, const char *prefix,
void input_config_parse_joy_axis(void *data, const char *prefix,
const char *axis, struct retro_keybind *bind);
+void input_config_parse_mouse_button(void *data, const char *prefix,
+ const char *btn, struct retro_keybind *bind);
+
void input_config_set_device_name(unsigned port, const char *name);
void input_config_clear_device_name(unsigned port);
diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h
index 142ffad5d7..db03e7ddd5 100644
--- a/intl/msg_hash_chs.h
+++ b/intl/msg_hash_chs.h
@@ -744,6 +744,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y键(左侧)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(键: %s)") /*FIXME:"(Key: %s)"*/
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"键盘控制器映射类型")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h
index 9e13d1de7d..6eeed496da 100644
--- a/intl/msg_hash_cht.h
+++ b/intl/msg_hash_cht.h
@@ -744,6 +744,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y鍵(左側)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(鍵: %s)") /*FIXME:"(Key: %s)"*/
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"鍵盤控制器映射類型")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h
index 44c710daff..7b8eb52625 100644
--- a/intl/msg_hash_de.h
+++ b/intl/msg_hash_de.h
@@ -751,6 +751,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y-Knopf (links)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Taste: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Typ der Keyboard-Controller-Abbildung")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_eo.h b/intl/msg_hash_eo.h
index c17db311bb..627cabb0e4 100644
--- a/intl/msg_hash_eo.h
+++ b/intl/msg_hash_eo.h
@@ -660,6 +660,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y button (left)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Key: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Keyboard Gamepad Mapping Type")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h
index fa1094a768..ad92c95526 100644
--- a/intl/msg_hash_fr.h
+++ b/intl/msg_hash_fr.h
@@ -745,6 +745,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Bouton Y (gauche)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Touche : %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Type de mappage manette/clavier")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h
index 2ebdad385b..d8f989e0ae 100644
--- a/intl/msg_hash_it.h
+++ b/intl/msg_hash_it.h
@@ -751,6 +751,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Pulsante Y (sinistro)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Tasto: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Tipo di mappatura del gamepad della tastiera")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h
index 3c772118af..eb233b64c6 100644
--- a/intl/msg_hash_ja.h
+++ b/intl/msg_hash_ja.h
@@ -769,6 +769,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Yボタン(左)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(キー: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"キーボードのゲームパッドマッピング式")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h
index f4e980e451..f05b7b4ceb 100644
--- a/intl/msg_hash_ko.h
+++ b/intl/msg_hash_ko.h
@@ -731,6 +731,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y 버튼 (좌)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(키: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"키보드 게임패드 설정 형식")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h
index d414566d66..aa441fa969 100644
--- a/intl/msg_hash_nl.h
+++ b/intl/msg_hash_nl.h
@@ -660,6 +660,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y knop (left)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Key: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Keyboard Gamepad Mapping Type")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h
index dcaeaebd75..c8ce759e90 100644
--- a/intl/msg_hash_pt_br.h
+++ b/intl/msg_hash_pt_br.h
@@ -757,6 +757,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Tecla: %s)"
)
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Tipo de Mapeamento para Gamepad no Teclado"
)
diff --git a/intl/msg_hash_pt_pt.h b/intl/msg_hash_pt_pt.h
index 800463bdc5..bfb5b7cb3a 100644
--- a/intl/msg_hash_pt_pt.h
+++ b/intl/msg_hash_pt_pt.h
@@ -731,6 +731,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Botão Y (esquerda)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Tecla: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Tipo de Mapeamento do Gamepad no Teclado")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h
index f2e9a9826a..dfa3f024c7 100644
--- a/intl/msg_hash_ru.h
+++ b/intl/msg_hash_ru.h
@@ -754,6 +754,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Кнопка Y")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Клавиша: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Тип отображения клавиатуры для геймпада")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h
index 1cbd3d133f..565e1b85f3 100644
--- a/intl/msg_hash_us.h
+++ b/intl/msg_hash_us.h
@@ -763,6 +763,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y button (left)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Key: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Keyboard Gamepad Mapping Type")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/intl/msg_hash_vn.h b/intl/msg_hash_vn.h
index ca95e43315..00adb3fc70 100644
--- a/intl/msg_hash_vn.h
+++ b/intl/msg_hash_vn.h
@@ -743,6 +743,24 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y,
"Y button (left)")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEY,
"(Key: %s)")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ "MOUSE1")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ "MOUSE2")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ "MOUSE3")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ "MOUSE4")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ "MOUSE5")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ "MWHEELUP")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ "MWHEELDN")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ "MWHEELLEFT")
+MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
+ "MWHEELRIGHT")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_KEYBOARD_GAMEPAD_MAPPING_TYPE,
"Keyboard Gamepad Mapping Type")
MSG_HASH(MENU_ENUM_LABEL_VALUE_INPUT_MAX_USERS,
diff --git a/menu/cbs/menu_cbs_scan.c b/menu/cbs/menu_cbs_scan.c
index 965e99207e..213b6b8ad1 100644
--- a/menu/cbs/menu_cbs_scan.c
+++ b/menu/cbs/menu_cbs_scan.c
@@ -144,6 +144,7 @@ static int action_scan_input_desc(const char *path,
target->key = RETROK_UNKNOWN;
target->joykey = NO_BTN;
target->joyaxis = AXIS_NONE;
+ target->mbutton = NO_BTN;
}
return 0;
diff --git a/menu/menu_setting.c b/menu/menu_setting.c
index bb39557308..17e388340b 100644
--- a/menu/menu_setting.c
+++ b/menu/menu_setting.c
@@ -1441,6 +1441,7 @@ static int setting_action_ok_bind_defaults(void *data, bool wraparound)
target->key = def_binds[i - MENU_SETTINGS_BIND_BEGIN].key;
target->joykey = NO_BTN;
target->joyaxis = AXIS_NONE;
+ target->mbutton = NO_BTN;
}
return 0;
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),
diff --git a/msg_hash.h b/msg_hash.h
index 8d43407884..8eb389a235 100644
--- a/msg_hash.h
+++ b/msg_hash.h
@@ -547,6 +547,15 @@ enum msg_hash_enums
MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3,
MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3,
MENU_ENUM_LABEL_VALUE_INPUT_KEY,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_LEFT,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_RIGHT,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_MIDDLE,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON4,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_BUTTON5,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_UP,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_WHEEL_DOWN,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_UP,
+ MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_HORIZ_WHEEL_DOWN,
MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X,
MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y,
MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X,
diff --git a/setting_list.c b/setting_list.c
index ebb84273fd..1b69342c31 100644
--- a/setting_list.c
+++ b/setting_list.c
@@ -131,6 +131,8 @@ static int setting_bind_action_start(void *data)
bind_type = setting_get_bind_type(setting);
keybind->key = def_binds[bind_type - MENU_SETTINGS_BIND_BEGIN].key;
+ keybind->mbutton = NO_BTN;
+
return 0;
}
#endif