From 3c05ba56c5963264f49c75499dc726a85fbf59e3 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sat, 25 Apr 2020 18:45:01 +0000
Subject: [PATCH] More hackery to ensure SDL_Init() is called from the main()
 function.

---
 src/conio/ciolib.c  | 14 +++++++++++++-
 src/conio/ciolib.h  |  3 +++
 src/conio/sdl_con.c |  8 +++++++-
 3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c
index 0e21e89aad..779f3dbab0 100644
--- a/src/conio/ciolib.c
+++ b/src/conio/ciolib.c
@@ -1882,7 +1882,11 @@ CIOLIBEXPORT enum ciolib_codepage CIOLIBCALL ciolib_getcodepage(void)
 #endif
 
 sem_t initsdl_sem;
+sem_t initsdldone_sem;
+sem_t startsdl_sem;
 sem_t main_sem;
+int initsdl_ret = -1;
+
 struct main_args {
 	int argc;
 	char **argv;
@@ -1897,6 +1901,7 @@ void main_stub(void *argptr)
 	args->ret = CIOLIB_main(args->argc, args->argv);
 	args->no_sdl = 1;
 	sem_post(&initsdl_sem);
+	sem_post(&startsdl_sem);
 	sem_post(&main_sem);
 	exit_sdl_con();
 }
@@ -1906,11 +1911,18 @@ int main(int argc, char **argv)
 	struct main_args ma = {argc, argv, -1, 0};
 
 	sem_init(&initsdl_sem, 0, 0);
+	sem_init(&initsdldone_sem, 0, 0);
+	sem_init(&startsdl_sem, 0, 0);
 	sem_init(&main_sem, 0, 0);
 	_beginthread(main_stub, 0, &ma);
 	sem_wait(&initsdl_sem);
 	if (!ma.no_sdl) {
-		sdl_video_event_thread(NULL);
+		initsdl_ret = init_sdl_video();
+		sem_post(&initsdldone_sem);
+		if (initsdl_ret != -1) {
+			sem_wait(&startsdl_sem);
+			sdl_video_event_thread(NULL);
+		}
 	}
 	sem_wait(&main_sem);
 	return ma.ret;
diff --git a/src/conio/ciolib.h b/src/conio/ciolib.h
index 47600d71e9..53ea90adca 100644
--- a/src/conio/ciolib.h
+++ b/src/conio/ciolib.h
@@ -561,6 +561,9 @@ CIOLIBEXPORT void CIOLIBCALL ansi_ciolib_setdoorway(int enable);
 #if defined(__DARWIN__)
 	extern sem_t initsdl_sem;
 	extern sem_t main_sem;
+	extern sem_t startsdl_sem;
+	extern sem_t initsdldone_sem;
+	extern int initsdl_ret;
 #endif
 #endif
 
diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index ae3a6c183c..d7c46a075c 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -372,7 +372,7 @@ int sdl_init(int mode)
 		fullscreen=1;
 	// Needs to be *after* bitmap_drv_init()
 #if defined(__DARWIN__)
-	sem_post(&initsdl_sem);
+	sem_post(&startsdl_sem);
 #else
 	_beginthread(sdl_video_event_thread, 0, NULL);
 #endif
@@ -1058,7 +1058,13 @@ void sdl_video_event_thread(void *data)
 
 int sdl_initciolib(int mode)
 {
+#if defined(__DARWIN__)
+	sem_post(&initsdl_sem);
+	sem_wait(&initsdldone_sem);
+	if (initsdl_ret) {
+#else
 	if(init_sdl_video()) {
+#endif
 		fprintf(stderr,"SDL Video Initialization Failed\n");
 		return(-1);
 	}
-- 
GitLab