DEADSOFTWARE

don't kill and recreate game window on resolution change in windowed mode
[d2df-sdl.git] / src / game / g_window.pas
index a40441b492a7d6fee0db0eb2a6c206aafb031e3f..f7f06d89d2aa5e3fc8712b12f30d99e5c20cdbb9 100644 (file)
@@ -68,6 +68,8 @@ var
   flag: Boolean;
 {$IF not DEFINED(HEADLESS)}
   wTitle: PChar = nil;
+  wasFullscreen: Boolean = true; // so we need to recreate the window
+  wMaximized: Boolean = false;
 {$ENDIF}
   wNeedTimeReset: Boolean = false;
   wMinimized: Boolean = false;
@@ -102,9 +104,9 @@ begin
 
   e_WriteLog('Setting display mode...', TMsgType.Notify);
 
-  wFlags := SDL_WINDOW_OPENGL; // or SDL_WINDOW_RESIZABLE;
-  if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN or SDL_WINDOW_BORDERLESS else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
-  //if gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED;
+  wFlags := SDL_WINDOW_OPENGL {or SDL_WINDOW_RESIZABLE};
+  if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
+  if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
 
   if gFullscreen then
   begin
@@ -127,10 +129,24 @@ begin
     end;
   end;
 
-  KillGLWindow(preserveGL);
-
-  h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
-  if (h_Wnd = nil) then exit;
+  if (preserveGL) and (h_Wnd <> nil) and (not gFullscreen) and (not wasFullscreen) then
+  begin
+    //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
+    //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
+    if (wMaximized) then SDL_RestoreWindow(h_Wnd);
+    wMaximized := false;
+    gWinMaximized := false;
+    SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
+    //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
+    //SDL_SetWindowFullscreen(h_Wnd, 0);
+  end
+  else
+  begin
+    KillGLWindow(preserveGL);
+    h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
+    if (h_Wnd = nil) then exit;
+  end;
+  wasFullscreen := gFullscreen;
 
   SDL_GL_MakeCurrent(h_Wnd, h_GL);
   SDL_ShowCursor(SDL_DISABLE);
@@ -195,6 +211,7 @@ end;
 
 procedure ChangeWindowSize ();
 begin
+  e_LogWritefln('  ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
   gWinSizeX := gScreenWidth;
   gWinSizeY := gScreenHeight;
 {$IF not DEFINED(HEADLESS)}
@@ -279,8 +296,20 @@ begin
 
     SDL_WINDOWEVENT_RESIZED:
     begin
-      gScreenWidth := ev.data1;
-      gScreenHeight := ev.data2;
+      e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
+      {if (gFullscreen) then
+      begin
+        e_LogWriteln('  fullscreen fix applied.');
+        if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
+        begin
+          SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
+        end;
+      end
+      else}
+      begin
+        gScreenWidth := ev.data1;
+        gScreenHeight := ev.data2;
+      end;
       ChangeWindowSize();
       SwapBuffers();
       if g_debug_WinMsgs then
@@ -295,13 +324,14 @@ begin
 
     SDL_WINDOWEVENT_MAXIMIZED:
     begin
+      wMaximized := true;
       if wMinimized then
       begin
         e_ResizeWindow(gScreenWidth, gScreenHeight);
         wMinimized := false;
         wActivate := true;
       end;
-      if not gWinMaximized then
+      if (not gWinMaximized) and (not gFullscreen) then
       begin
         gWinMaximized := true;
         if g_debug_WinMsgs then
@@ -314,13 +344,14 @@ begin
 
     SDL_WINDOWEVENT_RESTORED:
     begin
+      wMaximized := false;
       if wMinimized then
       begin
         e_ResizeWindow(gScreenWidth, gScreenHeight);
         wMinimized := false;
         wActivate := true;
       end;
-      if gWinMaximized then gWinMaximized := false;
+      gWinMaximized := false;
       if g_debug_WinMsgs then
       begin
         g_Console_Add('Now restored');