DEADSOFTWARE

save window options after resizing by user
[d2df-sdl.git] / src / game / sdl2 / g_system.pas
index 45a45fd54a3c3bf9c6dfaeb29d25f6d5494a5e61..511e06200dd020c08d950a998c3025cc97c08b05 100644 (file)
@@ -25,7 +25,7 @@ interface
 
   (* --- Graphics --- *)
   function sys_GetDisplayModes (bpp: Integer): SSArray;
-  function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen: Boolean): Boolean;
+  function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen, maximized: Boolean): Boolean;
   procedure sys_EnableVSync (yes: Boolean);
   procedure sys_Repaint;
 
@@ -46,10 +46,10 @@ implementation
     {$IFDEF ENABLE_HOLMES}
       g_holmes, sdlcarcass, fui_ctls,
     {$ENDIF}
-    g_touch, g_options, g_window, g_console, g_game, g_menu, g_gui, g_main;
+    g_touch, g_options, g_window, g_console, g_game, g_menu, g_gui, g_main, g_basic;
 
   const
-    GameTitle = 'Doom 2D: Forever (SDL 2)';
+    GameTitle = 'Doom 2D: Forever (SDL 2, %s)';
 
   var
     window: PSDL_Window;
@@ -77,10 +77,10 @@ implementation
   begin
     gWinSizeX := w;
     gWinSizeY := h;
-    gWinRealPosX := 0;
-    gWinRealPosY := 0;
     gScreenWidth := w;
     gScreenHeight := h;
+    gRC_Width := w;
+    gRC_Height := h;
     {$IFDEF ENABLE_HOLMES}
       fuiScrWdt := w;
       fuiScrHgt := h;
@@ -98,8 +98,17 @@ implementation
     {$ENDIF}
   end;
 
-  function InitWindow (w, h, bpp: Integer; fullScreen: Boolean): Boolean;
-    var flags: UInt32;
+  function GetTitle (): PChar;
+    var info: AnsiString;
+  begin
+    info := g_GetBuildHash(false);
+    if info = 'custom build' then
+      info := info + ' by ' + g_GetBuilderName() + ' ' + GAME_BUILDDATE + ' ' + GAME_BUILDTIME;
+    result := PChar(Format(GameTitle, [info]))
+  end;
+
+  function InitWindow (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
+    var flags: UInt32; x, y: Integer;
   begin
     // note: on window close make: if assigned(oglDeinitCB) then oglDeinitCB;
     e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]);
@@ -122,7 +131,10 @@ implementation
       {$ENDIF}
       flags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
       if fullScreen then flags := flags or SDL_WINDOW_FULLSCREEN;
-      window := SDL_CreateWindow(GameTitle, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, w, h, flags);
+      if maximized then flags := flags or SDL_WINDOW_MAXIMIZED;
+      x := SDL_WINDOWPOS_CENTERED;
+      y := SDL_WINDOWPOS_CENTERED;
+      window := SDL_CreateWindow(GetTitle(), x, y, w, h, flags);
       if window <> nil then
       begin
         context := SDL_GL_CreateContext(window);
@@ -131,6 +143,10 @@ implementation
           {$IFDEF NOGL_INIT}
             nogl_Init;
           {$ENDIF}
+          gFullScreen := fullscreen;
+          gWinMaximized := maximized;
+          gRC_FullScreen := fullscreen;
+          gRC_Maximized := maximized;
           UpdateSize(w, h);
           result := true
         end
@@ -146,9 +162,15 @@ implementation
     end
     else
     begin
-      if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
       SDL_SetWindowSize(window, w, h);
+      if maximized then
+        SDL_MaximizeWindow(window);
+      if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
       SDL_SetWindowFullscreen(window, flags);
+      gFullScreen := fullscreen;
+      gWinMaximized := maximized;
+      gRC_FullScreen := fullscreen;
+      gRC_Maximized := maximized;
       UpdateSize(w, h);
       result := true
     end
@@ -199,9 +221,9 @@ implementation
     end
   end;
 
-  function sys_SetDisplayMode (w, h, bpp: Integer; fullScreen: Boolean): Boolean;
+  function sys_SetDisplayMode (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
   begin
-    result := InitWindow(w, h, bpp, fullScreen)
+    result := InitWindow(w, h, bpp, fullScreen, maximized)
   end;
 
   (* --------- Joystick --------- *)
@@ -354,6 +376,8 @@ implementation
   function HandleWindow (var ev: TSDL_WindowEvent): Boolean;
   begin
     result := false;
+    if g_dbg_input then
+      e_LogWritefln('Window Event: event = %s, data1 = %s, data2 = %s', [ev.event, ev.data1, ev.data2]);
     case ev.event of
       SDL_WINDOWEVENT_RESIZED: UpdateSize(ev.data1, ev.data2);
       SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
@@ -369,6 +393,10 @@ implementation
         end;
       SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_RESTORED:
         begin
+          if ev.event = SDL_WINDOWEVENT_MAXIMIZED then
+            gRC_Maximized := true
+          else if ev.event = SDL_WINDOWEVENT_RESTORED then
+            gRC_Maximized := false;
           e_MuteChannels(false);
           {$IFDEF ENABLE_HOLMES}
             if assigned(winFocusCB) then winFocusCB;
@@ -408,14 +436,12 @@ implementation
   procedure HandleTextInput (var ev: TSDL_TextInputEvent);
     var ch: UnicodeChar; sch: AnsiChar;
   begin
-    if g_dbg_input then
-      e_LogWritefln('Input Debug: text, text=%s', [ev.text]);
     Utf8ToUnicode(@ch, PChar(ev.text), 1);
-    if IsValid1251(Word(ch)) then
-    begin
-      sch := AnsiChar(wchar2win(ch));
+    sch := AnsiChar(wchar2win(ch));
+    if g_dbg_input then
+      e_LogWritefln('Input Debug: text, text="%s", ch = %s, sch = %s', [ev.text, Ord(ch), Ord(sch)]);
+    if IsValid1251(Word(ch)) and IsPrintable1251(ch) then
       CharPress(sch);
-    end;
   end;
 
   function sys_HandleInput (): Boolean;