diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index e2ecf8a8ca05674b2474b0c612b509fd8f022f48..a697ed7f7056e2a5819141550c80de60ebf7c057 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -56,7 +56,6 @@ static SDL_Thread *mouse_thread; char *sdl_copybuf=NULL; char *sdl_pastebuf=NULL; -SDL_mutex *sdl_ufunc_lock; SDL_sem *sdl_ufunc_ret; int sdl_ufunc_retval; @@ -275,6 +274,12 @@ void yuv_fillrect(SDL_Overlay *overlay, SDL_Rect *r, int dac_entry) int uplane,vplane; /* Planar formats */ int y0pack, y1pack, u0pack, v0pack; /* Packed formats */ + if(r->x > overlay->w || r->y > overlay->h) + return; + if(r->x + r->w > overlay->w) + r->w=overlay->w-r->x; + if(r->y + r->h > overlay->h) + r->h=overlay->h-r->y; yuv.changed=1; switch(overlay->format) { case SDL_IYUV_OVERLAY: @@ -367,47 +372,65 @@ packed: void sdl_user_func(int func, ...) { va_list argptr; - SDL_Event ev; + SDL_Event ev[2]; - ev.type=SDL_USEREVENT; - ev.user.data1=NULL; - ev.user.data2=NULL; - ev.user.code=func; + ev[0].type=SDL_USEREVENT; + ev[0].user.data1=NULL; + ev[0].user.data2=NULL; + ev[0].user.code=func; va_start(argptr, func); switch(func) { case SDL_USEREVENT_SETNAME: - if((ev.user.data1=strdup(va_arg(argptr, char *)))==NULL) { + if((ev[0].user.data1=strdup(va_arg(argptr, char *)))==NULL) { va_end(argptr); return; } - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); + while(sdl.PeepEvents(ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); break; case SDL_USEREVENT_SETICON: - ev.user.data1=va_arg(argptr, void *); - if((ev.user.data2=(unsigned long *)malloc(sizeof(unsigned long)))==NULL) { + ev[0].user.data1=va_arg(argptr, void *); + if((ev[0].user.data2=(unsigned long *)malloc(sizeof(unsigned long)))==NULL) { va_end(argptr); return; } - *(unsigned long *)ev.user.data2=va_arg(argptr, unsigned long); - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); + *(unsigned long *)ev[0].user.data2=va_arg(argptr, unsigned long); + while(sdl.PeepEvents(ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); break; case SDL_USEREVENT_SETTITLE: - if((ev.user.data1=strdup(va_arg(argptr, char *)))==NULL) { + if((ev[0].user.data1=strdup(va_arg(argptr, char *)))==NULL) { va_end(argptr); return; } - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); + while(sdl.PeepEvents(ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); break; case SDL_USEREVENT_UPDATERECT: - ev.user.data1=va_arg(argptr, struct update_rect *); - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); + ev[0].user.data1=va_arg(argptr, struct update_rect *); + while(sdl.PeepEvents(ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); break; case SDL_USEREVENT_SETVIDMODE: + { + int remain=2; + int ret=0; + + ev[0].user.code=SDL_USEREVENT_FLUSH; + ev[1].type=SDL_USEREVENT; + ev[1].user.data1=NULL; + ev[1].user.data2=NULL; + ev[1].user.code=func; + while(remain) { + ret=sdl.PeepEvents(&(ev[2-remain]), remain, SDL_ADDEVENT, 0xffffffff); + if(ret!=-1) + remain-=ret; + } + /* Wait for flush */ + sdl.SemWait(sdl_ufunc_ret); + break; + } case SDL_USEREVENT_COPY: case SDL_USEREVENT_PASTE: case SDL_USEREVENT_SHOWMOUSE: case SDL_USEREVENT_HIDEMOUSE: - while(sdl.PeepEvents(&ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); + while(sdl.PeepEvents(ev, 1, SDL_ADDEVENT, 0xffffffff)!=1); break; } va_end(argptr); @@ -420,7 +443,6 @@ int sdl_user_func_ret(int func, ...) SDL_Event ev; int passed=FALSE; - sdl.mutexP(sdl_ufunc_lock); ev.type=SDL_USEREVENT; ev.user.data1=NULL; ev.user.data2=NULL; @@ -438,7 +460,6 @@ int sdl_user_func_ret(int func, ...) sdl.SemWait(sdl_ufunc_ret); else sdl_ufunc_retval=-1; - sdl.mutexV(sdl_ufunc_lock); va_end(argptr); return(sdl_ufunc_retval); } @@ -1734,7 +1755,6 @@ int sdl_initciolib(int mode) sdl_key_pending=sdl.SDL_CreateSemaphore(0); sdl_ufunc_ret=sdl.SDL_CreateSemaphore(0); sdl_keylock=sdl.SDL_CreateMutex(); - sdl_ufunc_lock=sdl.SDL_CreateMutex(); #if !defined(NO_X) && defined(__unix__) sdl_pastebuf_set=sdl.SDL_CreateSemaphore(0); sdl_pastebuf_copied=sdl.SDL_CreateSemaphore(0);