diff --git a/input/dinput.c b/input/dinput.c index 4aa59ecb41..222ba366e6 100644 --- a/input/dinput.c +++ b/input/dinput.c @@ -51,7 +51,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; - bool mouse_l, mouse_r, mouse_m; + bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd; struct pointer_status pointer_head; // dummy head for easier iteration }; @@ -187,9 +187,11 @@ static void dinput_poll(void *data) di->mouse_rel_x = mouse_state.lX; di->mouse_rel_y = mouse_state.lY; - di->mouse_l = mouse_state.rgbButtons[0]; - di->mouse_r = mouse_state.rgbButtons[1]; - di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_l = mouse_state.rgbButtons[0]; + di->mouse_r = mouse_state.rgbButtons[1]; + di->mouse_m = mouse_state.rgbButtons[2]; + di->mouse_wu = mouse_state.rgbButtons[3]; + di->mouse_wd = mouse_state.rgbButtons[4]; // No simple way to get absolute coordinates for RETRO_DEVICE_POINTER. Just use Win32 APIs. POINT point = {0}; @@ -279,6 +281,10 @@ static int16_t dinput_mouse_state(struct dinput_input *di, unsigned id) return di->mouse_l; case RETRO_DEVICE_ID_MOUSE_RIGHT: return di->mouse_r; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return di->mouse_wu; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return di->mouse_wd; default: return 0; } diff --git a/input/sdl_input.c b/input/sdl_input.c index b0277c122f..b829488946 100644 --- a/input/sdl_input.c +++ b/input/sdl_input.c @@ -30,7 +30,7 @@ typedef struct sdl_input int mouse_x, mouse_y; int mouse_abs_x, mouse_abs_y; - int mouse_l, mouse_r, mouse_m; + int mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd; } sdl_input_t; static void *sdl_input_init(void) @@ -120,6 +120,10 @@ static int16_t sdl_mouse_device_state(sdl_input_t *sdl, unsigned id) return sdl->mouse_l; case RETRO_DEVICE_ID_MOUSE_RIGHT: return sdl->mouse_r; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return sdl->mouse_wu; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return sdl->mouse_wd; case RETRO_DEVICE_ID_MOUSE_X: return sdl->mouse_x; case RETRO_DEVICE_ID_MOUSE_Y: @@ -245,9 +249,11 @@ static void sdl_poll_mouse(sdl_input_t *sdl) { Uint8 btn = SDL_GetRelativeMouseState(&sdl->mouse_x, &sdl->mouse_y); SDL_GetMouseState(&sdl->mouse_abs_x, &sdl->mouse_abs_y); - 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_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_wu = SDL_BUTTON(SDL_BUTTON_WHEELUP) & btn ? 1 : 0; + sdl->mouse_wd = SDL_BUTTON(SDL_BUTTON_WHEELDOWN) & btn ? 1 : 0; } static void sdl_input_poll(void *data) diff --git a/input/udev_input.c b/input/udev_input.c index db8ff9bec0..5956427e6a 100644 --- a/input/udev_input.c +++ b/input/udev_input.c @@ -98,7 +98,7 @@ struct udev_input int16_t mouse_x; int16_t mouse_y; - bool mouse_l, mouse_r, mouse_m; + bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd; }; static inline bool get_bit(const uint8_t *buf, unsigned bit) @@ -232,6 +232,7 @@ static void udev_handle_mouse(udev_input_t *udev, const struct input_event *even switch (event->type) { case EV_KEY: + /* TODO: mouse wheel up/down */ switch (event->code) { case BTN_LEFT: @@ -245,7 +246,6 @@ static void udev_handle_mouse(udev_input_t *udev, const struct input_event *even case BTN_MIDDLE: udev->mouse_m = event->value; break; - default: break; } diff --git a/input/x11_input.c b/input/x11_input.c index 14a3302051..4a0cd58e43 100644 --- a/input/x11_input.c +++ b/input/x11_input.c @@ -34,7 +34,7 @@ typedef struct x11_input Window win; char state[32]; - bool mouse_l, mouse_r, mouse_m; + bool mouse_l, mouse_r, mouse_m, mouse_wu, mouse_wd; int mouse_x, mouse_y; int mouse_last_x, mouse_last_y; @@ -115,6 +115,10 @@ static int16_t x_mouse_state(x11_input_t *x11, unsigned id) return x11->mouse_l; case RETRO_DEVICE_ID_MOUSE_RIGHT: return x11->mouse_r; + case RETRO_DEVICE_ID_MOUSE_WHEELUP: + return x11->mouse_wu; + case RETRO_DEVICE_ID_MOUSE_WHEELDOWN: + return x11->mouse_wd; default: return 0; } @@ -240,11 +244,13 @@ static void x_input_poll_mouse(x11_input_t *x11) &win_x, &win_y, &mask); - x11->mouse_x = win_x; - x11->mouse_y = win_y; - x11->mouse_l = mask & Button1Mask; - x11->mouse_m = mask & Button2Mask; - x11->mouse_r = mask & Button3Mask; + x11->mouse_x = win_x; + x11->mouse_y = win_y; + x11->mouse_l = mask & Button1Mask; + x11->mouse_m = mask & Button2Mask; + x11->mouse_r = mask & Button3Mask; + x11->mouse_wu = mask & Button4Mask; + x11->mouse_wd = mask & Button5Mask; // Somewhat hacky, but seem to do the job. if (x11->grab_mouse && video_focus_func()) diff --git a/libretro.h b/libretro.h index 1ac47cee09..c68a668eae 100755 --- a/libretro.h +++ b/libretro.h @@ -138,10 +138,12 @@ extern "C" { #define RETRO_DEVICE_ID_ANALOG_Y 1 // Id values for MOUSE. -#define RETRO_DEVICE_ID_MOUSE_X 0 -#define RETRO_DEVICE_ID_MOUSE_Y 1 -#define RETRO_DEVICE_ID_MOUSE_LEFT 2 -#define RETRO_DEVICE_ID_MOUSE_RIGHT 3 +#define RETRO_DEVICE_ID_MOUSE_X 0 +#define RETRO_DEVICE_ID_MOUSE_Y 1 +#define RETRO_DEVICE_ID_MOUSE_LEFT 2 +#define RETRO_DEVICE_ID_MOUSE_RIGHT 3 +#define RETRO_DEVICE_ID_MOUSE_WHEELUP 4 +#define RETRO_DEVICE_ID_MOUSE_WHEELDOWN 5 // Id values for LIGHTGUN types. #define RETRO_DEVICE_ID_LIGHTGUN_X 0 diff --git a/ps3/ps3_input.c b/ps3/ps3_input.c index 9bb2b28053..a0749651d3 100644 --- a/ps3/ps3_input.c +++ b/ps3/ps3_input.c @@ -313,6 +313,7 @@ static int16_t ps3_mouse_device_state(void *data, unsigned player, unsigned id) switch (id) { + /* TODO: mouse wheel up/down */ case RETRO_DEVICE_ID_MOUSE_LEFT: return (!ps3->mice_connected ? 0 : mouse_state.buttons & CELL_MOUSE_BUTTON_1); case RETRO_DEVICE_ID_MOUSE_RIGHT: