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}
249 {$IF DEFINED(ANDROID)}
250 (* This will fix menu reset on keyboard showing *)
252 g_Menu_Reset;
253 {$ELSE}
254 g_Menu_Reset;
255 {$ENDIF}
257 {$ENDIF}
262 {$IF not DEFINED(HEADLESS)}
263 var
265 {$ENDIF}
266 begin
268 {$IF not DEFINED(HEADLESS)}
272 begin
280 begin
288 begin
292 {$ENDIF}
297 var
299 begin
305 SDL_WINDOWEVENT_MOVED:
306 begin
308 begin
314 SDL_WINDOWEVENT_MINIMIZED:
315 begin
318 begin
322 begin
330 SDL_WINDOWEVENT_RESIZED:
331 begin
332 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
333 {if (gFullscreen) then
334 begin
335 e_LogWriteln(' fullscreen fix applied.');
336 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
337 begin
338 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
339 end;
340 end
341 else}
342 begin
349 begin
351 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
355 SDL_WINDOWEVENT_EXPOSED:
358 SDL_WINDOWEVENT_MAXIMIZED:
359 begin
362 begin
368 begin
371 begin
378 SDL_WINDOWEVENT_RESTORED:
379 begin
382 begin
389 begin
395 SDL_WINDOWEVENT_FOCUS_GAINED:
396 begin
398 //e_WriteLog('window gained focus!', MSG_NOTIFY);
401 SDL_WINDOWEVENT_FOCUS_LOST:
402 begin
405 //e_WriteLog('window lost focus!', MSG_NOTIFY);
410 begin
412 begin
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);
444 begin
445 //e_WriteLog('activating sounds', MSG_NOTIFY);
450 begin
457 {$IFDEF ENABLE_HOLMES}
459 {$ENDIF}
466 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
532 if ev.jaxis.value < Joysticks[ev.jaxis.which].AxisZero[ev.jaxis.axis] - e_JoystickDeadzones[ev.jaxis.which] then
534 else
541 SDL_JOYHATMOTION:
543 begin
549 begin
551 begin
557 end
562 (*
563 SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED:
564 begin
565 // TODO update menu here
566 end
567 *)
569 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
572 {$ENDIF}
574 SDL_TEXTINPUT:
575 begin
585 // other key presses and joysticks are handled in e_input
591 begin
592 {$IF not DEFINED(HEADLESS)}
594 {$ENDIF}
599 begin
605 {$IF not DEFINED(HEADLESS)}
607 {$ENDIF}
611 begin
614 exit;
617 {$IF not DEFINED(HEADLESS)}
620 {$IFDEF ENABLE_HOLMES}
623 {$ENDIF}
625 {$IFDEF USE_NANOGL}
627 begin
630 exit;
632 {$ENDIF}
633 {$IFDEF USE_NOGL}
634 nogl_Init;
635 {$ENDIF}
636 {$IFDEF ENABLE_HOLMES}
638 {$ENDIF}
640 {$ENDIF}
649 {$IFDEF WINDOWS}
650 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
652 var
654 begin
659 {$ELSE}
661 var
664 begin
667 begin
670 end
671 else
672 begin
674 begin
675 // overflow, increment overflow ;-)
684 {$ENDIF}
688 begin
694 var
696 begin
702 var
706 var
710 begin
715 begin
719 //e_PollJoysticks();
722 begin
724 exit;
728 begin
730 begin
732 end
733 else
734 begin
737 begin
744 begin
746 begin
749 end
750 else
751 begin
763 begin
765 end
766 else
767 begin
768 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
776 var
778 begin
782 begin
786 //e_PollJoysticks();
791 var
793 begin
802 begin
812 begin
815 begin
820 end
821 else
822 begin
831 begin
837 begin
839 exit;
842 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
844 begin
847 begin
851 end
852 else
853 begin
862 begin
868 {$IF not DEFINED(HEADLESS)}
869 var
871 {$ENDIF}
872 begin
873 {$IF not DEFINED(HEADLESS)}
876 begin
878 end
879 else
880 begin
881 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
883 {$ENDIF}
888 begin
889 {$IF not DEFINED(HEADLESS)}
890 {$IFDEF USE_GLES1}
894 {$ELSE}
902 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
903 {$ENDIF}
904 {$ENDIF}
909 var
914 begin
921 begin
923 begin
927 begin
929 end
930 else
931 begin
939 begin
943 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
951 var
953 {$IF not DEFINED(HEADLESS)}
955 {$ENDIF}
958 {$IFDEF ENABLE_HOLMES}
961 {$ENDIF}
962 begin
963 {$IFDEF HEADLESS}
965 {$ELSE}
966 {$IFDEF ENABLE_HOLMES}
968 begin
972 {$ENDIF}
973 {$ENDIF}
977 begin
981 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
997 {.$IF DEFINED(D2F_DEBUG)}
999 {.$ENDIF}
1001 {$IFDEF ENABLE_HOLMES}
1005 begin
1007 begin
1014 begin
1016 begin
1019 {$IFNDEF HEADLESS}
1021 begin
1028 {$ELSE}
1029 // fuck off, fpc!
1032 {$ENDIF}
1036 {$ENDIF}
1039 begin
1041 begin
1048 begin
1061 begin
1064 exit;
1067 {EnumDisplayModes();}
1069 {$IFDEF HEADLESS}
1070 //gwin_k8_enable_light_experiments := false;
1074 {$ELSE}
1081 begin
1084 end
1085 else
1086 begin
1091 {$ENDIF}
1096 // Êîìàíäíàÿ ñòðîêà
1099 // Çàïðîñ ÿçûêà
1104 // main loop