diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index 0915dfb8d8686266a3a0cb9ffc25e76b3b12c47d..3cee80e92f299c37ce00801694c55a6beb395946 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -101,6 +101,7 @@ enum {
 	,SDL_USEREVENT_COPY
 	,SDL_USEREVENT_PASTE
 	,SDL_USEREVENT_LOADFONT
+	,SDL_USEREVENT_QUIT
 };
 
 const struct sdl_keyvals sdl_keyval[] =
@@ -321,6 +322,10 @@ int sdl_user_func_ret(int func, ...)
 			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
 			passed=TRUE;
 			break;
+		case SDL_USEREVENT_QUIT:
+			while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1);
+			passed=TRUE;
+			break;
 	}
 	if(passed)
 		sdl.SemWait(sdl_ufunc_ret);
@@ -331,6 +336,11 @@ int sdl_user_func_ret(int func, ...)
 	return(sdl_ufunc_retval);
 }
 
+void exit_sdl_con(void)
+{
+	sdl_user_func_ret(SDL_USEREVENT_QUIT);
+}
+
 #if (defined(__MACH__) && defined(__APPLE__))
 int sdl_using_quartz=0;
 #endif
@@ -1496,6 +1506,11 @@ int sdl_video_event_thread(void *data)
 					case SDL_USEREVENT: {
 						/* Tell SDL to do various stuff... */
 						switch(ev.user.code) {
+							case SDL_USEREVENT_QUIT:
+								sdl_ufunc_retval=0;
+								sdl.Quit();
+								sdl.SemPost(sdl_ufunc_ret);
+								break;
 							case SDL_USEREVENT_LOADFONT:
 								sdl_ufunc_retval=sdl_load_font((char *)ev.user.data1);
 								FREE_AND_NULL(ev.user.data1);
@@ -1781,7 +1796,6 @@ int sdl_initciolib(int mode)
 	sdl_pastebuf_copied=sdl.SDL_CreateSemaphore(0);
 	sdl_copybuf_mutex=sdl.SDL_CreateMutex();
 #endif
-	sdl.CreateThread(sdl_video_event_thread, NULL);
+	run_sdl_drawing_thread(sdl_video_event_thread, exit_sdl_con);
 	return(sdl_init(mode));
 }
-