X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_window.pas;h=f7f06d89d2aa5e3fc8712b12f30d99e5c20cdbb9;hb=601480a60d06a26f053bee5b93650c3df73343cf;hp=e3cecb705cbace841c2c815947f9c5a7f5882b8a;hpb=34b9017efb5e80bd66438479d10d7d442f24ad6d;p=d2df-sdl.git diff --git a/src/game/g_window.pas b/src/game/g_window.pas index e3cecb7..f7f06d8 100644 --- a/src/game/g_window.pas +++ b/src/game/g_window.pas @@ -1,4 +1,4 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,8 +24,6 @@ uses function SDLMain (): Integer; function GetTimer (): Int64; procedure ResetTimer (); -function CreateGLWindow (Title: PChar): Boolean; -procedure KillGLWindow (); procedure PushExitEvent (); function ProcessMessage (): Boolean; procedure ReDrawWindow (); @@ -61,7 +59,7 @@ uses const - ProgressUpdateMSecs = 100; + ProgressUpdateMSecs = 1;//100; var h_Wnd: PSDL_Window = nil; @@ -70,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; @@ -81,13 +81,13 @@ var {$ENDIF} -procedure KillGLWindow (); +procedure KillGLWindow (preserveGL: Boolean); begin - if (h_GL <> nil) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end; + if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end; if (h_Wnd <> nil) then SDL_DestroyWindow(h_Wnd); - if (h_GL <> nil) then SDL_GL_DeleteContext(h_GL); + if (h_GL <> nil) and (not preserveGL) then SDL_GL_DeleteContext(h_GL); h_Wnd := nil; - h_GL := nil; + if (not preserveGL) then h_GL := nil; end; @@ -96,6 +96,7 @@ function g_Window_SetDisplay (preserveGL: Boolean = false): Boolean; var mode, cmode: TSDL_DisplayMode; wFlags: LongWord = 0; + nw, nh: Integer; {$ENDIF} begin {$IF not DEFINED(HEADLESS)} @@ -103,11 +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; - if gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED; - - KillGLWindow(); + 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 @@ -118,24 +117,58 @@ begin mode.driverdata := nil; if (SDL_GetClosestDisplayMode(0, @mode, @cmode) = nil) then begin + e_WriteLog('SDL: cannot find display mode for '+IntToStr(gScreenWidth), TMsgType.Notify); gScreenWidth := 800; gScreenHeight := 600; end else begin + e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify); gScreenWidth := cmode.w; gScreenHeight := cmode.h; end; end; - 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); + if (gFullscreen) then + begin + nw := 0; + nh := 0; + SDL_GetWindowSize(h_Wnd, @nw, @nh); + if (nw > 128) and (nh > 128) then + begin + e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify); + gScreenWidth := nw; + gScreenHeight := nh; + end + else + begin + e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify); + end; + end; fuiScrWdt := gScreenWidth; fuiScrHgt := gScreenHeight; - if (h_GL <> nil) then begin if (assigned(oglInitCB)) then oglInitCB(); end; + if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end; {$ENDIF} result := true; @@ -178,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)} @@ -204,6 +238,7 @@ begin if (gScreenWidth <> w) or (gScreenHeight <> h) then begin result := true; + preserve := true; gScreenWidth := w; gScreenHeight := h; end; @@ -211,6 +246,7 @@ begin if (gFullscreen <> fullscreen) then begin result := true; + preserve := true; gFullscreen := fullscreen; preserve := true; end; @@ -260,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 @@ -276,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 @@ -295,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'); @@ -459,14 +509,14 @@ begin if not g_Window_SetDisplay() then begin - KillGLWindow(); + KillGLWindow(false); e_WriteLog('Window creation error (resolution not supported?)', TMsgType.Fatal); exit; end; {$IF not DEFINED(HEADLESS)} - h_Gl := SDL_GL_CreateContext(h_Wnd); - if (h_Gl = nil) then exit; + h_GL := SDL_GL_CreateContext(h_Wnd); + if (h_GL = nil) then exit; fuiScrWdt := gScreenWidth; fuiScrHgt := gScreenHeight; if (assigned(oglInitCB)) then oglInitCB(); @@ -577,7 +627,8 @@ begin begin if g_Texture_Get('INTER', ID) then begin - e_DrawSize(ID, 0, 0, 0, false, false, gScreenWidth, gScreenHeight) + e_DrawSize(ID, 0, 0, 0, false, false, gScreenWidth, gScreenHeight); + e_DarkenQuadWH(0, 0, gScreenWidth, gScreenHeight, 150); end else begin @@ -909,7 +960,7 @@ begin while not ProcessMessage() do begin end; Release(); - KillGLWindow(); + KillGLWindow(false); result := 0; end;