From aae5719546ec6e20a213dc1c7b76766a30aeb80e Mon Sep 17 00:00:00 2001 From: havoc Date: Fri, 29 Apr 2011 08:06:37 +0000 Subject: [PATCH] refactored the SDL_WM_SetCaption and SDL_WM_SetIcon logic into a single wrapper function for each platform (VID_WrapSDL_SetVideoMode), moved caption setting before SDL_SetVideoMode to prevent the "SDL_app" title git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11081 d7cf8633-e32d-0410-b094-e92efae38249 --- vid_sdl.c | 228 ++++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 118 deletions(-) diff --git a/vid_sdl.c b/vid_sdl.c index 1ae3fc03..396c23f5 100644 --- a/vid_sdl.c +++ b/vid_sdl.c @@ -1820,20 +1820,20 @@ void VID_Init (void) #ifdef WIN32 #include "resource.h" #include -static void VID_SetCaption(void) +static SDL_Surface *VID_WrapSDL_SetVideoMode(int screenwidth, int screenheight, int screenbpp, int screenflags) { - SDL_SysWMinfo info; - HICON icon; - - // set the caption + SDL_Surface *screen = NULL; + SDL_SysWMinfo info; + HICON icon; SDL_WM_SetCaption( gamename, NULL ); - - // get the HWND handle - SDL_VERSION( &info.version ); - if( !SDL_GetWMInfo( &info ) ) - return; - - icon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_ICON1 ) ); + screen = SDL_SetVideoMode(screenwidth, screenheight, screenbpp, screenflags); + if (screen) + { + // get the HWND handle + SDL_VERSION( &info.version ); + if (SDL_GetWMInfo(&info)) + { + icon = LoadIcon( GetModuleHandle( NULL ), MAKEINTRESOURCE( IDI_ICON1 ) ); #ifndef _W64 //If Windows 64bit data types don't exist #ifndef SetClassLongPtr #define SetClassLongPtr SetClassLong @@ -1845,20 +1845,17 @@ static void VID_SetCaption(void) #define LONG_PTR LONG #endif #endif - SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon ); -} -static void VID_SetIcon_Pre(void) -{ -} -static void VID_SetIcon_Post(void) -{ + SetClassLongPtr( info.window, GCLP_HICON, (LONG_PTR)icon ); + } + } + return screen; } #else // Adding the OS independent XPM version --blub #include "darkplaces.xpm" #include "nexuiz.xpm" static SDL_Surface *icon = NULL; -static void VID_SetIcon_Pre(void) +static SDL_Surface *VID_WrapSDL_SetVideoMode(int screenwidth, int screenheight, int screenbpp, int screenflags) { /* * Somewhat restricted XPM reader. Only supports XPMs saved by GIMP 2.4 at @@ -1872,7 +1869,11 @@ static void VID_SetIcon_Pre(void) char *xpm; char **idata, *data; const SDL_version *version; + SDL_Surface *screen = NULL; + if (icon) + SDL_FreeSurface(icon); + icon = NULL; version = SDL_Linked_Version(); // only use non-XPM icon support in SDL v1.3 and higher // SDL v1.2 does not support "smooth" transparency, and thus is better @@ -1898,14 +1899,14 @@ static void VID_SetIcon_Pre(void) icon = SDL_CreateRGBSurface(SDL_SRCALPHA, width, height, 32, LittleLong(red), LittleLong(green), LittleLong(blue), LittleLong(alpha)); - if(icon == NULL) { + if (icon) + icon->pixels = data; + else + { Con_Printf( "Failed to create surface for the window Icon!\n" "%s\n", SDL_GetError()); free(data); - return; } - - icon->pixels = data; } } @@ -1924,107 +1925,114 @@ static void VID_SetIcon_Pre(void) data = idata[0]; - if(sscanf(data, "%i %i %i %i", &width, &height, &colors, &isize) != 4) - { - // NOTE: Only 1-char colornames are supported - Con_Printf("Sorry, but this does not even look similar to an XPM.\n"); - return; - } - - if(isize != 1) + if(sscanf(data, "%i %i %i %i", &width, &height, &colors, &isize) == 4) { - // NOTE: Only 1-char colornames are supported - Con_Printf("This XPM's palette is either huge or idiotically unoptimized. It's key size is %i\n", isize); - return; - } + if(isize == 1) + { + for(i = 0; i < colors; ++i) + { + unsigned int r, g, b; + char idx; - for(i = 0; i < colors; ++i) - { - unsigned int r, g, b; - char idx; + if(sscanf(idata[i+1], "%c c #%02x%02x%02x", &idx, &r, &g, &b) != 4) + { + char foo[2]; + if(sscanf(idata[i+1], "%c c Non%1[e]", &idx, foo) != 2) // I take the DailyWTF credit for this. --div0 + break; + else + { + palette[i].r = 255; // color key + palette[i].g = 0; + palette[i].b = 255; + thenone = i; // weeeee + palenc[(unsigned char) idx] = i; + } + } + else + { + palette[i].r = r - (r == 255 && g == 0 && b == 255); // change 255/0/255 pink to 254/0/255 for color key + palette[i].g = g; + palette[i].b = b; + palenc[(unsigned char) idx] = i; + } + } - if(sscanf(idata[i+1], "%c c #%02x%02x%02x", &idx, &r, &g, &b) != 4) - { - char foo[2]; - if(sscanf(idata[i+1], "%c c Non%1[e]", &idx, foo) != 2) // I take the DailyWTF credit for this. --div0 + if (i == colors) { - Con_Printf("This XPM's palette looks odd. Can't continue.\n"); - return; + // allocate the image data + data = (char*) malloc(width*height); + + for(j = 0; j < height; ++j) + { + for(i = 0; i < width; ++i) + { + // casting to the safest possible datatypes ^^ + data[j * width + i] = palenc[((unsigned char*)idata[colors+j+1])[i]]; + } + } + + if(icon != NULL) + { + // SDL_FreeSurface should free the data too + // but for completeness' sake... + if(icon->flags & SDL_PREALLOC) + { + free(icon->pixels); + icon->pixels = NULL; // safety + } + SDL_FreeSurface(icon); + } + + icon = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, width, height, 8, 0,0,0,0);// rmask, gmask, bmask, amask); no mask needed + // 8 bit surfaces get an empty palette allocated according to the docs + // so it's a palette image for sure :) no endian check necessary for the mask + + if(icon) + { + icon->pixels = data; + SDL_SetPalette(icon, SDL_PHYSPAL|SDL_LOGPAL, palette, 0, colors); + SDL_SetColorKey(icon, SDL_SRCCOLORKEY, thenone); + } + else + { + Con_Printf( "Failed to create surface for the window Icon!\n" + "%s\n", SDL_GetError()); + free(data); + } } else { - palette[i].r = 255; // color key - palette[i].g = 0; - palette[i].b = 255; - thenone = i; // weeeee + Con_Printf("This XPM's palette looks odd. Can't continue.\n"); } } else { - palette[i].r = r - (r == 255 && g == 0 && b == 255); // change 255/0/255 pink to 254/0/255 for color key - palette[i].g = g; - palette[i].b = b; + // NOTE: Only 1-char colornames are supported + Con_Printf("This XPM's palette is either huge or idiotically unoptimized. It's key size is %i\n", isize); } - - palenc[(unsigned char) idx] = i; } - - // allocate the image data - data = (char*) malloc(width*height); - - for(j = 0; j < height; ++j) - { - for(i = 0; i < width; ++i) - { - // casting to the safest possible datatypes ^^ - data[j * width + i] = palenc[((unsigned char*)idata[colors+j+1])[i]]; - } - } - - if(icon != NULL) + else { - // SDL_FreeSurface should free the data too - // but for completeness' sake... - if(icon->flags & SDL_PREALLOC) - { - free(icon->pixels); - icon->pixels = NULL; // safety - } - SDL_FreeSurface(icon); + // NOTE: Only 1-char colornames are supported + Con_Printf("Sorry, but this does not even look similar to an XPM.\n"); } + } - icon = SDL_CreateRGBSurface(SDL_SRCCOLORKEY, width, height, 8, 0,0,0,0);// rmask, gmask, bmask, amask); no mask needed - // 8 bit surfaces get an empty palette allocated according to the docs - // so it's a palette image for sure :) no endian check necessary for the mask - - if(icon == NULL) { - Con_Printf( "Failed to create surface for the window Icon!\n" - "%s\n", SDL_GetError()); - free(data); - return; - } + if (icon) + SDL_WM_SetIcon(icon, NULL); - icon->pixels = data; - SDL_SetPalette(icon, SDL_PHYSPAL|SDL_LOGPAL, palette, 0, colors); - SDL_SetColorKey(icon, SDL_SRCCOLORKEY, thenone); - } + SDL_WM_SetCaption( gamename, NULL ); + screen = SDL_SetVideoMode(screenwidth, screenheight, screenbpp, screenflags); - SDL_WM_SetIcon(icon, NULL); -} -static void VID_SetIcon_Post(void) -{ #if SDL_MAJOR_VERSION == 1 && SDL_MINOR_VERSION == 2 // LordHavoc: info.info.x11.lock_func and accompanying code do not seem to compile with SDL 1.3 #if SDL_VIDEO_DRIVER_X11 && !SDL_VIDEO_DRIVER_QUARTZ - int j; - char *data; - const SDL_version *version; version = SDL_Linked_Version(); // only use non-XPM icon support in SDL v1.3 and higher // SDL v1.2 does not support "smooth" transparency, and thus is better // off the xpm way - if(!(version->major >= 2 || (version->major == 1 && version->minor >= 3))) + if(screen && (!(version->major >= 2 || (version->major == 1 && version->minor >= 3)))) { // in this case, we did not set the good icon yet SDL_SysWMinfo info; @@ -2069,13 +2077,9 @@ static void VID_SetIcon_Post(void) } #endif #endif + return screen; } - -static void VID_SetCaption(void) -{ - SDL_WM_SetCaption( gamename, NULL ); -} #endif #endif @@ -2204,9 +2208,7 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) video_bpp = mode->bitsperpixel; #if SETVIDEOMODE video_flags = flags; - VID_SetIcon_Pre(); - screen = SDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); - VID_SetIcon_Post(); + screen = VID_WrapSDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); if (screen == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); @@ -2237,10 +2239,6 @@ qboolean VID_InitModeGL(viddef_mode_t *mode) vid_softsurface = NULL; vid.softpixels = NULL; -#if SETVIDEOMODE - // set window title - VID_SetCaption(); -#endif // init keyboard SDL_EnableUNICODE( SDL_ENABLE ); // enable key repeat since everyone expects it @@ -2331,9 +2329,7 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) video_bpp = mode->bitsperpixel; #if SETVIDEOMODE video_flags = flags; - VID_SetIcon_Pre(); - screen = SDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); - VID_SetIcon_Post(); + screen = VID_WrapSDL_SetVideoMode(mode->width, mode->height, mode->bitsperpixel, flags); if (screen == NULL) { Con_Printf("Failed to set video mode to %ix%i: %s\n", mode->width, mode->height, SDL_GetError()); @@ -2373,10 +2369,6 @@ qboolean VID_InitModeSoft(viddef_mode_t *mode) return false; } -#if SETVIDEOMODE - // set window title - VID_SetCaption(); -#endif // init keyboard SDL_EnableUNICODE( SDL_ENABLE ); // enable key repeat since everyone expects it -- 2.39.2