diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index 611020bc805562940b47b42f94a514deb6d9e825..7bdb141f77b551fbfa6c0e543d4708759cd3a3dd 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -325,7 +325,9 @@ static int sdl_user_func_ret(int func, ...) void exit_sdl_con(void) { - sdl_user_func(SDL_USEREVENT_QUIT); + // Avoid calling exit(0) from an atexit() function... + ciolib_reaper = 0; + sdl_user_func_ret(SDL_USEREVENT_QUIT); } void sdl_copytext(const char *text, size_t buflen) @@ -550,6 +552,7 @@ int sdl_init(int mode) return(0); } + ciolib_reaper = 0; sdl_user_func_ret(SDL_USEREVENT_QUIT); return(-1); } @@ -1331,7 +1334,7 @@ static void sdl_video_event_thread(void *data) * X is hit. */ if (ciolib_reaper) - exit(0); + sdl_user_func(SDL_USEREVENT_QUIT); else sdl_add_key(CIO_KEY_QUIT); break; @@ -1380,6 +1383,8 @@ static void sdl_video_event_thread(void *data) switch(ev.user.code) { case SDL_USEREVENT_QUIT: sdl_ufunc_retval=0; + if (ciolib_reaper) + exit(0); sdl.SemPost(sdl_ufunc_ret); return; case SDL_USEREVENT_FLUSH: @@ -1408,7 +1413,9 @@ static void sdl_video_event_thread(void *data) sdl.mutexV(win_mutex); break; case SDL_USEREVENT_SETNAME: + sdl.mutexP(win_mutex); sdl.SetWindowTitle(win, (char *)ev.user.data1); + sdl.mutexV(win_mutex); free(ev.user.data1); break; case SDL_USEREVENT_SETICON: @@ -1424,11 +1431,15 @@ static void sdl_video_event_thread(void *data) , *(DWORD *)"\0\0\377\0" , *(DWORD *)"\0\0\0\377" ); + sdl.mutexP(win_mutex); sdl.SetWindowIcon(win, sdl_icon); + sdl.mutexV(win_mutex); free(ev.user.data2); break; case SDL_USEREVENT_SETTITLE: + sdl.mutexP(win_mutex); sdl.SetWindowTitle(win, (char *)ev.user.data1); + sdl.mutexV(win_mutex); free(ev.user.data1); break; case SDL_USEREVENT_SETVIDMODE: @@ -1462,7 +1473,9 @@ static void sdl_video_event_thread(void *data) SDL_SysWMinfo wmi; SDL_VERSION(&(wmi.version)); + sdl.mutexP(win_mutex); sdl.GetWindowWMInfo(win, &wmi); + sdl.mutexV(win_mutex); sdl.EventState(SDL_SYSWMEVENT, SDL_ENABLE); copy_needs_events = 1; sdl_x11.XSetSelectionOwner(wmi.info.x11.display, CONSOLE_CLIPBOARD, wmi.info.x11.window, CurrentTime); @@ -1476,7 +1489,9 @@ static void sdl_video_event_thread(void *data) SDL_SysWMinfo wmi; SDL_VERSION(&(wmi.version)); + sdl.mutexP(win_mutex); sdl.GetWindowWMInfo(win, &wmi); + sdl.mutexV(win_mutex); paste_needs_events = 1; sdl.EventState(SDL_SYSWMEVENT, SDL_ENABLE); @@ -1545,7 +1560,9 @@ static void sdl_video_event_thread(void *data) SDL_SysWMinfo wmi; SDL_VERSION(&(wmi.version)); + sdl.mutexP(win_mutex); sdl.GetWindowWMInfo(win, &wmi); + sdl.mutexV(win_mutex); req=&(e->xselection); if(req->requestor!=wmi.info.x11.window) break;