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 {$INCLUDE ../nogl/noGLuses.inc}
55 {$IFDEF ENABLE_HOLMES}
57 {$ENDIF}
63 g_touch;
66 const
69 var
74 {$IF not DEFINED(HEADLESS)}
77 {$ENDIF}
83 {$IFNDEF WINDOWS}
86 {$ENDIF}
90 begin
91 {$IFDEF ENABLE_HOLMES}
92 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
93 {$ENDIF}
96 begin
98 {$IFDEF USE_NANOGL}
99 nanoGL_Destroy;
100 {$ENDIF}
102 {$IFDEF USE_NOGL}
103 nogl_Quit;
104 {$ENDIF}
114 {$IF not DEFINED(HEADLESS)}
115 var
119 {$ENDIF}
120 begin
121 {$IF not DEFINED(HEADLESS)}
127 if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
128 if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
131 begin
138 begin
142 end
143 else
144 begin
145 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
152 begin
153 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
154 //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
159 //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
160 //SDL_SetWindowFullscreen(h_Wnd, 0);
161 end
162 else
163 begin
165 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
176 begin
181 begin
182 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
185 end
186 else
187 begin
188 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
192 {$IFDEF ENABLE_HOLMES}
195 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
196 {$ENDIF}
197 {$ENDIF}
204 var
207 begin
214 begin
232 begin
238 begin
239 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
242 {$IF not DEFINED(HEADLESS)}
243 {$IFDEF ENABLE_HOLMES}
246 {$ENDIF}
251 {$ENDIF}
256 {$IF not DEFINED(HEADLESS)}
257 var
259 {$ENDIF}
260 begin
262 {$IF not DEFINED(HEADLESS)}
266 begin
274 begin
282 begin
286 {$ENDIF}
291 var
293 begin
299 SDL_WINDOWEVENT_MOVED:
300 begin
302 begin
308 SDL_WINDOWEVENT_MINIMIZED:
309 begin
312 begin
316 begin
324 SDL_WINDOWEVENT_RESIZED:
325 begin
326 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
327 {if (gFullscreen) then
328 begin
329 e_LogWriteln(' fullscreen fix applied.');
330 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
331 begin
332 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
333 end;
334 end
335 else}
336 begin
343 begin
345 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
349 SDL_WINDOWEVENT_EXPOSED:
352 SDL_WINDOWEVENT_MAXIMIZED:
353 begin
356 begin
362 begin
365 begin
372 SDL_WINDOWEVENT_RESTORED:
373 begin
376 begin
383 begin
389 SDL_WINDOWEVENT_FOCUS_GAINED:
390 begin
392 //e_WriteLog('window gained focus!', MSG_NOTIFY);
395 SDL_WINDOWEVENT_FOCUS_LOST:
396 begin
399 //e_WriteLog('window lost focus!', MSG_NOTIFY);
404 begin
406 begin
412 begin
413 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
418 begin
425 {$IFDEF ENABLE_HOLMES}
427 {$ENDIF}
429 end
431 begin
433 begin
434 //e_WriteLog('activating window', MSG_NOTIFY);
438 begin
439 //e_WriteLog('activating sounds', MSG_NOTIFY);
444 begin
451 {$IFDEF ENABLE_HOLMES}
453 {$ENDIF}
460 var
464 begin
468 SDL_WINDOWEVENT:
471 SDL_QUITEV:
472 begin
474 begin
476 begin
479 end
480 else
481 begin
489 begin
494 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
496 begin
497 // event eaten, but...
499 exit;
501 {$ENDIF}
506 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
509 {$ENDIF}
511 SDL_TEXTINPUT:
512 begin
522 // other key presses and joysticks are handled in e_input
528 begin
529 {$IF not DEFINED(HEADLESS)}
531 {$ENDIF}
536 begin
542 {$IF not DEFINED(HEADLESS)}
544 {$ENDIF}
548 begin
551 exit;
554 {$IF not DEFINED(HEADLESS)}
557 {$IFDEF ENABLE_HOLMES}
560 {$ENDIF}
562 {$IFDEF USE_NANOGL}
564 begin
567 exit;
569 {$ENDIF}
570 {$IFDEF USE_NOGL}
571 nogl_Init;
572 {$ENDIF}
573 {$IFDEF ENABLE_HOLMES}
575 {$ENDIF}
577 {$ENDIF}
586 {$IFDEF WINDOWS}
587 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
589 var
591 begin
596 {$ELSE}
598 var
601 begin
604 begin
607 end
608 else
609 begin
611 begin
612 // overflow, increment overflow ;-)
621 {$ENDIF}
625 begin
631 var
633 begin
639 var
643 var
647 begin
652 begin
659 begin
661 exit;
665 begin
667 begin
669 end
670 else
671 begin
674 begin
681 begin
683 begin
686 end
687 else
688 begin
700 begin
702 end
703 else
704 begin
705 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
713 var
715 begin
719 begin
728 var
730 begin
739 begin
749 begin
752 begin
757 end
758 else
759 begin
768 begin
774 begin
776 exit;
779 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
781 begin
784 begin
788 end
789 else
790 begin
799 begin
805 {$IF not DEFINED(HEADLESS)}
806 var
808 {$ENDIF}
809 begin
810 {$IF not DEFINED(HEADLESS)}
813 begin
815 end
816 else
817 begin
818 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
820 {$ENDIF}
825 begin
826 {$IF not DEFINED(HEADLESS)}
827 {$IFDEF USE_GLES1}
831 {$ELSE}
839 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
840 {$ENDIF}
841 {$ENDIF}
846 var
851 begin
858 begin
860 begin
864 begin
866 end
867 else
868 begin
876 begin
880 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
888 var
890 {$IF not DEFINED(HEADLESS)}
892 {$ENDIF}
897 begin
898 {$IFDEF HEADLESS}
900 {$ELSE}
901 {$IFDEF ENABLE_HOLMES}
903 begin
907 {$ENDIF}
908 {$ENDIF}
912 begin
916 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
932 {.$IF DEFINED(D2F_DEBUG)}
934 {.$ENDIF}
936 {$IFDEF ENABLE_HOLMES}
940 begin
942 begin
949 begin
951 begin
954 {$IFNDEF HEADLESS}
956 begin
963 {$ELSE}
964 // fuck off, fpc!
967 {$ENDIF}
971 {$ENDIF}
974 begin
976 begin
983 begin
996 begin
999 exit;
1002 {EnumDisplayModes();}
1004 {$IFDEF HEADLESS}
1005 //gwin_k8_enable_light_experiments := false;
1009 {$ELSE}
1015 begin
1018 end
1019 else
1020 begin
1025 {$ENDIF}
1030 // Êîìàíäíàÿ ñòðîêà
1033 // Çàïðîñ ÿçûêà
1038 // main loop