DEADSOFTWARE

fix question char
[d2df-sdl.git] / src / game / sdl2 / g_system.pas
index 5a24a48e33daf95c7b95a0c70ed15ba5a4164a1b..f46c3278669f208ae7258eef957b5caab3991d89 100644 (file)
@@ -24,7 +24,7 @@ interface
   procedure sys_Delay (ms: Integer);
 
   (* --- Graphics --- *)
-  function sys_GetDispalyModes (bpp: Integer): SSArray;
+  function sys_GetDisplayModes (bpp: Integer): SSArray;
   function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen: Boolean): Boolean;
   procedure sys_EnableVSync (yes: Boolean);
   procedure sys_Repaint;
@@ -40,10 +40,13 @@ interface
 implementation
 
   uses
-    SysUtils, SDL2, GL, Math,
-    e_log, e_graphics, e_input,
-    g_touch,
-    g_options, g_window, g_console, g_game, g_menu, g_gui, g_main;
+    SysUtils, SDL2, Math,
+    e_log, e_graphics, e_input, e_sound,
+    {$INCLUDE ../nogl/noGLuses.inc}
+    {$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;
 
   const
     GameTitle = 'Doom 2D: Forever (SDL 2)';
@@ -85,13 +88,20 @@ implementation
     e_ResizeWindow(w, h);
     e_InitGL;
     g_Game_SetupScreenSize;
-    g_Menu_Reset;
+    {$IFNDEF ANDOIRD}
+      (* This will fix menu reset on keyboard showing *)
+      g_Menu_Reset;
+    {$ENDIF}
     g_Game_ClearLoading;
+    {$IFDEF ENABLE_HOLMES}
+      if assigned(oglInitCB) then oglInitCB;
+    {$ENDIF}
   end;
 
   function InitWindow (w, h, bpp: Integer; fullScreen: Boolean): Boolean;
     var flags: UInt32;
   begin
+    // note: on window close make: if assigned(oglDeinitCB) then oglDeinitCB;
     e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]);
     result := false;
     if window = nil then
@@ -118,6 +128,9 @@ implementation
         context := SDL_GL_CreateContext(window);
         if context <> nil then
         begin
+          {$IFDEF NOGL_INIT}
+            nogl_Init;
+          {$ENDIF}
           UpdateSize(w, h);
           result := true
         end
@@ -154,7 +167,7 @@ implementation
       SDL_GL_SetSwapInterval(0)
   end;
 
-  function sys_GetDispalyModes (bpp: Integer): SSArray;
+  function sys_GetDisplayModes (bpp: Integer): SSArray;
     var i, count, num, pw, ph: Integer; m: TSDL_DisplayMode;
   begin
     result := nil;
@@ -297,7 +310,7 @@ implementation
     begin
       if g_dbg_input then
         e_LogWritefln('Input Debug: NOT IN RANGE! jhat, joy=%s, hat=%s, value=%s', [ev.which, ev.hat, ev.value])
-    end;
+    end
   end;
 
   procedure HandleJoyAdd (var ev: TSDL_JoyDeviceEvent);
@@ -345,6 +358,22 @@ implementation
       SDL_WINDOWEVENT_RESIZED: UpdateSize(ev.data1, ev.data2);
       SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
       SDL_WINDOWEVENT_CLOSE: result := true;
+      SDL_WINDOWEVENT_FOCUS_LOST, SDL_WINDOWEVENT_MINIMIZED:
+        begin
+          e_UnpressAllKeys;
+          if gMuteWhenInactive then
+            e_MuteChannels(true);
+          {$IFDEF ENABLE_HOLMES}
+            if assigned(winBlurCB) then winBlurCB;
+          {$ENDIF}
+        end;
+      SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_RESTORED:
+        begin
+          e_MuteChannels(false);
+          {$IFDEF ENABLE_HOLMES}
+            if assigned(winFocusCB) then winFocusCB;
+          {$ENDIF}
+        end;
     end
   end;
 
@@ -355,6 +384,14 @@ implementation
     down := (ev.type_ = SDL_KEYDOWN);
     if key = SDL_SCANCODE_AC_BACK then
       key := SDL_SCANCODE_ESCAPE;
+    {$IFDEF ENABLE_HOLMES}
+      if fuiOnSDLEvent(PSDL_Event(@ev)^) then
+      begin
+        // event eaten, but...
+        if not down then e_KeyUpDown(key, false);
+        exit;
+      end;
+    {$ENDIF}
     if ev._repeat = 0 then
     begin
       if g_dbg_input then
@@ -371,20 +408,19 @@ 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;
     var ev: TSDL_Event;
   begin
     result := false;
+    ZeroMemory(@ev, sizeof(ev));
     while SDL_PollEvent(@ev) <> 0 do
     begin
       case ev.type_ of
@@ -398,6 +434,9 @@ implementation
         SDL_JOYDEVICEREMOVED: HandleJoyRemove(ev.jdevice);
         SDL_TEXTINPUT: HandleTextInput(ev.text);
         SDL_FINGERMOTION, SDL_FINGERDOWN, SDL_FINGERUP: g_Touch_HandleEvent(ev.tfinger);
+        {$IFDEF ENABLE_HOLMES}
+          SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEWHEEL, SDL_MOUSEMOTION: fuiOnSDLEvent(ev);
+        {$ENDIF}
       end
     end
   end;
@@ -412,7 +451,7 @@ implementation
   (* --------- Init --------- *)
 
   procedure sys_Init;
-    var flags: UInt32; ok: Boolean;
+    var flags: UInt32;
   begin
     e_WriteLog('Init SDL2', TMsgType.Notify);
     {$IFDEF HEADLESS}
@@ -427,20 +466,25 @@ implementation
     SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
     if SDL_Init(flags) <> 0 then
       raise Exception.Create('SDL: Init failed: ' + SDL_GetError);
-    ok := InitWindow(gScreenWidth, gScreenHeight, gBPP, gFullscreen);
-    if not ok then
-      raise Exception.Create('SDL: Failed to set videomode: ' + SDL_GetError);
+    SDL_ShowCursor(SDL_DISABLE);
   end;
 
   procedure sys_Final;
   begin
     e_WriteLog('Releasing SDL2', TMsgType.Notify);
     if context <> nil then
+    begin
+      {$IFDEF NOGL_INIT}
+        nogl_Quit;
+      {$ENDIF}
       SDL_GL_DeleteContext(context);
+      context := nil;
+    end;
     if window <> nil then
+    begin
       SDL_DestroyWindow(window);
-    window := nil;
-    context := nil;
+      window := nil;
+    end;
     SDL_Quit
   end;