df44683f8276c42d790daa11396ed1d141f32a33
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}
93 begin
94 {$IFDEF ENABLE_HOLMES}
95 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
96 {$ENDIF}
99 begin
101 {$IFDEF USE_NANOGL}
102 nanoGL_Destroy;
103 {$ENDIF}
105 {$IFDEF USE_NOGL}
106 nogl_Quit;
107 {$ENDIF}
117 {$IF not DEFINED(HEADLESS)}
118 var
122 {$ENDIF}
123 begin
124 {$IF not DEFINED(HEADLESS)}
130 if gFullscreen then wFlags := wFlags {or SDL_WINDOW_FULLSCREEN} else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
131 if (not gFullscreen) and (not preserveGL) and gWinMaximized then wFlags := wFlags or SDL_WINDOW_MAXIMIZED else gWinMaximized := false;
134 begin
141 begin
145 end
146 else
147 begin
148 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
155 begin
156 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
157 //SDL_SetWindowDisplayMode(h_Wnd, @cmode);
162 //SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
163 //SDL_SetWindowFullscreen(h_Wnd, 0);
164 end
165 else
166 begin
168 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
179 begin
184 begin
185 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
188 end
189 else
190 begin
191 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
195 {$IFDEF ENABLE_HOLMES}
198 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
199 {$ENDIF}
200 {$ENDIF}
207 var
210 begin
217 begin
235 begin
241 begin
242 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
245 {$IF not DEFINED(HEADLESS)}
246 {$IFDEF ENABLE_HOLMES}
249 {$ENDIF}
252 {$IF DEFINED(ANDROID)}
253 (* This will fix menu reset on keyboard showing *)
255 g_Menu_Reset;
256 {$ELSE}
257 g_Menu_Reset;
258 {$ENDIF}
260 {$ENDIF}
265 {$IF not DEFINED(HEADLESS)}
266 var
268 {$ENDIF}
269 begin
271 {$IF not DEFINED(HEADLESS)}
275 begin
283 begin
291 begin
295 {$ENDIF}
300 var
302 begin
308 SDL_WINDOWEVENT_MOVED:
309 begin
311 begin
317 SDL_WINDOWEVENT_MINIMIZED:
318 begin
321 begin
325 begin
333 SDL_WINDOWEVENT_RESIZED:
334 begin
335 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
336 {if (gFullscreen) then
337 begin
338 e_LogWriteln(' fullscreen fix applied.');
339 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
340 begin
341 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
342 end;
343 end
344 else}
345 begin
352 begin
354 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
358 SDL_WINDOWEVENT_EXPOSED:
361 SDL_WINDOWEVENT_MAXIMIZED:
362 begin
365 begin
371 begin
374 begin
381 SDL_WINDOWEVENT_RESTORED:
382 begin
385 begin
392 begin
398 SDL_WINDOWEVENT_FOCUS_GAINED:
399 begin
401 //e_WriteLog('window gained focus!', MSG_NOTIFY);
404 SDL_WINDOWEVENT_FOCUS_LOST:
405 begin
408 //e_WriteLog('window lost focus!', MSG_NOTIFY);
413 begin
415 begin
417 e_UnpressAllKeys;
420 begin
421 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
426 begin
433 {$IFDEF ENABLE_HOLMES}
435 {$ENDIF}
437 end
439 begin
441 begin
442 //e_WriteLog('activating window', MSG_NOTIFY);
445 begin
446 //e_WriteLog('activating sounds', MSG_NOTIFY);
451 begin
458 {$IFDEF ENABLE_HOLMES}
460 {$ENDIF}
467 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
522 begin
526 e_LogWritefln('Input Debug: jbutton, joy=%s, button=%s, keycode=%s, press=%s', [ev.jbutton.which, ev.jbutton.button, key, down]);
529 end
530 else
531 begin
533 begin
535 e_LogWritefln('Input Debug: NOT IN RANGE! jbutton, joy=%s, button=%s, press=%s', [ev.jbutton.which, ev.jbutton.button, down])
536 end
539 SDL_JOYAXISMOTION:
541 begin
546 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]]);
548 if ev.jaxis.value < JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] - e_JoystickDeadzones[ev.jaxis.which] then
549 begin
551 begin
557 end
558 else if ev.jaxis.value > JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] + e_JoystickDeadzones[ev.jaxis.which] then
559 begin
561 begin
567 end
568 else
569 begin
571 begin
576 begin
581 end
582 else
583 begin
585 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]])
588 SDL_JOYHATMOTION:
590 begin
592 e_LogWritefln('Input Debug: jhat, joy=%s, hat=%s, value=%s', [ev.jhat.which, ev.jhat.hat, ev.jhat.value]);
598 begin
600 begin
605 end
608 end
609 else
610 begin
612 e_LogWritefln('Input Debug: NOT IN RANGE! jhat, joy=%s, hat=%s, value=%s', [ev.jhat.which, ev.jhat.hat, ev.jhat.value])
615 SDL_JOYDEVICEADDED:
617 begin
620 begin
624 JoystickZeroAxes[ev.jdevice.which, i] := SDL_JoystickGetAxis(JoystickHandle[ev.jdevice.which], i)
625 end
626 else
628 end
629 else
630 begin
631 e_LogWritefln('Warning! Added Joystick %s, but we support only <= %s', [ev.jdevice.which, e_MaxJoys])
634 SDL_JOYDEVICEREMOVED:
635 begin
638 begin
643 end
646 {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
649 {$ENDIF}
651 SDL_TEXTINPUT:
652 begin
664 // other key presses and joysticks are handled in e_input
670 begin
671 {$IF not DEFINED(HEADLESS)}
673 {$ENDIF}
678 begin
684 {$IF not DEFINED(HEADLESS)}
686 {$ENDIF}
690 begin
693 exit;
696 {$IF not DEFINED(HEADLESS)}
699 {$IFDEF ENABLE_HOLMES}
702 {$ENDIF}
704 {$IFDEF USE_NANOGL}
706 begin
709 exit;
711 {$ENDIF}
712 {$IFDEF USE_NOGL}
713 nogl_Init;
714 {$ENDIF}
715 {$IFDEF ENABLE_HOLMES}
717 {$ENDIF}
719 {$ENDIF}
728 {$IFDEF WINDOWS}
729 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
731 var
733 begin
738 {$ELSE}
740 var
743 begin
746 begin
749 end
750 else
751 begin
753 begin
754 // overflow, increment overflow ;-)
763 {$ENDIF}
767 begin
773 var
775 begin
781 var
785 var
789 begin
794 begin
798 //e_PollJoysticks();
801 begin
803 exit;
807 begin
809 begin
811 end
812 else
813 begin
816 begin
823 begin
825 begin
828 end
829 else
830 begin
842 begin
844 end
845 else
846 begin
847 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
855 var
857 begin
861 begin
865 //e_PollJoysticks();
870 var
872 begin
881 begin
891 begin
894 begin
899 end
900 else
901 begin
910 begin
916 begin
918 exit;
921 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
923 begin
926 begin
930 end
931 else
932 begin
941 begin
947 {$IF not DEFINED(HEADLESS)}
948 var
950 {$ENDIF}
951 begin
952 {$IF not DEFINED(HEADLESS)}
955 begin
957 end
958 else
959 begin
960 if vsync then e_WriteLog('VSync: ON', TMsgType.Notify) else e_WriteLog('VSync: OFF', TMsgType.Notify);
962 {$ENDIF}
967 begin
968 {$IF not DEFINED(HEADLESS)}
969 {$IFDEF USE_GLES1}
973 {$ELSE}
981 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
982 {$ENDIF}
983 {$ENDIF}
988 var
993 begin
1000 begin
1002 begin
1006 begin
1008 end
1009 else
1010 begin
1018 begin
1022 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
1030 var
1032 {$IF not DEFINED(HEADLESS)}
1034 {$ENDIF}
1037 {$IFDEF ENABLE_HOLMES}
1040 {$ENDIF}
1041 begin
1042 {$IFDEF HEADLESS}
1044 {$ELSE}
1045 {$IFDEF ENABLE_HOLMES}
1047 begin
1051 {$ENDIF}
1052 {$ENDIF}
1056 begin
1060 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
1078 {.$IF DEFINED(D2F_DEBUG)}
1080 {.$ENDIF}
1082 {$IFDEF ENABLE_HOLMES}
1086 begin
1088 begin
1095 begin
1097 begin
1100 {$IFNDEF HEADLESS}
1102 begin
1109 {$ELSE}
1110 // fuck off, fpc!
1113 {$ENDIF}
1117 {$ENDIF}
1120 begin
1122 begin
1129 begin
1142 begin
1145 exit;
1148 {EnumDisplayModes();}
1150 {$IFDEF HEADLESS}
1151 //gwin_k8_enable_light_experiments := false;
1155 {$ELSE}
1162 begin
1165 end
1166 else
1167 begin
1172 {$ENDIF}
1177 // Êîìàíäíàÿ ñòðîêà
1180 // Çàïðîñ ÿçûêà
1185 // main loop
1195 initialization