diff --git a/src/conio/ciolib.c b/src/conio/ciolib.c index 0e21e89aad67bbceae6594862e61e9bb0fec39c2..779f3dbab023694382d7020dc23a3df7e8267234 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 47600d71e96a468487ce645e9f844fffd84066f7..53ea90adca2ace7aa0ae2c1c7d900bf56f9d16e8 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 ae3a6c183c9843ff378d3fdeddffad528d0bbfb5..d7c46a075c2a67c3dfb9aec2e39c8f7e59d86a87 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); }