From 066cbea3c307791e99db12c2b9613fc12003cb32 Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 09:58:40 +0000 Subject: [PATCH 1/2] Add constants for mouse buttons 4&5 --- libretro-common/include/libretro.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 74820e7a3c..4d35ac7b41 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -208,6 +208,8 @@ extern "C" { #define RETRO_DEVICE_ID_MOUSE_MIDDLE 6 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELUP 7 #define RETRO_DEVICE_ID_MOUSE_HORIZ_WHEELDOWN 8 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_4 9 +#define RETRO_DEVICE_ID_MOUSE_BUTTON_5 10 /* Id values for LIGHTGUN types. */ #define RETRO_DEVICE_ID_LIGHTGUN_X 0 From 41df4a0555f4dc15a5796142d3ba753db8fd7cff Mon Sep 17 00:00:00 2001 From: David Walters Date: Fri, 17 Nov 2017 12:00:24 +0000 Subject: [PATCH 2/2] Support for mouse buttons 4&5 --- input/drivers/dinput.c | 8 +++++++- input/drivers/sdl_input.c | 8 +++++++- input/drivers/winraw_input.c | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e376dfb68e..f890444e46 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -85,7 +85,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; - bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; + bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; struct pointer_status pointer_head; /* dummy head for easier iteration */ }; @@ -246,6 +246,8 @@ static void dinput_poll(void *data) di->mouse_l = mouse_state.rgbButtons[0]; di->mouse_r = mouse_state.rgbButtons[1]; di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_b4 = mouse_state.rgbButtons[3]; + di->mouse_b5 = mouse_state.rgbButtons[4]; /* No simple way to get absolute coordinates * for RETRO_DEVICE_POINTER. Just use Win32 APIs. */ @@ -368,6 +370,10 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return state; 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; } return 0; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 83d18551d3..5b462d55ff 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -38,7 +38,7 @@ typedef struct sdl_input int mouse_x, mouse_y; int mouse_abs_x, mouse_abs_y; - int mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd, mouse_wl, mouse_wr; + int mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_wl, mouse_wr; } sdl_input_t; static void *sdl_input_init(const char *joypad_driver) @@ -131,6 +131,10 @@ static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) return sdl->mouse_y; case RETRO_DEVICE_ID_MOUSE_MIDDLE: return sdl->mouse_m; + case RETRO_DEVICE_ID_MOUSE_BUTTON_4: + return sdl->mouse_b4; + case RETRO_DEVICE_ID_MOUSE_BUTTON_5: + return sdl->mouse_b5; } return 0; @@ -310,6 +314,8 @@ static void sdl_poll_mouse(sdl_input_t *sdl) sdl->mouse_l = (SDL_BUTTON(SDL_BUTTON_LEFT) & btn) ? 1 : 0; sdl->mouse_r = (SDL_BUTTON(SDL_BUTTON_RIGHT) & btn) ? 1 : 0; sdl->mouse_m = (SDL_BUTTON(SDL_BUTTON_MIDDLE) & btn) ? 1 : 0; + sdl->mouse_b4 = (SDL_BUTTON(SDL_BUTTON_X1) & btn) ? 1 : 0; + sdl->mouse_b5 = (SDL_BUTTON(SDL_BUTTON_X2) & btn) ? 1 : 0; #ifndef HAVE_SDL2 sdl->mouse_wu = (SDL_BUTTON(SDL_BUTTON_WHEELUP) & btn) ? 1 : 0; sdl->mouse_wd = (SDL_BUTTON(SDL_BUTTON_WHEELDOWN) & btn) ? 1 : 0; diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index bb44a0b92e..cd844e838e 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -32,7 +32,7 @@ typedef struct HANDLE hnd; LONG x, y, dlt_x, dlt_y; LONG whl_u, whl_d; - bool btn_l, btn_m, btn_r; + bool btn_l, btn_m, btn_r, btn_b4, btn_b5; } winraw_mouse_t; typedef struct @@ -279,6 +279,10 @@ static int16_t winraw_mouse_state(winraw_input_t *wr, 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; @@ -419,6 +423,16 @@ static void winraw_update_mouse_state(winraw_mouse_t *mouse, RAWMOUSE *state) 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) @@ -566,6 +580,8 @@ static void winraw_poll(void *d) 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)