X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsdl.c;h=3b0ccc070b7cb72bf050471b454d3f271dbe03de;hb=eaf903d927b8fbebeb9491488207dbf44681c68b;hp=e7e985052cb7e9f7b8ebd88f4863620e1b939514;hpb=f4c7859fd8e746c60aa3b4eb50313eebf71e1045;p=rocksndiamonds.git diff --git a/src/libgame/sdl.c b/src/libgame/sdl.c index e7e98505..3b0ccc07 100644 --- a/src/libgame/sdl.c +++ b/src/libgame/sdl.c @@ -27,6 +27,7 @@ static SDL_Window *sdl_window = NULL; static SDL_Renderer *sdl_renderer = NULL; static SDL_Texture *sdl_texture = NULL; +static boolean fullscreen_enabled = FALSE; #define USE_RENDERER TRUE #endif @@ -60,6 +61,23 @@ static void UpdateScreen(SDL_Rect *rect) LimitScreenUpdates(FALSE); +#if 0 + { + static int LastFrameCounter = 0; + boolean changed = (FrameCounter != LastFrameCounter); + + printf("::: FrameCounter == %d [%s]\n", FrameCounter, + (changed ? "-" : "SAME FRAME UPDATED")); + + LastFrameCounter = FrameCounter; + + /* + if (FrameCounter % 2) + return; + */ + } +#endif + #if defined(TARGET_SDL2) #if USE_RENDERER SDL_Surface *screen = backbuffer->surface; @@ -198,6 +216,9 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) new_surface = SDL_ConvertSurface(*surface, backbuffer->surface->format, 0); + if (new_surface == NULL) + Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError()); + SDL_FreeSurface(*surface); *surface = new_surface; @@ -207,24 +228,20 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { + SDL_Surface *new_surface; + if (surface == NULL) return NULL; - if (backbuffer == NULL || - backbuffer->surface == NULL) - return SDL_ConvertSurface(surface, surface->format, 0); - - return SDL_ConvertSurface(surface, backbuffer->surface->format, 0); -} + if (backbuffer && backbuffer->surface) + new_surface = SDL_ConvertSurface(surface, backbuffer->surface->format, 0); + else + new_surface = SDL_ConvertSurface(surface, surface->format, 0); -SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface) -{ - if (surface == NULL || - backbuffer == NULL || - backbuffer->surface == NULL) - return NULL; + if (new_surface == NULL) + Error(ERR_EXIT, "SDL_ConvertSurface() failed: %s", SDL_GetError()); - return SDL_ConvertSurface(surface, backbuffer->surface->format, 0); + return new_surface; } #else @@ -233,7 +250,9 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) { SDL_Surface *new_surface; - if (surface == NULL) + if (surface == NULL || + *surface == NULL || + !video.initialized) return FALSE; new_surface = SDL_DisplayFormat(*surface); @@ -250,10 +269,17 @@ boolean SDLSetNativeSurface(SDL_Surface **surface) SDL_Surface *SDLGetNativeSurface(SDL_Surface *surface) { - SDL_Surface *new_surface = SDL_DisplayFormat(surface); + SDL_Surface *new_surface; + + if (video.initialized) + new_surface = SDL_DisplayFormat(surface); + else + new_surface = SDL_ConvertSurface(surface, surface->format, SURFACE_FLAGS); if (new_surface == NULL) - Error(ERR_EXIT, "SDL_DisplayFormat() failed: %s", SDL_GetError()); + Error(ERR_EXIT, "%s() failed: %s", + (video.initialized ? "SDL_DisplayFormat" : "SDL_ConvertSurface"), + SDL_GetError()); return new_surface; } @@ -446,7 +472,7 @@ void SDLInitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window, /* !!! SDL2 can only set the window icon if the window already exists !!! */ /* set window icon */ - SDLSetWindowIcon(program.sdl_icon_filename); + SDLSetWindowIcon(program.icon_filename); /* set window and icon title */ #if defined(TARGET_SDL2) @@ -478,7 +504,6 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, SDL_Surface *new_surface = NULL; #if defined(TARGET_SDL2) - static boolean fullscreen_enabled = FALSE; int surface_flags_window = SURFACE_FLAGS | SDL_WINDOW_RESIZABLE; #if USE_DESKTOP_FULLSCREEN int surface_flags_fullscreen = SURFACE_FLAGS | SDL_WINDOW_FULLSCREEN_DESKTOP; @@ -502,9 +527,8 @@ static SDL_Surface *SDLCreateScreen(DrawBuffer **backbuffer, #if defined(TARGET_SDL2) - // store if initial screen mode on game start is fullscreen mode - if (sdl_window == NULL) - video.fullscreen_initial = fullscreen; + // store if initial screen mode is fullscreen mode when changing screen size + video.fullscreen_initial = fullscreen; #if USE_RENDERER float window_scaling_factor = (float)setup.window_scaling_percent / 100; @@ -708,9 +732,12 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) SDLRedrawWindow(); // map window #endif +#ifdef DEBUG +#if defined(PLATFORM_WIN32) + // experimental drag and drop code + SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); -#if defined(PLATFORM_WIN32) { SDL_SysWMinfo wminfo; HWND hwnd; @@ -735,6 +762,7 @@ boolean SDLSetVideoMode(DrawBuffer **backbuffer, boolean fullscreen) DragAcceptFiles(hwnd, TRUE); } } +#endif #endif return success; @@ -804,9 +832,9 @@ void SDLSetWindowFullscreen(boolean fullscreen) #endif if (SDL_SetWindowFullscreen(sdl_window, flags) == 0) - video.fullscreen_enabled = fullscreen; + video.fullscreen_enabled = fullscreen_enabled = fullscreen; - // if game started in fullscreen mode, window will also get fullscreen size + // if screen size was changed in fullscreen mode, correct desktop window size if (!fullscreen && video.fullscreen_initial) { SDLSetWindowScaling(setup.window_scaling_percent); @@ -1169,14 +1197,7 @@ void SDLFadeRectangle(Bitmap *bitmap_cross, int x, int y, int width, int height, if (draw_border_function != NULL) draw_border_function(); -#if defined(TARGET_SDL2) - // SDL_UpdateWindowSurface(sdl_window); - // SDL_UpdateWindowSurfaceRects(sdl_window, &dst_rect2, 1); UpdateScreen(&dst_rect2); -#else - // SDL_UpdateRect(surface_screen, dst_x, dst_y, width, height); - UpdateScreen(&dst_rect2); -#endif } } } @@ -2365,7 +2386,10 @@ void SDLNextEvent(Event *event) void SDLHandleWindowManagerEvent(Event *event) { +#ifdef DEBUG #if defined(PLATFORM_WIN32) + // experimental drag and drop code + SDL_SysWMEvent *syswmevent = (SDL_SysWMEvent *)event; SDL_SysWMmsg *syswmmsg = (SDL_SysWMmsg *)(syswmevent->msg); @@ -2403,6 +2427,7 @@ void SDLHandleWindowManagerEvent(Event *event) #endif } #endif +#endif }