sdl12-compat: provide a default cursor

From b6226508974a855f69641143fca28746e9e434fa Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Wed, 28 Jul 2021 14:22:20 +0300
Subject: [PATCH] provide a default cursor

Fixes https://github.com/libsdl-org/sdl12-compat/issues/125
---
 src/SDL12_compat.c   |  13 ++++-
 src/default_cursor.h | 114 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 126 insertions(+), 1 deletion(-)
 create mode 100644 src/default_cursor.h

diff --git a/src/SDL12_compat.c b/src/SDL12_compat.c
index 89663af..44823f0 100644
--- a/src/SDL12_compat.c
+++ b/src/SDL12_compat.c
@@ -1710,6 +1710,10 @@ Init12VidModes(void)
     return 0;
 }
 
+/* we should have a default cursor */
+#include "default_cursor.h"
+DECLSPEC void SDLCALL SDL_FreeCursor(SDL12_Cursor *);
+
 static int
 Init12Video(void)
 {
@@ -1897,7 +1901,7 @@ Quit12Video(void)
     VideoInfoVfmt20 = NULL;
     EventFilter12 = NULL;
     EventQueueAvailable = EventQueueHead = EventQueueTail = NULL;
-    CurrentCursor12 = NULL;
+    SDL_FreeCursor(CurrentCursor12);
     VideoModes = NULL;
     VideoModesCount = 0;
 }
@@ -3788,6 +3792,9 @@ SDL_ListModes(const SDL12_PixelFormat *format12, Uint32 flags)
 DECLSPEC void SDLCALL
 SDL_FreeCursor(SDL12_Cursor *cursor12)
 {
+    if (cursor12 == CurrentCursor12) {
+        CurrentCursor12 = NULL;
+    }
     if (cursor12) {
         if (cursor12->wm_cursor) {
             SDL20_FreeCursor(cursor12->wm_cursor);
@@ -3857,6 +3864,10 @@ SDL_SetCursor(SDL12_Cursor *cursor)
 DECLSPEC SDL12_Cursor * SDLCALL
 SDL_GetCursor(void)
 {
+    if (!CurrentCursor12) {
+        CurrentCursor12 = SDL_CreateCursor(default_cdata, default_cmask,
+                            DEFAULT_CWIDTH, DEFAULT_CHEIGHT, DEFAULT_CHOTX, DEFAULT_CHOTY);
+    }
     return CurrentCursor12;
 }
 
diff --git a/src/default_cursor.h b/src/default_cursor.h
new file mode 100644
index 0000000..0a888f4
--- /dev/null
+++ b/src/default_cursor.h
@@ -0,0 +1,114 @@
+/*
+  Simple DirectMedia Layer
+  Copyright (C) 1997-2021 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.
+*/
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Default cursor - it happens to be the Mac cursor, but could be anything */
+
+#define DEFAULT_CWIDTH  16
+#define DEFAULT_CHEIGHT 16
+#define DEFAULT_CHOTX   0
+#define DEFAULT_CHOTY   0
+
+/* Added a real MacOS cursor, at the request of Luc-Olivier de Charrire */
+#define USE_MACOS_CURSOR
+
+#ifdef USE_MACOS_CURSOR
+
+static unsigned char default_cdata[] = {
+    0x00, 0x00,
+    0x40, 0x00,
+    0x60, 0x00,
+    0x70, 0x00,
+    0x78, 0x00,
+    0x7C, 0x00,
+    0x7E, 0x00,
+    0x7F, 0x00,
+    0x7F, 0x80,
+    0x7C, 0x00,
+    0x6C, 0x00,
+    0x46, 0x00,
+    0x06, 0x00,
+    0x03, 0x00,
+    0x03, 0x00,
+    0x00, 0x00
+};
+
+static unsigned char default_cmask[] = {
+    0xC0, 0x00,
+    0xE0, 0x00,
+    0xF0, 0x00,
+    0xF8, 0x00,
+    0xFC, 0x00,
+    0xFE, 0x00,
+    0xFF, 0x00,
+    0xFF, 0x80,
+    0xFF, 0xC0,
+    0xFF, 0xE0,
+    0xFE, 0x00,
+    0xEF, 0x00,
+    0xCF, 0x00,
+    0x87, 0x80,
+    0x07, 0x80,
+    0x03, 0x00
+};
+
+#else
+
+static unsigned char default_cdata[] = {
+    0x00, 0x00,
+    0x40, 0x00,
+    0x60, 0x00,
+    0x70, 0x00,
+    0x78, 0x00,
+    0x7C, 0x00,
+    0x7E, 0x00,
+    0x7F, 0x00,
+    0x7F, 0x80,
+    0x7C, 0x00,
+    0x6C, 0x00,
+    0x46, 0x00,
+    0x06, 0x00,
+    0x03, 0x00,
+    0x03, 0x00,
+    0x00, 0x00
+};
+
+static unsigned char default_cmask[] = {
+    0x40, 0x00,
+    0xE0, 0x00,
+    0xF0, 0x00,
+    0xF8, 0x00,
+    0xFC, 0x00,
+    0xFE, 0x00,
+    0xFF, 0x00,
+    0xFF, 0x80,
+    0xFF, 0xC0,
+    0xFF, 0x80,
+    0xFE, 0x00,
+    0xEF, 0x00,
+    0x4F, 0x00,
+    0x07, 0x80,
+    0x07, 0x80,
+    0x03, 0x00
+};
+
+#endif /* USE_MACOS_CURSOR */
+/* vi: set ts=4 sw=4 expandtab: */