sdl2-compat: build: Add Objective-C code back in for macOS.

From 2644374d2344ef1819cf0d77eab9c62763de0216 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Sat, 26 Nov 2022 19:49:25 -0500
Subject: [PATCH] build: Add Objective-C code back in for macOS.

---
 CMakeLists.txt         |  5 ++-
 src/sdl2_compat_objc.m | 72 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 3 deletions(-)
 create mode 100644 src/sdl2_compat_objc.m

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3e8f9de..975074f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -27,9 +27,8 @@ include(GNUInstallDirs)
 set(CMAKE_SKIP_RPATH TRUE)
 
 if(APPLE)
-# !!! FIXME: assuming we don't need this; if so, remove this.
-  #set(OSX_SRCS "src/sdl2_compat_objc.m")
-  #set_source_files_properties(${OSX_SRCS} PROPERTIES LANGUAGE C)
+  set(OSX_SRCS "src/sdl2_compat_objc.m")
+  set_source_files_properties(${OSX_SRCS} PROPERTIES LANGUAGE C)
 
 #  # !!! FIXME: what does SDL2 expect here?
 #  # compatibility version set to match SDL-1.2 autotools build
diff --git a/src/sdl2_compat_objc.m b/src/sdl2_compat_objc.m
new file mode 100644
index 0000000..30b97b3
--- /dev/null
+++ b/src/sdl2_compat_objc.m
@@ -0,0 +1,72 @@
+/*
+  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.
+*/
+
+/* This file contains some macOS-specific support code */
+
+#define __BUILDING_SDL12_COMPAT__ 1
+#include "SDL.h"
+
+#ifdef __MACOSX__
+#include <Cocoa/Cocoa.h>
+
+#if __GNUC__ >= 4
+#define SDL12_PRIVATE __attribute__((visibility("hidden")))
+#else
+#define SDL12_PRIVATE __private_extern__
+#endif
+
+/* This has to be in a separate, Objective-C source file because it calls
+   into Cocoa. The issue is that SDL 1.2 apps on macOS are statically linked
+   with SDLmain, which does something mac-specific that conflicts with SDL2
+   before the app's main() is even called, and we have to counteract that. */
+
+SDL12_PRIVATE void sdl12_compat_macos_init(void)
+{
+    [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+}
+
+#ifndef MAC_OS_X_VERSION_10_12
+#define NSAlertStyleCritical NSCriticalAlertStyle
+#endif
+
+SDL12_PRIVATE void error_dialog(const char *errorMsg)
+{
+    NSAlert *alert;
+
+    if (NSApp == nil) {
+        ProcessSerialNumber psn = { 0, kCurrentProcess };
+        TransformProcessType(&psn, kProcessTransformToForegroundApplication);
+        [NSApplication sharedApplication];
+        [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
+        [NSApp finishLaunching];
+    }
+
+    [NSApp activateIgnoringOtherApps:YES];
+    alert = [[[NSAlert alloc] init] autorelease];
+    alert.alertStyle = NSAlertStyleCritical;
+    alert.messageText = @"Fatal error! Cannot continue!";
+    alert.informativeText = [NSString stringWithCString:errorMsg encoding:NSASCIIStringEncoding];
+    [alert runModal];
+}
+#endif
+
+/* vi: set ts=4 sw=4 expandtab: */
+