diff --git a/src/conio/sdl_con.c b/src/conio/sdl_con.c index 0b9009728b20de3a250734e77c6bb3be48e6b264..c74765977327935f74dcdfebd65375033774906f 100644 --- a/src/conio/sdl_con.c +++ b/src/conio/sdl_con.c @@ -52,6 +52,7 @@ int sdl_exitcode=0; SDL_Surface *sdl_font=NULL; SDL_Surface *sdl_cursor=NULL; +SDL_Surface *sdl_icon=NULL; static int lastcursor_x=0; static int lastcursor_y=0; @@ -91,6 +92,7 @@ enum { SDL_USEREVENT_UPDATERECT ,SDL_USEREVENT_SETTITLE ,SDL_USEREVENT_SETNAME + ,SDL_USEREVENT_SETICON ,SDL_USEREVENT_SETVIDMODE ,SDL_USEREVENT_SHOWMOUSE ,SDL_USEREVENT_HIDEMOUSE @@ -259,6 +261,15 @@ void sdl_user_func(int func, ...) } 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) { + va_end(argptr); + return; + } + *(unsigned long *)ev.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) { va_end(argptr); @@ -861,6 +872,13 @@ int sdl_setname(const char *name) return(0); } +/* Called from main thread only (Passes Event) */ +int sdl_seticon(const void *icon, unsigned long size) +{ + sdl_user_func(SDL_USEREVENT_SETICON,icon,size); + return(0); +} + /* Called from main thread only (Passes Event) */ int sdl_settitle(const char *title) { @@ -1757,6 +1775,22 @@ int sdl_video_event_thread(void *data) sdl.WM_SetCaption((char *)ev.user.data1,(char *)ev.user.data1); free(ev.user.data1); break; + case SDL_USEREVENT_SETICON: + if(sdl_icon != NULL) + sdl.FreeSurface(sdl_icon); + sdl_icon=sdl.CreateRGBSurfaceFrom(ev.user.data1 + , *(unsigned long *)ev.user.data2 + , *(unsigned long *)ev.user.data2 + , 32 + , *(unsigned long *)ev.user.data2*4 + , *(DWORD *)"\377\0\0\0" + , *(DWORD *)"\0\377\0\0" + , *(DWORD *)"\0\0\377\0" + , *(DWORD *)"\0\0\0\377" + ); + sdl.WM_SetIcon(sdl_icon,NULL); + free(ev.user.data2); + break; case SDL_USEREVENT_SETTITLE: sdl.WM_SetCaption((char *)ev.user.data1,NULL); free(ev.user.data1); diff --git a/src/conio/sdl_con.h b/src/conio/sdl_con.h index 8ff08c548f528cd5c60a74c91799d02cf11d0c8e..a556d85ac76108ae798285e5d041019421c5d17f 100644 --- a/src/conio/sdl_con.h +++ b/src/conio/sdl_con.h @@ -30,6 +30,7 @@ int sdl_getche(void); int sdl_beep(void); void sdl_textmode(int mode); void sdl_setname(const char *name); +void sdl_seticon(const void *, unsigned long size); void sdl_settitle(const char *title); int sdl_hidemouse(void); int sdl_showmouse(void);