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
51 implementation
53 uses
55 {$INCLUDE ../nogl/noGLuses.inc}
56 {$IFDEF ENABLE_HOLMES}
58 {$ENDIF}
64 g_touch;
67 const
70 var
75 {$IF not DEFINED(HEADLESS)}
78 {$ENDIF}
84 {$IFNDEF WINDOWS}
87 {$ENDIF}
92 begin
93 {$IFDEF ENABLE_HOLMES}
94 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
95 {$ENDIF}
98 begin
100 {$IFDEF USE_NANOGL}
101 nanoGL_Destroy;
102 {$ENDIF}
104 {$IFDEF USE_NOGL}
105 nogl_Quit;
106 {$ENDIF}
116 {$IF not DEFINED(HEADLESS)}
117 var
121 {$ENDIF}
122 begin
123 {$IF not DEFINED(HEADLESS)}
129 if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
130 if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
133 begin
140 begin
144 end
145 else
146 begin
147 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
154 begin
155 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
156 //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
161 //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
162 //SDL_SetWindowFullscreen(h_Wnd, 0);
163 end
164 else
165 begin
167 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
178 begin
183 begin
184 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
187 end
188 else
189 begin
190 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
194 {$IFDEF ENABLE_HOLMES}
197 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
198 {$ENDIF}
199 {$ENDIF}
206 var
209 begin
216 begin
234 begin
240 begin
241 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
244 {$IF not DEFINED(HEADLESS)}
245 {$IFDEF ENABLE_HOLMES}
248 {$ENDIF}
251 {$IF DEFINED(ANDROID)}
252 (* This will fix menu reset on keyboard showing *)
254 g_Menu_Reset;
255 {$ELSE}
256 g_Menu_Reset;
257 {$ENDIF}
259 {$ENDIF}
264 {$IF not DEFINED(HEADLESS)}
265 var
267 {$ENDIF}
268 begin
270 {$IF not DEFINED(HEADLESS)}
274 begin
282 begin
290 begin
294 {$ENDIF}
299 var
301 begin
307 SDL_WINDOWEVENT_MOVED:
308 begin
310 begin
316 SDL_WINDOWEVENT_MINIMIZED:
317 begin
320 begin
324 begin
332 SDL_WINDOWEVENT_RESIZED:
333 begin
334 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
335 {if (gFullscreen) then
336 begin
337 e_LogWriteln(' fullscreen fix applied.');
338 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
339 begin
340 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
341 end;
342 end
343 else}
344 begin
351 begin
353 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
357 SDL_WINDOWEVENT_EXPOSED:
360 SDL_WINDOWEVENT_MAXIMIZED:
361 begin
364 begin
370 begin
373 begin
380 SDL_WINDOWEVENT_RESTORED:
381 begin
384 begin
391 begin
397 SDL_WINDOWEVENT_FOCUS_GAINED:
398 begin
400 //e_WriteLog('window gained focus!', MSG_NOTIFY);
403 SDL_WINDOWEVENT_FOCUS_LOST:
404 begin
407 //e_WriteLog('window lost focus!', MSG_NOTIFY);
412 begin
414 begin
416 e_UnpressAllKeys;
419 begin
420 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
425 begin
432 {$IFDEF ENABLE_HOLMES}
434 {$ENDIF}
436 end
438 begin
440 begin
441 //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
473 begin
477 SDL_WINDOWEVENT:
480 SDL_QUITEV:
481 begin
483 begin
485 begin
488 end
489 else
490 begin
498 begin
503 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
505 begin
506 // event eaten, but...
508 exit;
510 {$ENDIF}
512 begin
523 begin
527 e_LogWritefln('Input Debug: jbutton, joy=%s, button=%s, keycode=%s, press=%s', [ev.jbutton.which, ev.jbutton.button, key, down]);
531 end
532 else
533 begin
535 begin
537 e_LogWritefln('Input Debug: NOT IN RANGE! jbutton, joy=%s, button=%s, press=%s', [ev.jbutton.which, ev.jbutton.button, down])
538 end
541 SDL_JOYAXISMOTION:
543 begin
548 e_LogWritefln('Input Debug: jaxis, joy=%s, axis=%s, value=%s, zeroaxes=%s, deadzone=%s', [ev.jaxis.which, ev.jaxis.axis, ev.jaxis.value, JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis], e_JoystickDeadzones[ev.jaxis.which]]);
550 if ev.jaxis.value < JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] - e_JoystickDeadzones[ev.jaxis.which] then
551 begin
553 begin
560 end
561 else if ev.jaxis.value > JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] + e_JoystickDeadzones[ev.jaxis.which] then
562 begin
564 begin
571 end
572 else
573 begin
575 begin
580 begin
585 end
586 else
587 begin
589 e_LogWritefln('Input Debug: NOT IN RANGE! jaxis, joy=%s, axis=%s, value=%s, zeroaxes=%s, deadzone=%s', [ev.jaxis.which, ev.jaxis.axis, ev.jaxis.value, JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis], e_JoystickDeadzones[ev.jaxis.which]])
592 SDL_JOYHATMOTION:
594 begin
596 e_LogWritefln('Input Debug: jhat, joy=%s, hat=%s, value=%s', [ev.jhat.which, ev.jhat.hat, ev.jhat.value]);
602 begin
604 begin
610 end
613 end
614 else
615 begin
617 e_LogWritefln('Input Debug: NOT IN RANGE! jhat, joy=%s, hat=%s, value=%s', [ev.jhat.which, ev.jhat.hat, ev.jhat.value])
620 SDL_JOYDEVICEADDED:
622 begin
630 end
631 else
632 begin
633 e_LogWritefln('Warning! Added Joystick %s, but we support only <= %s', [ev.jdevice.which, e_MaxJoys])
636 SDL_JOYDEVICEREMOVED:
637 begin
643 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
646 {$ENDIF}
648 SDL_TEXTINPUT:
649 begin
661 // other key presses and joysticks are handled in e_input
667 begin
668 {$IF not DEFINED(HEADLESS)}
670 {$ENDIF}
675 begin
681 {$IF not DEFINED(HEADLESS)}
683 {$ENDIF}
687 begin
690 exit;
693 {$IF not DEFINED(HEADLESS)}
696 {$IFDEF ENABLE_HOLMES}
699 {$ENDIF}
701 {$IFDEF USE_NANOGL}
703 begin
706 exit;
708 {$ENDIF}
709 {$IFDEF USE_NOGL}
710 nogl_Init;
711 {$ENDIF}
712 {$IFDEF ENABLE_HOLMES}
714 {$ENDIF}
716 {$ENDIF}
725 {$IFDEF WINDOWS}
726 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
728 var
730 begin
735 {$ELSE}
737 var
740 begin
743 begin
746 end
747 else
748 begin
750 begin
751 // overflow, increment overflow ;-)
760 {$ENDIF}
764 begin
770 var
772 begin
778 var
782 var
786 begin
791 begin
795 //e_PollJoysticks();
798 begin
800 exit;
804 begin
806 begin
808 end
809 else
810 begin
813 begin
820 begin
822 begin
825 end
826 else
827 begin
839 begin
841 end
842 else
843 begin
844 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
852 var
854 begin
858 begin
862 //e_PollJoysticks();
867 var
869 begin
878 begin
888 begin
891 begin
896 end
897 else
898 begin
907 begin
913 begin
915 exit;
918 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
920 begin
923 begin
927 end
928 else
929 begin
938 begin
944 {$IF not DEFINED(HEADLESS)}
945 var
947 {$ENDIF}
948 begin
949 {$IF not DEFINED(HEADLESS)}
952 begin
954 end
955 else
956 begin
957 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
959 {$ENDIF}
964 begin
965 {$IF not DEFINED(HEADLESS)}
966 {$IFDEF USE_GLES1}
970 {$ELSE}
978 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
979 {$ENDIF}
980 {$ENDIF}
985 var
990 begin
997 begin
999 begin
1003 begin
1005 end
1006 else
1007 begin
1015 begin
1019 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
1027 var
1029 {$IF not DEFINED(HEADLESS)}
1031 {$ENDIF}
1034 {$IFDEF ENABLE_HOLMES}
1037 {$ENDIF}
1038 begin
1039 {$IFDEF HEADLESS}
1041 {$ELSE}
1042 {$IFDEF ENABLE_HOLMES}
1044 begin
1048 {$ENDIF}
1049 {$ENDIF}
1053 begin
1057 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
1075 {.$IF DEFINED(D2F_DEBUG)}
1077 {.$ENDIF}
1079 {$IFDEF ENABLE_HOLMES}
1083 begin
1085 begin
1092 begin
1094 begin
1097 {$IFNDEF HEADLESS}
1099 begin
1106 {$ELSE}
1107 // fuck off, fpc!
1110 {$ENDIF}
1114 {$ENDIF}
1117 begin
1119 begin
1126 begin
1139 begin
1142 exit;
1145 {EnumDisplayModes();}
1147 {$IFDEF HEADLESS}
1148 //gwin_k8_enable_light_experiments := false;
1152 {$ELSE}
1159 begin
1162 end
1163 else
1164 begin
1169 {$ENDIF}
1174 // Êîìàíäíàÿ ñòðîêà
1177 // Çàïðîñ ÿçûêà
1182 // main loop
1192 initialization