X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fsdl%2Fg_system.pas;h=5fe730283d1c6384f36ba8d46abcabca7a1a1abe;hb=724d5405f0f3fe166b931b1b8b5745b2eb340651;hp=81b1ca3dc6ade228ac39c49b5d7cbc1e41409252;hpb=8e694e6ddeb42110a00233d7ff7345c57ee5d90d;p=d2df-sdl.git diff --git a/src/game/sdl/g_system.pas b/src/game/sdl/g_system.pas index 81b1ca3..5fe7302 100644 --- a/src/game/sdl/g_system.pas +++ b/src/game/sdl/g_system.pas @@ -19,9 +19,6 @@ interface (* To fix: * - Joystick support - * - Window resizing using SDL_VIDEORESIZE - * -- Linux: GL drawing area have wrong size - * -- OSX: GL context are recreated *) uses Utils; @@ -51,14 +48,19 @@ implementation e_log, e_graphics, e_input, g_options, g_window, g_console, g_game, g_menu, g_gui, g_main; + const + GameTitle = 'Doom 2D: Forever (SDL 1.2)'; + var + userResize: Boolean; + modeResize: Integer; screen: PSDL_Surface; (* --------- Utils --------- *) function sys_GetTicks (): Int64; begin - Result := SDL_GetTicks() + result := SDL_GetTicks() end; procedure sys_Delay (ms: Integer); @@ -90,26 +92,26 @@ implementation function InitWindow (w, h, bpp: Integer; fullScreen: Boolean): Boolean; var flags: Uint32; begin - e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullscreen]); - Result := False; + e_LogWritefln('InitWindow %s %s %s %s', [w, h, bpp, fullScreen]); + result := False; 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... - flags := SDL_OPENGL or SDL_VIDEORESIZE; - if fullScreen then - flags := flags or SDL_FULLSCREEN; + flags := SDL_OPENGL; + if fullScreen then flags := flags or SDL_FULLSCREEN; + if userResize then flags := flags or SDL_VIDEORESIZE; if (screen = nil) or (SDL_VideoModeOk(w, h, bpp, flags) <> 0) then begin SDL_FreeSurface(screen); screen := SDL_SetVideoMode(w, h, bpp, flags); if screen <> nil then begin - SDL_WM_SetCaption('Doom 2D: Forever (SDL 1.2)', nil); + SDL_WM_SetCaption(GameTitle, nil); UpdateSize(w, h); - Result := True + result := True end end else @@ -261,13 +263,10 @@ implementation end else if gConsoleShow or gChatShow or (g_ActiveWindow <> nil) then begin - KeyPress(key) + KeyPress(key) // key repeat in menus and shit end; - if down and (ev.keysym.unicode <= $44F) then - begin - if IsPrintable1251(ch) then - CharPress(ch) - end + if down and IsValid1251(ev.keysym.unicode) and IsPrintable1251(ch) then + CharPress(ch) end; function sys_HandleInput (): Boolean; @@ -278,8 +277,17 @@ implementation begin case ev.type_ of SDL_QUITEV: result := true; - SDL_VIDEORESIZE: InitWindow(ev.resize.w, ev.resize.h, gBPP, gFullscreen); + SDL_VIDEORESIZE: + begin + if g_dbg_input then + e_LogWritefln('Input Debug: SDL_VIDEORESIZE %s %s', [ev.resize.w, ev.resize.h]); + if modeResize = 1 then + UpdateSize(ev.resize.w, ev.resize.h) + else if modeResize > 1 then + InitWindow(ev.resize.w, ev.resize.h, gBPP, gFullscreen) + end; SDL_KEYUP, SDL_KEYDOWN: HandleKeyboard(ev.key); + SDL_VIDEOEXPOSE: sys_Repaint; end end end; @@ -296,14 +304,15 @@ implementation procedure sys_Init; var flags: Uint32; ok: Boolean; begin + e_WriteLog('Init SDL', TMsgType.Notify); flags := SDL_INIT_VIDEO or SDL_INIT_AUDIO or SDL_INIT_TIMER or SDL_INIT_JOYSTICK (*or SDL_INIT_NOPARACHUTE*); if SDL_Init(flags) <> 0 then - raise Exception.Create('SDL: Init failed: ' + SDL_GetError()); + 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); + raise Exception.Create('SDL: Failed to set videomode: ' + SDL_GetError); SDL_EnableUNICODE(1); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); end; @@ -315,4 +324,10 @@ implementation SDL_Quit end; +initialization + (* window resize are broken both on linux and osx, so disabled by default *) + conRegVar('sdl_allow_resize', @userResize, 'allow to resize window by user', 'allow to resize window by user'); + conRegVar('sdl_resize_action', @modeResize, 'set window resize mode (0: ignore, 1: change, 2: reset)', ''); + userResize := false; + modeResize := 0; end.