diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c
index ee51738995aa8c0a47ee33d834b3e753c28ce373..f4dd80fd22c6496c597d2670dd6e51db7df221b5 100644
--- a/src/conio/sdl_con.c
+++ b/src/conio/sdl_con.c
@@ -59,7 +59,6 @@ SDL_sem *sdl_ufunc_ret;
 SDL_sem *sdl_ufunc_rec;
 SDL_mutex *sdl_ufunc_mtx;
 int sdl_ufunc_retval;
-SDL_mutex	*funcret_mutex;
 
 SDL_sem	*sdl_flush_sem;
 int pending_updates=0;
@@ -387,15 +386,16 @@ void sdl_user_func(int func, ...)
 	ev.user.data2=NULL;
 	ev.user.code=func;
 	va_start(argptr, func);
+	sdl.mutexP(sdl_ufunc_mtx);
 	switch(func) {
 		case SDL_USEREVENT_SETICON:
 			ev.user.data1=va_arg(argptr, void *);
 			if((ev.user.data2=(unsigned long *)malloc(sizeof(unsigned long)))==NULL) {
+				sdl.mutexV(sdl_ufunc_mtx);
 				va_end(argptr);
 				return;
 			}
 			*(unsigned long *)ev.user.data2=va_arg(argptr, unsigned long);
-			sdl.mutexP(sdl_ufunc_mtx);
 			while(1) {
 				while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
 					YIELD();
@@ -403,15 +403,14 @@ void sdl_user_func(int func, ...)
 					continue;
 				break;
 			}
-			sdl.mutexV(sdl_ufunc_mtx);
 			break;
 		case SDL_USEREVENT_SETNAME:
 		case SDL_USEREVENT_SETTITLE:
 			if((ev.user.data1=strdup(va_arg(argptr, char *)))==NULL) {
+				sdl.mutexV(sdl_ufunc_mtx);
 				va_end(argptr);
 				return;
 			}
-			sdl.mutexP(sdl_ufunc_mtx);
 			while(1) {
 				while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
 					YIELD();
@@ -419,11 +418,9 @@ void sdl_user_func(int func, ...)
 					continue;
 				break;
 			};
-			sdl.mutexV(sdl_ufunc_mtx);
 			break;
 		case SDL_USEREVENT_UPDATERECT:
 			ev.user.data1=va_arg(argptr, struct update_rect *);
-			sdl.mutexP(sdl_ufunc_mtx);
 			while(1) {
 				while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
 					YIELD();
@@ -431,13 +428,11 @@ void sdl_user_func(int func, ...)
 					continue;
 				break;
 			}
-			sdl.mutexV(sdl_ufunc_mtx);
 			break;
 		case SDL_USEREVENT_COPY:
 		case SDL_USEREVENT_PASTE:
 		case SDL_USEREVENT_SHOWMOUSE:
 		case SDL_USEREVENT_HIDEMOUSE:
-			sdl.mutexP(sdl_ufunc_mtx);
 			while(1) {
 				while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1)
 					YIELD();
@@ -445,9 +440,9 @@ void sdl_user_func(int func, ...)
 					continue;
 				break;
 			}
-			sdl.mutexV(sdl_ufunc_mtx);
 			break;
 	}
+	sdl.mutexV(sdl_ufunc_mtx);
 	va_end(argptr);
 }
 
@@ -458,7 +453,6 @@ int sdl_user_func_ret(int func, ...)
 	SDL_Event	ev;
 	int		passed=FALSE;
 
-	sdl.mutexP(funcret_mutex);
 	ev.type=SDL_USEREVENT;
 	ev.user.data1=NULL;
 	ev.user.data2=NULL;
@@ -485,18 +479,16 @@ int sdl_user_func_ret(int func, ...)
 			 */
 			if(sdl.SemWaitTimeout(sdl_ufunc_rec, 1000)!=0)
 				continue;
-			sdl.mutexV(sdl_ufunc_mtx);
 			if(sdl.SemWait(sdl_ufunc_ret)==0)
 				break;
 		}
 		else {
-			sdl.mutexV(sdl_ufunc_mtx);
 			sdl_ufunc_retval=-1;
 			break;
 		}
 	}
+	sdl.mutexV(sdl_ufunc_mtx);
 	va_end(argptr);
-	sdl.mutexV(funcret_mutex);
 	return(sdl_ufunc_retval);
 }
 
@@ -1547,11 +1539,13 @@ int sdl_video_event_thread(void *data)
 								yuv.win_height=ev.resize.h;
 							}
 							else {
-								pthread_mutex_lock(&vstatlock);
-								vstat.scaling=(int)(ev.resize.w/(vstat.charwidth*vstat.cols));
-								if(vstat.scaling < 1)
-									vstat.scaling=1;
-								pthread_mutex_unlock(&vstatlock);
+								if (vstat.scaling!=(int)(ev.resize.w/(vstat.charwidth*vstat.cols))) {
+									pthread_mutex_lock(&vstatlock);
+									vstat.scaling=(int)(ev.resize.w/(vstat.charwidth*vstat.cols));
+									if(vstat.scaling < 1)
+										vstat.scaling=1;
+									pthread_mutex_unlock(&vstatlock);
+								}
 							}
 							setup_surfaces();
 						}
@@ -1576,14 +1570,13 @@ int sdl_video_event_thread(void *data)
 						break;
 					case SDL_USEREVENT: {
 						/* Tell SDL to do various stuff... */
+						sdl.SemPost(sdl_ufunc_rec);
 						switch(ev.user.code) {
 							case SDL_USEREVENT_QUIT:
-								sdl.SemPost(sdl_ufunc_rec);
 								sdl_ufunc_retval=0;
 								sdl.SemPost(sdl_ufunc_ret);
 								return(0);
 							case SDL_USEREVENT_UPDATERECT:
-								sdl.SemPost(sdl_ufunc_rec);
 								{
 									struct update_rect *rect=(struct update_rect *)ev.user.data1;
 									SDL_Rect r;
@@ -1629,7 +1622,6 @@ int sdl_video_event_thread(void *data)
 								}
 								break;
 							case SDL_USEREVENT_FLUSH:
-								sdl.SemPost(sdl_ufunc_rec);
 								if(win && new_rect) {
 									if(yuv.enabled) {
 										if(new_rect && yuv.overlay && yuv.changed) {
@@ -1654,12 +1646,10 @@ int sdl_video_event_thread(void *data)
 								sdl.SemPost(sdl_ufunc_ret);
 								break;
 							case SDL_USEREVENT_SETNAME:
-								sdl.SemPost(sdl_ufunc_rec);
 								sdl.WM_SetCaption((char *)ev.user.data1,(char *)ev.user.data1);
 								free(ev.user.data1);
 								break;
 							case SDL_USEREVENT_SETICON:
-								sdl.SemPost(sdl_ufunc_rec);
 								if(sdl_icon != NULL)
 									sdl.FreeSurface(sdl_icon);
 								sdl_icon=sdl.CreateRGBSurfaceFrom(ev.user.data1
@@ -1676,12 +1666,10 @@ int sdl_video_event_thread(void *data)
 								free(ev.user.data2);
 								break;
 							case SDL_USEREVENT_SETTITLE:
-								sdl.SemPost(sdl_ufunc_rec);
 								sdl.WM_SetCaption((char *)ev.user.data1,NULL);
 								free(ev.user.data1);
 								break;
 							case SDL_USEREVENT_SETVIDMODE:
-								sdl.SemPost(sdl_ufunc_rec);
 								if(!yuv.enabled) {
 									rectspace=vstat.cols*vstat.rows+vstat.cols;
 									rectsused=0;
@@ -1699,15 +1687,12 @@ int sdl_video_event_thread(void *data)
 								sdl.SemPost(sdl_ufunc_ret);
 								break;
 							case SDL_USEREVENT_HIDEMOUSE:
-								sdl.SemPost(sdl_ufunc_rec);
 								sdl.ShowCursor(SDL_DISABLE);
 								break;
 							case SDL_USEREVENT_SHOWMOUSE:
-								sdl.SemPost(sdl_ufunc_rec);
 								sdl.ShowCursor(SDL_ENABLE);
 								break;
 							case SDL_USEREVENT_INIT:
-								sdl.SemPost(sdl_ufunc_rec);
 								if(!sdl_init_good) {
 									if(sdl.WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO) {
 										if(win != NULL) {
@@ -1722,7 +1707,6 @@ int sdl_video_event_thread(void *data)
 								sdl.SemPost(sdl_ufunc_ret);
 								break;
 							case SDL_USEREVENT_COPY:
-								sdl.SemPost(sdl_ufunc_rec);
 #if !defined(NO_X) && defined(__unix__) && defined(SDL_VIDEO_DRIVER_X11)
 								if(sdl_x11available && sdl_using_x11) {
 									SDL_SysWMinfo	wmi;
@@ -1735,7 +1719,6 @@ int sdl_video_event_thread(void *data)
 #endif
 								break;
 							case SDL_USEREVENT_PASTE:
-								sdl.SemPost(sdl_ufunc_rec);
 #if !defined(NO_X) && defined(__unix__) && defined(SDL_VIDEO_DRIVER_X11)
 								if(sdl_x11available && sdl_using_x11) {
 									Window sowner=None;
@@ -1888,7 +1871,6 @@ int sdl_initciolib(int mode)
 	sdl_pastebuf_copied=sdl.SDL_CreateSemaphore(0);
 	sdl_copybuf_mutex=sdl.SDL_CreateMutex();
 #endif
-	funcret_mutex=sdl.SDL_CreateMutex();
 	run_sdl_drawing_thread(sdl_video_event_thread, exit_sdl_con);
 	return(sdl_init(mode));
 }