index 5a24a48e33daf95c7b95a0c70ed15ba5a4164a1b..e2e713240de385f9e305b5e24f4ec348ecd8d4a2 100644 (file)
uses Utils;
uses Utils;
- (* --- Utils --- *)
- function sys_GetTicks (): Int64;
- procedure sys_Delay (ms: Integer);
+ type
+ TGLProfile = (Core, Compat, Common, CommonLite);
+
+ type
+ TGLDisplayInfo = record
+ w, h, bpp: Integer;
+ fullscreen: Boolean;
+ maximized: Boolean;
+ major, minor: Integer;
+ profile: TGLProfile;
+ end;
(* --- Graphics --- *)
(* --- Graphics --- *)
- function sys_GetDispalyModes (bpp: Integer): SSArray;
- function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen: Boolean): Boolean;
+ function sys_GetDisplayModes (bpp: Integer): SSArray;
+ function sys_SetDisplayMode (w, h, bpp: Integer; fullscreen, maximized: Boolean): Boolean;
procedure sys_EnableVSync (yes: Boolean);
procedure sys_Repaint;
procedure sys_EnableVSync (yes: Boolean);
procedure sys_Repaint;
+ function sys_SetDisplayModeGL (const info: TGLDisplayInfo): Boolean;
+
(* --- Input --- *)
function sys_HandleInput (): Boolean;
procedure sys_RequestQuit;
(* --- Input --- *)
function sys_HandleInput (): Boolean;
procedure sys_RequestQuit;
+{$IFDEF ENABLE_TOUCH}
+ function sys_IsTextInputActive (): Boolean;
+ procedure sys_ShowKeyboard (yes: Boolean);
+{$ENDIF}
+
(* --- Init --- *)
procedure sys_Init;
procedure sys_Final;
(* --- Init --- *)
procedure sys_Init;
procedure sys_Final;
+ var (* hooks *)
+ sys_CharPress: procedure (ch: AnsiChar) = nil;
+ sys_ScreenResize: procedure (w, h: Integer) = nil;
+
implementation
uses
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;
+ {$IFDEF ENABLE_HOLMES}
+ sdlcarcass,
+ {$ENDIF}
+ {$IFDEF ENABLE_RENDER}
+ r_render,
+ {$ENDIF}
+ {$IFDEF ENABLE_MENU}
+ g_gui,
+ {$ENDIF}
+ SysUtils, SDL2, Math, ctypes,
+ e_log, e_input, e_sound,
+ g_options, g_console, g_game, g_basic
+ ;
const
const
- GameTitle = 'Doom 2D: Forever (SDL 2)';
+ GameTitle = 'Doom 2D: Forever (SDL 2, %s)';
var
window: PSDL_Window;
context: TSDL_GLContext;
var
window: PSDL_Window;
context: TSDL_GLContext;
- display: Integer;
+ display, wx, wy: Integer;
+ wc: Boolean;
JoystickHandle: array [0..e_MaxJoys - 1] of PSDL_Joystick;
JoystickHatState: array [0..e_MaxJoys - 1, 0..e_MaxJoyHats - 1, HAT_LEFT..HAT_DOWN] of Boolean;
JoystickZeroAxes: array [0..e_MaxJoys - 1, 0..e_MaxJoyAxes - 1] of Integer;
JoystickHandle: array [0..e_MaxJoys - 1] of PSDL_Joystick;
JoystickHatState: array [0..e_MaxJoys - 1, 0..e_MaxJoyHats - 1, HAT_LEFT..HAT_DOWN] of Boolean;
JoystickZeroAxes: array [0..e_MaxJoys - 1, 0..e_MaxJoyAxes - 1] of Integer;
+ rMajor, rMinor, rProfile: Integer;
- (* --------- Utils --------- *)
-
- function sys_GetTicks (): Int64;
- begin
- result := SDL_GetTicks()
- end;
-
- procedure sys_Delay (ms: Integer);
- begin
- SDL_Delay(ms)
- end;
+{$IFDEF ENABLE_TOUCH}
+ var (* touch *)
+ angleFire: Boolean;
+ keyFinger: array [VK_FIRSTKEY..VK_LASTKEY] of Integer;
+{$ENDIF}
(* --------- Graphics --------- *)
(* --------- Graphics --------- *)
- procedure UpdateSize (w, h: Integer);
+ function GetTitle (): AnsiString;
+ var info: AnsiString;
begin
begin
- gWinSizeX := w;
- gWinSizeY := h;
- gWinRealPosX := 0;
- gWinRealPosY := 0;
- gScreenWidth := w;
- gScreenHeight := h;
- {$IFDEF ENABLE_HOLMES}
- fuiScrWdt := w;
- fuiScrHgt := h;
- {$ENDIF}
- e_ResizeWindow(w, h);
- e_InitGL;
- g_Game_SetupScreenSize;
- g_Menu_Reset;
- g_Game_ClearLoading;
+ info := g_GetBuildHash(false);
+ if info = 'custom build' then
+ info := info + ' by ' + g_GetBuilderName() + ' ' + GAME_BUILDDATE + ' ' + GAME_BUILDTIME;
+ result := Format(GameTitle, [info]);
end;
end;
- function InitWindow (w, h, bpp: Integer; fullScreen: Boolean): Boolean;
- var flags: UInt32;
+ function InitWindow (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
+ var flags: UInt32; x, y: cint; title: AnsiString;
begin
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
begin
e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]);
result := false;
if window = nil then
begin
- {$IFDEF USE_GLES1}
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
- {$ELSE}
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
- SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, rMajor);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, rMinor);
+ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, rProfile);
+ if rProfile in [SDL_GL_CONTEXT_PROFILE_CORE, SDL_GL_CONTEXT_PROFILE_COMPATIBILITY] then
+ begin
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
- {$ENDIF}
+ end;
flags := SDL_WINDOW_OPENGL or SDL_WINDOW_RESIZABLE;
if fullScreen then flags := flags or SDL_WINDOW_FULLSCREEN;
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;
+ if wc then
+ begin
+ x := SDL_WINDOWPOS_CENTERED;
+ y := SDL_WINDOWPOS_CENTERED
+ end
+ else
+ begin
+ x := wx;
+ y := wy
+ end;
+ title := GetTitle();
+ window := SDL_CreateWindow(PChar(title), x, y, w, h, flags);
if window <> nil then
begin
context := SDL_GL_CreateContext(window);
if context <> nil then
begin
if window <> nil then
begin
context := SDL_GL_CreateContext(window);
if context <> nil then
begin
- UpdateSize(w, h);
+ if (fullscreen = false) and (maximized = false) and (wc = false) then
+ begin
+ SDL_GetWindowPosition(window, @x, @y);
+ wx := x; wy := y
+ end;
+ gFullScreen := fullscreen;
+ gWinMaximized := maximized;
+ gRC_FullScreen := fullscreen;
+ gRC_Maximized := maximized;
+ if @sys_ScreenResize <> nil then
+ sys_ScreenResize(w, h);
result := true
end
else
begin
result := true
end
else
begin
+ // SDL_DestroyWindow(window);
e_LogWritefln('SDL: unable to create OpenGL context: %s', [SDL_GetError])
end
end
e_LogWritefln('SDL: unable to create OpenGL context: %s', [SDL_GetError])
end
end
else
begin
if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
else
begin
if fullScreen then flags := SDL_WINDOW_FULLSCREEN else flags := 0;
- SDL_SetWindowSize(window, w, h);
SDL_SetWindowFullscreen(window, flags);
SDL_SetWindowFullscreen(window, flags);
- UpdateSize(w, h);
+ SDL_SetWindowSize(window, w, h);
+ if maximized then SDL_MaximizeWindow(window);
+ // always reset to center when changing fullscreen->windowed for safety purposes
+ if wc or (gFullscreen and not fullscreen) or (gWinMaximized and not maximized) then
+ begin
+ x := SDL_WINDOWPOS_CENTERED;
+ y := SDL_WINDOWPOS_CENTERED
+ end
+ else
+ begin
+ x := wx;
+ y := wy
+ end;
+ SDL_SetWindowPosition(window, x, y);
+ if (fullscreen = false) and (maximized = false) and (wc = false) then
+ begin
+ SDL_GetWindowPosition(window, @x, @y);
+ wx := x; wy := y
+ end;
+ gFullScreen := fullscreen;
+ gWinMaximized := maximized;
+ gRC_FullScreen := fullscreen;
+ gRC_Maximized := maximized;
+ if @sys_ScreenResize <> nil then
+ sys_ScreenResize(w, h);
result := true
end
end;
result := true
end
end;
SDL_GL_SetSwapInterval(0)
end;
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;
var i, count, num, pw, ph: Integer; m: TSDL_DisplayMode;
begin
result := nil;
end
end;
end
end;
- function sys_SetDisplayMode (w, h, bpp: Integer; fullScreen: Boolean): Boolean;
+ function sys_SetDisplayMode (w, h, bpp: Integer; fullScreen, maximized: Boolean): Boolean;
begin
begin
- result := InitWindow(w, h, bpp, fullScreen)
+ {$IFDEF USE_GLES1}
+ rMajor := 1;
+ rMinor := 1;
+ rProfile := SDL_GL_CONTEXT_PROFILE_ES;
+ {$ELSE}
+ rMajor := 2;
+ rMinor := 1;
+ rProfile := SDL_GL_CONTEXT_PROFILE_COMPATIBILITY;
+ {$ENDIF}
+ result := InitWindow(w, h, bpp, fullScreen, maximized)
+ end;
+
+ function sys_SetDisplayModeGL (const info: TGLDisplayInfo): Boolean;
+ begin
+ rMajor := info.major;
+ rMinor := info.minor;
+ case info.profile of
+ TGLProfile.Core: rProfile := SDL_GL_CONTEXT_PROFILE_CORE;
+ TGLProfile.Compat: rProfile := SDL_GL_CONTEXT_PROFILE_COMPATIBILITY;
+ TGLProfile.Common: rProfile := SDL_GL_CONTEXT_PROFILE_ES;
+ TGLProfile.CommonLite: rProfile := SDL_GL_CONTEXT_PROFILE_ES;
+ end;
+ result := InitWindow(info.w, info.h, info.bpp, info.fullscreen, info.maximized);
end;
(* --------- Joystick --------- *)
end;
(* --------- Joystick --------- *)
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])
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);
end;
procedure HandleJoyAdd (var ev: TSDL_JoyDeviceEvent);
end
end;
end
end;
+ (* --------- Touch --------- *)
+
+{$IFDEF ENABLE_TOUCH}
+ function sys_IsTextInputActive (): Boolean;
+ begin
+ Result := SDL_IsTextInputActive() = SDL_True
+ end;
+
+ procedure sys_ShowKeyboard (yes: Boolean);
+ begin
+ if g_dbg_input then
+ e_LogWritefln('g_Touch_ShowKeyboard(%s)', [yes]);
+ (* on desktop we always receive text (needed for cheats) *)
+ if yes or (SDL_HasScreenKeyboardSupport() = SDL_FALSE) then
+ SDL_StartTextInput
+ else
+ SDL_StopTextInput
+ end;
+
+ procedure HandleTouch (const ev: TSDL_TouchFingerEvent);
+ var
+ x, y, i, finger: Integer;
+
+ function IntersectControl(ctl, xx, yy: Integer): Boolean;
+ {$IFDEF ENABLE_RENDER}
+ var x, y, w, h: Integer; founded: Boolean;
+ {$ENDIF}
+ begin
+ {$IFDEF ENABLE_RENDER}
+ r_Render_GetKeyRect(ctl, x, y, w, h, founded);
+ Result := founded and (xx >= x) and (yy >= y) and (xx <= x + w) and (yy <= y + h);
+ {$ELSE}
+ Result := False
+ {$ENDIF}
+ end;
+
+ procedure KeyUp (finger, i: Integer);
+ begin
+ if g_dbg_input then
+ e_LogWritefln('Input Debug: g_touch.KeyUp, finger=%s, key=%s', [finger, i]);
+
+ keyFinger[i] := 0;
+ e_KeyUpDown(i, False);
+ g_Console_ProcessBind(i, False);
+
+ (* up/down + fire hack *)
+{$IFDEF ENABLE_MENU}
+ if g_touch_fire and (gGameSettings.GameType <> GT_NONE) and (g_ActiveWindow = nil) and angleFire then
+{$ELSE}
+ if g_touch_fire and (gGameSettings.GameType <> GT_NONE) and angleFire then
+{$ENDIF}
+ begin
+ if (i = VK_UP) or (i = VK_DOWN) then
+ begin
+ angleFire := False;
+ keyFinger[VK_FIRE] := 0;
+ e_KeyUpDown(VK_FIRE, False);
+ g_Console_ProcessBind(VK_FIRE, False)
+ end
+ end
+ end;
+
+ procedure KeyDown (finger, i: Integer);
+ begin
+ if g_dbg_input then
+ e_LogWritefln('Input Debug: g_touch.KeyDown, finger=%s, key=%s', [finger, i]);
+
+ keyFinger[i] := finger;
+ e_KeyUpDown(i, True);
+ g_Console_ProcessBind(i, True);
+
+ (* up/down + fire hack *)
+{$IFDEF ENABLE_MENU}
+ if g_touch_fire and (gGameSettings.GameType <> GT_NONE) and (g_ActiveWindow = nil) then
+{$ELSE}
+ if g_touch_fire and (gGameSettings.GameType <> GT_NONE) then
+{$ENDIF}
+ begin
+ if i = VK_UP then
+ begin
+ angleFire := True;
+ keyFinger[VK_FIRE] := -1;
+ e_KeyUpDown(VK_FIRE, True);
+ g_Console_ProcessBind(VK_FIRE, True)
+ end
+ else if i = VK_DOWN then
+ begin
+ angleFire := True;
+ keyFinger[VK_FIRE] := -1;
+ e_KeyUpDown(VK_FIRE, True);
+ g_Console_ProcessBind(VK_FIRE, True)
+ end
+ end
+ end;
+
+ procedure KeyMotion (finger, i: Integer);
+ begin
+ if keyFinger[i] <> finger then
+ begin
+ KeyUp(finger, i);
+ KeyDown(finger, i)
+ end
+ end;
+
+ begin
+ if not g_touch_enabled then
+ Exit;
+
+ finger := ev.fingerId + 2;
+ x := Trunc(ev.x * gWinSizeX);
+ y := Trunc(ev.y * gWinSizeY);
+
+ for i := VK_FIRSTKEY to VK_LASTKEY do
+ begin
+ if IntersectControl(i, x, y) then
+ begin
+ if ev.type_ = SDL_FINGERUP then
+ KeyUp(finger, i)
+ else if ev.type_ = SDL_FINGERMOTION then
+ KeyMotion(finger, i)
+ else if ev.type_ = SDL_FINGERDOWN then
+ keyDown(finger, i)
+ end
+ else if keyFinger[i] = finger then
+ begin
+ if ev.type_ = SDL_FINGERUP then
+ KeyUp(finger, i)
+ else if ev.type_ = SDL_FINGERMOTION then
+ KeyUp(finger, i)
+ end
+ end
+ end;
+{$ENDIF} // TOUCH
+
(* --------- Input --------- *)
function HandleWindow (var ev: TSDL_WindowEvent): Boolean;
begin
result := false;
(* --------- Input --------- *)
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
case ev.event of
- SDL_WINDOWEVENT_RESIZED: UpdateSize(ev.data1, ev.data2);
+ SDL_WINDOWEVENT_RESIZED:
+ if @sys_ScreenResize <> nil then
+ sys_ScreenResize(ev.data1, ev.data2);
SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
SDL_WINDOWEVENT_CLOSE: result := true;
SDL_WINDOWEVENT_EXPOSED: sys_Repaint;
SDL_WINDOWEVENT_CLOSE: result := true;
+ SDL_WINDOWEVENT_MOVED:
+ begin
+ wx := ev.data1;
+ wy := ev.data2
+ end;
+ 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
+ if ev.event = SDL_WINDOWEVENT_MAXIMIZED then
+ begin
+ gWinMaximized := true;
+ gRC_Maximized := true
+ end
+ else if ev.event = SDL_WINDOWEVENT_RESTORED then
+ begin
+ gWinMaximized := false;
+ gRC_Maximized := false
+ end;
+ e_MuteChannels(false);
+ {$IFDEF ENABLE_HOLMES}
+ if assigned(winFocusCB) then winFocusCB;
+ {$ENDIF}
+ end;
end
end;
end
end;
down := (ev.type_ = SDL_KEYDOWN);
if key = SDL_SCANCODE_AC_BACK then
key := SDL_SCANCODE_ESCAPE;
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
if ev._repeat = 0 then
begin
if g_dbg_input then
e_KeyUpDown(key, down);
g_Console_ProcessBind(key, down);
end
e_KeyUpDown(key, down);
g_Console_ProcessBind(key, down);
end
- else if gConsoleShow or gChatShow or (g_ActiveWindow <> nil) then
+ else
begin
begin
- KeyPress(key) // key repeat in menus and shit
+ if g_dbg_input then
+ e_LogWritefln('Input Debug: keyrep, scancode=%s', [key]);
+ g_Console_ProcessBindRepeat(key);
end
end;
procedure HandleTextInput (var ev: TSDL_TextInputEvent);
var ch: UnicodeChar; sch: AnsiChar;
begin
end
end;
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);
Utf8ToUnicode(@ch, PChar(ev.text), 1);
- if IsValid1251(Word(ch)) then
- begin
- sch := AnsiChar(wchar2win(ch));
- CharPress(sch);
- end;
+ 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 @sys_CharPress <> nil then
+ if IsValid1251(Word(ch)) and IsPrintable1251(ch) then
+ sys_CharPress(sch)
end;
function sys_HandleInput (): Boolean;
var ev: TSDL_Event;
begin
result := false;
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
while SDL_PollEvent(@ev) <> 0 do
begin
case ev.type_ of
SDL_JOYDEVICEADDED: HandleJoyAdd(ev.jdevice);
SDL_JOYDEVICEREMOVED: HandleJoyRemove(ev.jdevice);
SDL_TEXTINPUT: HandleTextInput(ev.text);
SDL_JOYDEVICEADDED: HandleJoyAdd(ev.jdevice);
SDL_JOYDEVICEREMOVED: HandleJoyRemove(ev.jdevice);
SDL_TEXTINPUT: HandleTextInput(ev.text);
- SDL_FINGERMOTION, SDL_FINGERDOWN, SDL_FINGERUP: g_Touch_HandleEvent(ev.tfinger);
+ {$IFDEF ENABLE_TOUCH}
+ SDL_FINGERMOTION, SDL_FINGERDOWN, SDL_FINGERUP: HandleTouch(ev.tfinger);
+ {$ENDIF}
+ {$IFDEF ENABLE_HOLMES}
+ SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEWHEEL, SDL_MOUSEMOTION: fuiOnSDLEvent(ev);
+ {$ENDIF}
end
end
end;
end
end
end;
(* --------- Init --------- *)
procedure sys_Init;
(* --------- Init --------- *)
procedure sys_Init;
- var flags: UInt32; ok: Boolean;
+ var flags: UInt32;
begin
e_WriteLog('Init SDL2', TMsgType.Notify);
{$IFDEF HEADLESS}
begin
e_WriteLog('Init SDL2', TMsgType.Notify);
{$IFDEF HEADLESS}
flags := SDL_INIT_TIMER or $00004000;
{$ENDIF}
{$ELSE}
flags := SDL_INIT_TIMER or $00004000;
{$ENDIF}
{$ELSE}
- flags := SDL_INIT_JOYSTICK or SDL_INIT_TIMER or SDL_INIT_VIDEO;
+ flags := SDL_INIT_TIMER or SDL_INIT_VIDEO;
{$ENDIF}
SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, '0');
if SDL_Init(flags) <> 0 then
raise Exception.Create('SDL: Init failed: ' + SDL_GetError);
{$ENDIF}
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);
+ {$IFNDEF HEADLESS}
+ if SDL_InitSubSystem(SDL_INIT_JOYSTICK) <> 0 then
+ e_LogWritefln('SDL: Init subsystem failed: %s', [SDL_GetError()]);
+ {$ENDIF}
+ SDL_ShowCursor(SDL_DISABLE);
+ {$IFDEF ENABLE_TOUCH}
+ sys_ShowKeyboard(FALSE);
+ g_touch_enabled := SDL_GetNumTouchDevices() > 0;
+ {$ELSE}
+ g_touch_enabled := False;
+ {$ENDIF}
end;
procedure sys_Final;
begin
e_WriteLog('Releasing SDL2', TMsgType.Notify);
if context <> nil then
end;
procedure sys_Final;
begin
e_WriteLog('Releasing SDL2', TMsgType.Notify);
if context <> nil then
+ begin
SDL_GL_DeleteContext(context);
SDL_GL_DeleteContext(context);
+ context := nil;
+ end;
if window <> nil then
if window <> nil then
+ begin
SDL_DestroyWindow(window);
SDL_DestroyWindow(window);
- window := nil;
- context := nil;
+ window := nil;
+ end;
SDL_Quit
end;
initialization
conRegVar('sdl2_display_index', @display, 'use display index as base', '');
SDL_Quit
end;
initialization
conRegVar('sdl2_display_index', @display, 'use display index as base', '');
+ conRegVar('sdl2_window_x', @wx, 'window position x', '');
+ conRegVar('sdl2_window_y', @wy, 'window position y', '');
+ conRegVar('sdl2_window_center', @wc, 'force window creation at center', '');
+ display := 0;
+ wx := SDL_WINDOWPOS_CENTERED;
+ wy := SDL_WINDOWPOS_CENTERED;
+ wc := false
end.
end.