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);