SDL: riscos: Add a basic implementation of SDL_ShowCursor()

From 6eda520f64dd751ebbb8aba4b065f76a9eb1ce1f Mon Sep 17 00:00:00 2001
From: Cameron Cawley <[EMAIL REDACTED]>
Date: Wed, 25 May 2022 21:40:28 +0100
Subject: [PATCH] riscos: Add a basic implementation of SDL_ShowCursor()

---
 src/video/riscos/SDL_riscosmodes.c |  5 +-
 src/video/riscos/SDL_riscosmouse.c | 88 ++++++++++++++++++++++++++++++
 src/video/riscos/SDL_riscosmouse.h | 30 ++++++++++
 src/video/riscos/SDL_riscosvideo.c |  5 ++
 4 files changed, 126 insertions(+), 2 deletions(-)
 create mode 100644 src/video/riscos/SDL_riscosmouse.c
 create mode 100644 src/video/riscos/SDL_riscosmouse.h

diff --git a/src/video/riscos/SDL_riscosmodes.c b/src/video/riscos/SDL_riscosmodes.c
index 0e87c140edd..9500b222976 100644
--- a/src/video/riscos/SDL_riscosmodes.c
+++ b/src/video/riscos/SDL_riscosmodes.c
@@ -23,6 +23,7 @@
 #if SDL_VIDEO_DRIVER_RISCOS
 
 #include "../SDL_sysvideo.h"
+#include "../../events/SDL_mouse_c.h"
 
 #include "SDL_riscosvideo.h"
 #include "SDL_riscosmodes.h"
@@ -304,8 +305,8 @@ RISCOS_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
         _kernel_oswrch(disable_cursor[i]);
     }
 
-    /* Turn the mouse pointer on */
-    /* _kernel_osbyte(106, 1, 0); */
+    /* Update cursor visibility, since it may have been disabled by the mode change. */
+    SDL_SetCursor(NULL);
 
     return 0;
 }
diff --git a/src/video/riscos/SDL_riscosmouse.c b/src/video/riscos/SDL_riscosmouse.c
new file mode 100644
index 00000000000..072f8a7a1f0
--- /dev/null
+++ b/src/video/riscos/SDL_riscosmouse.c
@@ -0,0 +1,88 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "../../SDL_internal.h"
+
+#if SDL_VIDEO_DRIVER_RISCOS
+
+#include "../../events/SDL_mouse_c.h"
+
+#include <kernel.h>
+
+
+static SDL_Cursor *
+RISCOS_CreateDefaultCursor()
+{
+    SDL_Cursor *cursor;
+
+    cursor = SDL_calloc(1, sizeof(*cursor));
+    if (cursor) {
+        /* NULL is used to indicate the default cursor */
+        cursor->driverdata = NULL;
+    } else {
+        SDL_OutOfMemory();
+    }
+
+    return cursor;
+}
+
+static void
+RISCOS_FreeCursor(SDL_Cursor * cursor)
+{
+    SDL_free(cursor);
+}
+
+static int
+RISCOS_ShowCursor(SDL_Cursor * cursor)
+{
+    if (cursor) {
+        /* Turn the mouse pointer on */
+        _kernel_osbyte(106, 1, 0);
+    } else {
+        /* Turn the mouse pointer off */
+        _kernel_osbyte(106, 0, 0);
+    }
+
+    return 0;
+}
+
+int
+RISCOS_InitMouse(_THIS)
+{
+    SDL_Mouse *mouse = SDL_GetMouse();
+
+    /* mouse->CreateCursor = RISCOS_CreateCursor; */
+    /* mouse->CreateSystemCursor = RISCOS_CreateSystemCursor; */
+    mouse->ShowCursor = RISCOS_ShowCursor;
+    mouse->FreeCursor = RISCOS_FreeCursor;
+    /* mouse->WarpMouse = RISCOS_WarpMouse; */
+    /* mouse->WarpMouseGlobal = RISCOS_WarpMouseGlobal; */
+    /* mouse->SetRelativeMouseMode = RISCOS_SetRelativeMouseMode; */
+    /* mouse->CaptureMouse = RISCOS_CaptureMouse; */
+    /* mouse->GetGlobalMouseState = RISCOS_GetGlobalMouseState; */
+
+    SDL_SetDefaultCursor(RISCOS_CreateDefaultCursor());
+
+    return 0;
+}
+
+#endif /* SDL_VIDEO_DRIVER_RISCOS */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/video/riscos/SDL_riscosmouse.h b/src/video/riscos/SDL_riscosmouse.h
new file mode 100644
index 00000000000..3048d7d2c43
--- /dev/null
+++ b/src/video/riscos/SDL_riscosmouse.h
@@ -0,0 +1,30 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+#include "../../SDL_internal.h"
+
+#ifndef SDL_riscosmouse_h_
+#define SDL_riscosmouse_h_
+
+extern int RISCOS_InitMouse(_THIS);
+
+#endif /* SDL_riscosmouse_h_ */
+
+/* vi: set ts=4 sw=4 expandtab: */
diff --git a/src/video/riscos/SDL_riscosvideo.c b/src/video/riscos/SDL_riscosvideo.c
index 1d8bd3d952d..ebd4952a59c 100644
--- a/src/video/riscos/SDL_riscosvideo.c
+++ b/src/video/riscos/SDL_riscosvideo.c
@@ -31,6 +31,7 @@
 #include "SDL_riscosvideo.h"
 #include "SDL_riscosevents_c.h"
 #include "SDL_riscosframebuffer_c.h"
+#include "SDL_riscosmouse.h"
 #include "SDL_riscosmodes.h"
 #include "SDL_riscoswindow.h"
 
@@ -105,6 +106,10 @@ RISCOS_VideoInit(_THIS)
         return -1;
     }
 
+    if (RISCOS_InitMouse(_this) < 0) {
+        return -1;
+    }
+
     if (RISCOS_InitModes(_this) < 0) {
         return -1;
     }