fixed switching from fullscreen to window when using different screen sizes
[rocksndiamonds.git] / src / libgame / sdl.c
index e7e985052cb7e9f7b8ebd88f4863620e1b939514..3b0ccc070b7cb72bf050471b454d3f271dbe03de 100644 (file)
@@ -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
 }