7f542509b7b9febaf98200f072db129d08de578d
1 (* Copyright (C) Doom 2D: Forever Developers
2 *
3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *)
16 {$INCLUDE ../shared/a_modes.inc}
19 interface
21 uses
22 utils;
39 // returns `true` if quit event was received
43 var
50 implementation
52 uses
54 {$IFDEF USE_NANOGL}
55 nanoGL,
56 {$ELSE}
58 {$ENDIF}
59 {$IFDEF ENABLE_HOLMES}
61 {$ENDIF}
67 g_touch;
70 const
73 var
78 {$IF not DEFINED(HEADLESS)}
81 {$ENDIF}
87 {$IFNDEF WINDOWS}
90 {$ENDIF}
94 begin
95 {$IFDEF ENABLE_HOLMES}
96 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
97 {$ENDIF}
100 begin
101 {$IFDEF USE_NANOGL}
102 nanoGL_Destroy;
103 {$ENDIF USE_NANOGL}
112 {$IF not DEFINED(HEADLESS)}
113 var
117 {$ENDIF}
118 begin
119 {$IF not DEFINED(HEADLESS)}
125 if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
126 if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
129 begin
136 begin
140 end
141 else
142 begin
143 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
150 begin
151 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
152 //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
157 //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
158 //SDL_SetWindowFullscreen(h_Wnd, 0);
159 end
160 else
161 begin
163 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
174 begin
179 begin
180 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
183 end
184 else
185 begin
186 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
190 {$IFDEF ENABLE_HOLMES}
193 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
194 {$ENDIF}
195 {$ENDIF}
202 var
205 begin
212 begin
230 begin
236 begin
237 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
240 {$IF not DEFINED(HEADLESS)}
241 {$IFDEF ENABLE_HOLMES}
244 {$ENDIF}
249 {$ENDIF}
254 {$IF not DEFINED(HEADLESS)}
255 var
257 {$ENDIF}
258 begin
260 {$IF not DEFINED(HEADLESS)}
264 begin
272 begin
280 begin
284 {$ENDIF}
289 var
291 begin
297 SDL_WINDOWEVENT_MOVED:
298 begin
300 begin
306 SDL_WINDOWEVENT_MINIMIZED:
307 begin
310 begin
314 begin
322 SDL_WINDOWEVENT_RESIZED:
323 begin
324 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
325 {if (gFullscreen) then
326 begin
327 e_LogWriteln(' fullscreen fix applied.');
328 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
329 begin
330 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
331 end;
332 end
333 else}
334 begin
341 begin
343 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
347 SDL_WINDOWEVENT_EXPOSED:
350 SDL_WINDOWEVENT_MAXIMIZED:
351 begin
354 begin
360 begin
363 begin
370 SDL_WINDOWEVENT_RESTORED:
371 begin
374 begin
381 begin
387 SDL_WINDOWEVENT_FOCUS_GAINED:
388 begin
390 //e_WriteLog('window gained focus!', MSG_NOTIFY);
393 SDL_WINDOWEVENT_FOCUS_LOST:
394 begin
397 //e_WriteLog('window lost focus!', MSG_NOTIFY);
402 begin
404 begin
410 begin
411 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
416 begin
423 {$IFDEF ENABLE_HOLMES}
425 {$ENDIF}
427 end
429 begin
431 begin
432 //e_WriteLog('activating window', MSG_NOTIFY);
436 begin
437 //e_WriteLog('activating sounds', MSG_NOTIFY);
442 begin
449 {$IFDEF ENABLE_HOLMES}
451 {$ENDIF}
458 var
462 begin
466 SDL_WINDOWEVENT:
469 SDL_QUITEV:
470 begin
472 begin
474 begin
477 end
478 else
479 begin
487 begin
492 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
494 begin
495 // event eaten, but...
497 exit;
499 {$ENDIF}
504 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
507 {$ENDIF}
509 SDL_TEXTINPUT:
510 begin
520 // other key presses and joysticks are handled in e_input
526 begin
527 {$IF not DEFINED(HEADLESS)}
529 {$ENDIF}
534 begin
540 {$IF not DEFINED(HEADLESS)}
542 {$ENDIF}
546 begin
549 exit;
552 {$IF not DEFINED(HEADLESS)}
555 {$IFDEF ENABLE_HOLMES}
558 {$ENDIF}
560 {$IFDEF USE_NANOGL}
562 begin
565 exit;
567 {$ENDIF}
568 {$IFDEF ENABLE_HOLMES}
570 {$ENDIF}
572 {$ENDIF}
581 {$IFDEF WINDOWS}
582 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
584 var
586 begin
591 {$ELSE}
593 var
596 begin
599 begin
602 end
603 else
604 begin
606 begin
607 // overflow, increment overflow ;-)
616 {$ENDIF}
620 begin
626 var
628 begin
634 var
638 var
642 begin
647 begin
654 begin
656 exit;
660 begin
662 begin
664 end
665 else
666 begin
669 begin
676 begin
678 begin
681 end
682 else
683 begin
695 begin
697 end
698 else
699 begin
700 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
708 var
710 begin
714 begin
723 var
725 begin
734 begin
744 begin
747 begin
752 end
753 else
754 begin
763 begin
769 begin
771 exit;
774 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
776 begin
779 begin
783 end
784 else
785 begin
794 begin
800 {$IF not DEFINED(HEADLESS)}
801 var
803 {$ENDIF}
804 begin
805 {$IF not DEFINED(HEADLESS)}
808 begin
810 end
811 else
812 begin
813 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
815 {$ENDIF}
820 begin
821 {$IF not DEFINED(HEADLESS)}
822 {$IFDEF USE_NANOGL}
826 {$ELSE}
834 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
835 {$ENDIF}
836 {$ENDIF}
841 var
846 begin
853 begin
855 begin
859 begin
861 end
862 else
863 begin
871 begin
875 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
883 var
885 {$IF not DEFINED(HEADLESS)}
887 {$ENDIF}
892 begin
893 {$IFDEF HEADLESS}
895 {$ELSE}
896 {$IFDEF ENABLE_HOLMES}
898 begin
902 {$ENDIF}
903 {$ENDIF}
907 begin
911 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
927 {.$IF DEFINED(D2F_DEBUG)}
929 {.$ENDIF}
931 {$IFDEF ENABLE_HOLMES}
935 begin
937 begin
944 begin
946 begin
949 {$IFNDEF HEADLESS}
951 begin
958 {$ELSE}
959 // fuck off, fpc!
962 {$ENDIF}
966 {$ENDIF}
969 begin
971 begin
978 begin
991 begin
994 exit;
997 {EnumDisplayModes();}
999 {$IFDEF HEADLESS}
1000 //gwin_k8_enable_light_experiments := false;
1004 {$ELSE}
1010 begin
1013 end
1014 else
1015 begin
1020 {$ENDIF}
1025 // Êîìàíäíàÿ ñòðîêà
1028 // Çàïðîñ ÿçûêà
1033 // main loop