From 1268984edce4184d932edb13fc7e1e7333a8f912 Mon Sep 17 00:00:00 2001 From: Cameron Cawley Date: Thu, 9 Sep 2021 21:09:50 +0100 Subject: [PATCH] Implement mouse input on RISC OS --- src/video/riscos/SDL_riscosevents.c | 43 +++++++++++++++++++++++++++++ src/video/riscos/SDL_riscosmodes.c | 3 ++ src/video/riscos/SDL_riscosvideo.h | 1 + 3 files changed, 47 insertions(+) diff --git a/src/video/riscos/SDL_riscosevents.c b/src/video/riscos/SDL_riscosevents.c index b571d759b..3dbc3d0dc 100644 --- a/src/video/riscos/SDL_riscosevents.c +++ b/src/video/riscos/SDL_riscosevents.c @@ -30,6 +30,7 @@ #include "scancodes_riscos.h" #include +#include static SDL_Scancode SDL_RISCOS_translate_keycode(int keycode) @@ -104,6 +105,47 @@ RISCOS_PollKeyboard(_THIS) } } +static const Uint8 mouse_button_map[] = { + SDL_BUTTON_RIGHT, + SDL_BUTTON_MIDDLE, + SDL_BUTTON_LEFT, + SDL_BUTTON_X1, + SDL_BUTTON_X2, + SDL_BUTTON_X2 + 1, + SDL_BUTTON_X2 + 2, + SDL_BUTTON_X2 + 3 +}; + +void +RISCOS_PollMouse(_THIS) +{ + SDL_VideoData *driverdata = (SDL_VideoData *)_this->driverdata; + SDL_Mouse *mouse = SDL_GetMouse(); + SDL_Rect rect; + _kernel_swi_regs regs; + int i, x, y, buttons; + + if (SDL_GetDisplayBounds(0, &rect) < 0) { + return; + } + + _kernel_swi(OS_Mouse, ®s, ®s); + x = (regs.r[0] >> 1); + y = rect.h - (regs.r[1] >> 1); + buttons = regs.r[2]; + + if (mouse->x != x || mouse->y != y) { + SDL_SendMouseMotion(mouse->focus, mouse->mouseID, 0, x, y); + } + + if (driverdata->last_mouse_buttons != buttons) { + for (i = 0; i < SDL_arraysize(mouse_button_map); i++) { + SDL_SendMouseButton(mouse->focus, mouse->mouseID, (buttons & (1 << i)) ? SDL_PRESSED : SDL_RELEASED, mouse_button_map[i]); + } + driverdata->last_mouse_buttons = buttons; + } +} + int RISCOS_InitEvents(_THIS) { @@ -126,6 +168,7 @@ RISCOS_InitEvents(_THIS) void RISCOS_PumpEvents(_THIS) { + RISCOS_PollMouse(_this); RISCOS_PollKeyboard(_this); } diff --git a/src/video/riscos/SDL_riscosmodes.c b/src/video/riscos/SDL_riscosmodes.c index be723907b..7b35c5d93 100644 --- a/src/video/riscos/SDL_riscosmodes.c +++ b/src/video/riscos/SDL_riscosmodes.c @@ -247,6 +247,9 @@ RISCOS_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) _kernel_oswrch(disable_cursor[i]); } + /* Turn the mouse pointer on */ + _kernel_osbyte(106, 1, 0); + return 0; } diff --git a/src/video/riscos/SDL_riscosvideo.h b/src/video/riscos/SDL_riscosvideo.h index 7be93afc3..a7480d8b1 100644 --- a/src/video/riscos/SDL_riscosvideo.h +++ b/src/video/riscos/SDL_riscosvideo.h @@ -29,6 +29,7 @@ typedef struct SDL_VideoData { + int last_mouse_buttons; Uint8 key_pressed[RISCOS_MAX_KEYS_PRESSED]; } SDL_VideoData;