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;
38 // returns `true` if quit event was received
42 var
49 implementation
51 uses
61 const
64 var
69 {$IF not DEFINED(HEADLESS)}
71 {$ENDIF}
76 {$IFNDEF WINDOWS}
79 {$ENDIF}
83 begin
84 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglDeinitCB)) then oglDeinitCB(); end;
93 {$IF not DEFINED(HEADLESS)}
94 var
98 {$ENDIF}
99 begin
100 {$IF not DEFINED(HEADLESS)}
106 if gFullscreen then wFlags := wFlags or SDL_WINDOW_FULLSCREEN else wFlags := wFlags or SDL_WINDOW_RESIZABLE;
110 begin
117 begin
121 end
122 else
123 begin
124 e_WriteLog('SDL: found display mode for '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight)+': '+IntToStr(cmode.w)+'x'+IntToStr(cmode.h), TMsgType.Notify);
130 (*if (preserveGL) and (h_Wnd <> nil) {and (gFullscreen)} then
131 begin
132 e_WriteLog('SDL: going fullscreen...', TMsgType.Notify);
133 //SDL_SetWindowMaximumSize(h_Wnd, gScreenWidth, gScreenHeight);
134 SDL_SetWindowDisplayMode(h_Wnd, @cmode);
135 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
136 if (gFullscreen) then
137 begin
138 SDL_SetWindowFullscreen(h_Wnd, SDL_WINDOW_FULLSCREEN);
139 end
140 else
141 begin
142 SDL_SetWindowFullscreen(h_Wnd, 0);
143 end;
144 end
145 else*)
146 begin
148 h_Wnd := SDL_CreateWindow(PChar(wTitle), gWinRealPosX, gWinRealPosY, gScreenWidth, gScreenHeight, wFlags);
155 begin
160 begin
161 e_WriteLog('SDL: fullscreen window got size '+IntToStr(nw)+'x'+IntToStr(nh)+': '+IntToStr(gScreenWidth)+'x'+IntToStr(gScreenHeight), TMsgType.Notify);
164 end
165 else
166 begin
167 e_WriteLog('SDL: fullscreen window got invalid size: '+IntToStr(nw)+'x'+IntToStr(nh), TMsgType.Notify);
172 if (h_GL <> nil) and (not preserveGL) then begin if (assigned(oglInitCB)) then oglInitCB(); end;
173 {$ENDIF}
180 var
183 begin
190 begin
208 begin
214 begin
215 e_LogWritefln(' ChangeWindowSize: (ws=%dx%d) (ss=%dx%d)', [gWinSizeX, gWinSizeY, gScreenWidth, gScreenHeight]);
218 {$IF not DEFINED(HEADLESS)}
225 {$ENDIF}
230 {$IF not DEFINED(HEADLESS)}
231 var
233 {$ENDIF}
234 begin
236 {$IF not DEFINED(HEADLESS)}
240 begin
248 begin
256 begin
260 {$ENDIF}
265 var
267 begin
273 SDL_WINDOWEVENT_MOVED:
274 begin
276 begin
282 SDL_WINDOWEVENT_MINIMIZED:
283 begin
286 begin
290 begin
298 SDL_WINDOWEVENT_RESIZED:
299 begin
300 e_LogWritefln('Resize: (os=%dx%d) (ns=%dx%d)', [gScreenWidth, gScreenHeight, Integer(ev.data1), Integer(ev.data2)]);
301 {if (gFullscreen) then
302 begin
303 e_LogWriteln(' fullscreen fix applied.');
304 if (gScreenWidth <> ev.data1) or (gScreenHeight <> ev.data2) then
305 begin
306 SDL_SetWindowSize(h_Wnd, gScreenWidth, gScreenHeight);
307 end;
308 end
309 else}
310 begin
317 begin
319 e_WriteLog('[DEBUG] WinMsgs: Resized to ' + IntToStr(ev.data1) + 'x' + IntToStr(ev.data2), TMsgType.Notify);
323 SDL_WINDOWEVENT_EXPOSED:
326 SDL_WINDOWEVENT_MAXIMIZED:
327 begin
329 begin
335 begin
338 begin
345 SDL_WINDOWEVENT_RESTORED:
346 begin
348 begin
355 begin
361 SDL_WINDOWEVENT_FOCUS_GAINED:
362 begin
364 //e_WriteLog('window gained focus!', MSG_NOTIFY);
367 SDL_WINDOWEVENT_FOCUS_LOST:
368 begin
371 //e_WriteLog('window lost focus!', MSG_NOTIFY);
376 begin
378 begin
384 begin
385 //e_WriteLog('deactivating sounds', MSG_NOTIFY);
390 begin
399 end
401 begin
403 begin
404 //e_WriteLog('activating window', MSG_NOTIFY);
408 begin
409 //e_WriteLog('activating sounds', MSG_NOTIFY);
414 begin
427 var
431 begin
435 SDL_WINDOWEVENT:
438 SDL_QUITEV:
439 begin
441 begin
443 begin
446 end
447 else
448 begin
456 begin
459 {$IF not DEFINED(HEADLESS)}
461 begin
462 // event eaten, but...
464 exit;
466 {$ENDIF}
471 {$IF not DEFINED(HEADLESS)}
474 {$ENDIF}
476 SDL_TEXTINPUT:
477 begin
484 // other key presses and joysticks are handled in e_input
490 begin
491 {$IF not DEFINED(HEADLESS)}
493 {$ENDIF}
498 begin
504 {$IF not DEFINED(HEADLESS)}
506 {$ENDIF}
510 begin
513 exit;
516 {$IF not DEFINED(HEADLESS)}
522 {$ENDIF}
531 {$IFDEF WINDOWS}
532 // windoze sux; in headless mode `GetTickCount()` (and SDL) returns shit
534 var
536 begin
541 {$ELSE}
543 var
546 begin
549 begin
552 end
553 else
554 begin
556 begin
557 // overflow, increment overflow ;-)
566 {$ENDIF}
570 begin
576 var
578 begin
584 var
588 var
592 begin
597 begin
604 begin
606 exit;
610 begin
612 begin
614 end
615 else
616 begin
619 begin
626 begin
628 begin
631 end
632 else
633 begin
645 begin
647 end
648 else
649 begin
650 if (NetMode = NET_CLIENT) and (NetState <> NET_STATE_AUTH) then g_Net_Client_UpdateWhileLoading();
658 var
660 begin
664 begin
673 var
675 begin
684 begin
694 begin
697 begin
702 end
703 else
704 begin
713 begin
719 begin
721 exit;
724 // Âðåìÿ ïðåäûäóùåãî îáíîâëåíèÿ
726 begin
729 begin
733 end
734 else
735 begin
744 begin
750 {$IF not DEFINED(HEADLESS)}
751 var
753 {$ENDIF}
754 begin
755 {$IF not DEFINED(HEADLESS)}
764 SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); // lights; it is enough to have 1-bit stencil buffer for lighting, but...
766 {$ENDIF}
771 var
776 begin
783 begin
785 begin
789 begin
791 end
792 else
793 begin
801 begin
805 if found and ((exts[Length(name)] = #0) or (exts[Length(name)] = ' ')) then begin result := true; exit; end;
813 var
815 {$IF not DEFINED(HEADLESS)}
817 {$ENDIF}
822 begin
823 {$IFDEF HEADLESS}
825 {$ELSE}
827 begin
831 {$ENDIF}
835 begin
839 //if arg = '--twinkletwinkle' then gwin_k8_enable_light_experiments := true;
855 {.$IF DEFINED(D2F_DEBUG)}
857 {.$ENDIF}
862 begin
864 begin
871 begin
873 begin
876 {$IFNDEF HEADLESS}
878 begin
885 {$ELSE}
886 // fuck off, fpc!
889 {$ENDIF}
895 begin
897 begin
904 begin
917 begin
919 exit;
922 {EnumDisplayModes();}
924 {$IFDEF HEADLESS}
925 //gwin_k8_enable_light_experiments := false;
929 {$ELSE}
935 begin
938 end
939 else
940 begin
945 {$ENDIF}
950 // Êîìàíäíàÿ ñòðîêà
953 // Çàïðîñ ÿçûêà
958 // main loop