44997de63c8046824eb8b1c762ad9fb636fe57f1
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}
91 begin
92 {$IFDEF ENABLE_HOLMES}
93 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
94 {$ENDIF}
97 begin
99 {$IFDEF USE_NANOGL}
100 nanoGL_Destroy;
101 {$ENDIF}
103 {$IFDEF USE_NOGL}
104 nogl_Quit;
105 {$ENDIF}
115 {$IF not DEFINED(HEADLESS)}
116 var
120 {$ENDIF}
121 begin
122 {$IF not DEFINED(HEADLESS)}
128 if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
129 if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
132 begin
139 begin
143 end
144 else
145 begin
146 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
153 begin
154 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
155 //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
160 //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
161 //SDL_SetWindowFullscreen(h_Wnd, 0);
162 end
163 else
164 begin
166 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
177 begin
182 begin
183 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
186 end
187 else
188 begin
189 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
193 {$IFDEF ENABLE_HOLMES}
196 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
197 {$ENDIF}
198 {$ENDIF}
205 var
208 begin
215 begin
233 begin
239 begin
240 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
243 {$IF not DEFINED(HEADLESS)}
244 {$IFDEF ENABLE_HOLMES}
247 {$ENDIF}
250 {$IF DEFINED(ANDROID)}
251 (* This will fix menu reset on keyboard showing *)
253 g_Menu_Reset;
254 {$ELSE}
255 g_Menu_Reset;
256 {$ENDIF}
258 {$ENDIF}
263 {$IF not DEFINED(HEADLESS)}
264 var
266 {$ENDIF}
267 begin
269 {$IF not DEFINED(HEADLESS)}
273 begin
281 begin
289 begin
293 {$ENDIF}
298 var
300 begin
306 SDL_WINDOWEVENT_MOVED:
307 begin
309 begin
315 SDL_WINDOWEVENT_MINIMIZED:
316 begin
319 begin
323 begin
331 SDL_WINDOWEVENT_RESIZED:
332 begin
333 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
334 {if (gFullscreen) then
335 begin
336 e_LogWriteln(' fullscreen fix applied.');
337 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
338 begin
339 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
340 end;
341 end
342 else}
343 begin
350 begin
352 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
356 SDL_WINDOWEVENT_EXPOSED:
359 SDL_WINDOWEVENT_MAXIMIZED:
360 begin
363 begin
369 begin
372 begin
379 SDL_WINDOWEVENT_RESTORED:
380 begin
383 begin
390 begin
396 SDL_WINDOWEVENT_FOCUS_GAINED:
397 begin
399 //e_WriteLog('window gained focus!', MSG_NOTIFY);
402 SDL_WINDOWEVENT_FOCUS_LOST:
403 begin
406 //e_WriteLog('window lost focus!', MSG_NOTIFY);
411 begin
413 begin
415 e_UnpressAllKeys;
418 begin
419 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
424 begin
431 {$IFDEF ENABLE_HOLMES}
433 {$ENDIF}
435 end
437 begin
439 begin
440 //e_WriteLog('activating window', MSG_NOTIFY);
443 begin
444 //e_WriteLog('activating sounds', MSG_NOTIFY);
449 begin
456 {$IFDEF ENABLE_HOLMES}
458 {$ENDIF}
465 var
472 begin
476 SDL_WINDOWEVENT:
479 SDL_QUITEV:
480 begin
482 begin
484 begin
487 end
488 else
489 begin
497 begin
502 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
504 begin
505 // event eaten, but...
507 exit;
509 {$ENDIF}
511 begin
520 begin
528 SDL_JOYAXISMOTION:
530 begin
534 if ev.jaxis.value < JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] - e_JoystickDeadzones[ev.jaxis.which] then
535 begin
537 begin
544 end
545 else if ev.jaxis.value > JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] + e_JoystickDeadzones[ev.jaxis.which] then
546 begin
548 begin
555 end
556 else
557 begin
559 begin
564 begin
571 SDL_JOYHATMOTION:
573 begin
579 begin
581 begin
587 end
592 SDL_JOYDEVICEADDED:
594 begin
604 SDL_JOYDEVICEREMOVED:
606 begin
611 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
614 {$ENDIF}
616 SDL_TEXTINPUT:
617 begin
627 // other key presses and joysticks are handled in e_input
633 begin
634 {$IF not DEFINED(HEADLESS)}
636 {$ENDIF}
641 begin
647 {$IF not DEFINED(HEADLESS)}
649 {$ENDIF}
653 begin
656 exit;
659 {$IF not DEFINED(HEADLESS)}
662 {$IFDEF ENABLE_HOLMES}
665 {$ENDIF}
667 {$IFDEF USE_NANOGL}
669 begin
672 exit;
674 {$ENDIF}
675 {$IFDEF USE_NOGL}
676 nogl_Init;
677 {$ENDIF}
678 {$IFDEF ENABLE_HOLMES}
680 {$ENDIF}
682 {$ENDIF}
691 {$IFDEF WINDOWS}
692 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
694 var
696 begin
701 {$ELSE}
703 var
706 begin
709 begin
712 end
713 else
714 begin
716 begin
717 // overflow, increment overflow ;-)
726 {$ENDIF}
730 begin
736 var
738 begin
744 var
748 var
752 begin
757 begin
761 //e_PollJoysticks();
764 begin
766 exit;
770 begin
772 begin
774 end
775 else
776 begin
779 begin
786 begin
788 begin
791 end
792 else
793 begin
805 begin
807 end
808 else
809 begin
810 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
818 var
820 begin
824 begin
828 //e_PollJoysticks();
833 var
835 begin
844 begin
854 begin
857 begin
862 end
863 else
864 begin
873 begin
879 begin
881 exit;
884 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
886 begin
889 begin
893 end
894 else
895 begin
904 begin
910 {$IF not DEFINED(HEADLESS)}
911 var
913 {$ENDIF}
914 begin
915 {$IF not DEFINED(HEADLESS)}
918 begin
920 end
921 else
922 begin
923 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
925 {$ENDIF}
930 begin
931 {$IF not DEFINED(HEADLESS)}
932 {$IFDEF USE_GLES1}
936 {$ELSE}
944 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
945 {$ENDIF}
946 {$ENDIF}
951 var
956 begin
963 begin
965 begin
969 begin
971 end
972 else
973 begin
981 begin
985 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
993 var
995 {$IF not DEFINED(HEADLESS)}
997 {$ENDIF}
1000 {$IFDEF ENABLE_HOLMES}
1003 {$ENDIF}
1004 begin
1005 {$IFDEF HEADLESS}
1007 {$ELSE}
1008 {$IFDEF ENABLE_HOLMES}
1010 begin
1014 {$ENDIF}
1015 {$ENDIF}
1019 begin
1023 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
1039 {.$IF DEFINED(D2F_DEBUG)}
1041 {.$ENDIF}
1043 {$IFDEF ENABLE_HOLMES}
1047 begin
1049 begin
1056 begin
1058 begin
1061 {$IFNDEF HEADLESS}
1063 begin
1070 {$ELSE}
1071 // fuck off, fpc!
1074 {$ENDIF}
1078 {$ENDIF}
1081 begin
1083 begin
1090 begin
1103 begin
1106 exit;
1109 {EnumDisplayModes();}
1111 {$IFDEF HEADLESS}
1112 //gwin_k8_enable_light_experiments := false;
1116 {$ELSE}
1123 begin
1126 end
1127 else
1128 begin
1133 {$ENDIF}
1138 // Êîìàíäíàÿ ñòðîêà
1141 // Çàïðîñ ÿçûêà
1146 // main loop