diff --git a/Makefile b/Makefile index 8be09363ea..d689f512ec 100644 --- a/Makefile +++ b/Makefile @@ -616,6 +616,10 @@ endif ifdef USE_HOMEDIR CDEFS += -DUSE_HOMEDIR endif + +ifdef ICON_DIR +CDEFS += -DICON_DIR=\"$(ICON_DIR_PREFIXED)/\" +endif endif ############################################################################## diff --git a/media/openttd.32.bmp b/media/openttd.32.bmp new file mode 100644 index 0000000000..e388628fb6 Binary files /dev/null and b/media/openttd.32.bmp differ diff --git a/sdl.c b/sdl.c index 5a5ca791de..f6474b6e10 100644 --- a/sdl.c +++ b/sdl.c @@ -54,6 +54,11 @@ static const char sdl_files[] = M("SDL_VideoDriverName") M("SDL_ListModes") M("SDL_GetKeyState") + M("SDL_LoadBMP_RW") + M("SDL_RWFromFile") + M("SDL_SetColorKey") + M("SDL_WM_SetIcon") + M("SDL_MapRGB") M("") ; #undef M diff --git a/sdl.h b/sdl.h index 8faa850242..9fe3740953 100644 --- a/sdl.h +++ b/sdl.h @@ -41,6 +41,11 @@ void SdlClose(uint32 x); void (SDLCALL *SDL_VideoDriverName)(char *, int); SDL_Rect **(SDLCALL *SDL_ListModes)(void *, int); Uint8 *(SDLCALL *SDL_GetKeyState)(int *); + SDL_Surface *(SDLCALL *SDL_LoadBMP_RW)(SDL_RWops *, int); + SDL_RWops *(SDLCALL *SDL_RWFromFile)(const char *, const char *); + int (SDLCALL *SDL_SetColorKey)(SDL_Surface *, Uint32, Uint32); + void (SDLCALL *SDL_WM_SetIcon)(SDL_Surface *, Uint8 *); + Uint32 (SDLCALL *SDL_MapRGB)(SDL_PixelFormat *, Uint8, Uint8, Uint8); } SDLProcs; extern SDLProcs sdl_proc; diff --git a/video/sdl_v.c b/video/sdl_v.c index 373009bc8f..275db9dba4 100644 --- a/video/sdl_v.c +++ b/video/sdl_v.c @@ -161,15 +161,36 @@ static int GetAvailableVideoMode(int *w, int *h) extern const char _openttd_revision[]; +#ifndef ICON_DIR +#define ICON_DIR "media" +#endif + +#ifdef WIN32 +/* Let's redefine the LoadBMP macro with because we are dynamically + * loading SDL and need to 'SDL_CALL' all functions */ +#undef SDL_LoadBMP +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_CALL SDL_RWFromFile(file, "rb"), 1) +#endif + static bool CreateMainSurface(int w, int h) { - SDL_Surface *newscreen; + SDL_Surface *newscreen, *icon; char caption[50]; GetAvailableVideoMode(&w, &h); DEBUG(driver, 1) ("sdl: using mode %dx%d", w, h); + /* Give the application an icon */ + icon = SDL_CALL SDL_LoadBMP(ICON_DIR PATHSEP "openttd.32.bmp"); + if (icon != NULL) { + /* Get the colourkey, which will be magenta */ + uint32 rgbmap = SDL_CALL SDL_MapRGB(icon->format, 255, 0, 255); + SDL_CALL SDL_SetColorKey(icon, SDL_SRCCOLORKEY, rgbmap); + SDL_CALL SDL_WM_SetIcon(icon, NULL); + SDL_CALL SDL_FreeSurface(icon); + } + // DO NOT CHANGE TO HWSURFACE, IT DOES NOT WORK newscreen = SDL_CALL SDL_SetVideoMode(w, h, 8, SDL_SWSURFACE | SDL_HWPALETTE | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE)); if (newscreen == NULL)