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
25 // ////////////////////////////////////////////////////////////////////////// //
26 // call this with SDL2 event; returns `true` if event was eaten
30 // ////////////////////////////////////////////////////////////////////////// //
31 // event handlers
32 var
33 winFocusCB: procedure () = nil; // this will be called when window got focus; `fuiWinActive` already set
34 winBlurCB: procedure () = nil; // this will be called when window lost focus; `fuiWinActive` already set
35 // for standalone
38 exposeFrameCB: procedure () = nil; // call `glSwap()` here instead; automatically set by standalone
39 //
47 var
48 // default size
55 // ////////////////////////////////////////////////////////////////////////// //
60 // ////////////////////////////////////////////////////////////////////////// //
61 // only for standalone mode
68 implementation
70 uses
72 {$IFDEF USE_NANOGL}
73 nanoGL,
74 {$ELSE}
76 {$ENDIF}
77 {$IF DEFINED(LINUX) OR DEFINED(ANDROID)}
78 unixtype, linux
79 {$ELSEIF DEFINED(WINDOWS)}
80 Windows
81 {$ELSEIF DEFINED(HAIKU)}
82 unixtype
83 {$ELSE}
84 {$WARNING You suck!}
85 {$ENDIF}
86 ;
89 // ////////////////////////////////////////////////////////////////////////// //
90 var
94 procedure setFUIFPS (v: Integer); inline; begin if (v < 1) then v := 1 else if (v > 60*4) then v := 60*4; gEffFPS := v; end;
97 // ////////////////////////////////////////////////////////////////////////// //
98 {$IF DEFINED(LINUX)}
100 {$ELSE}
102 {$ENDIF}
104 var
109 var
111 begin
113 begin
114 {$IF DEFINED(LINUX)}
115 if (clock_getres(CLOCK_MONOTONIC, @r) <> 0) then raise Exception.Create('profiler error: cannot get timer resolution');
120 {$ELSEIF DEFINED(WINDOWS)}
124 {$ENDIF}
130 var
132 begin
133 //if (mFrequency = 0) then initTimerIntr();
134 {$IF DEFINED(LINUX)}
137 {$ELSEIF DEFINED(WINDOWS)}
140 {$ENDIF}
145 begin
150 // ////////////////////////////////////////////////////////////////////////// //
151 var
156 // ////////////////////////////////////////////////////////////////////////// //
157 const
159 $0402,$0403,$201A,$0453,$201E,$2026,$2020,$2021,$20AC,$2030,$0409,$2039,$040A,$040C,$040B,$040F,
160 $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$003F,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
161 $00A0,$040E,$045E,$0408,$00A4,$0490,$00A6,$00A7,$0401,$00A9,$0404,$00AB,$00AC,$00AD,$00AE,$0407,
162 $00B0,$00B1,$0406,$0456,$0491,$00B5,$00B6,$00B7,$0451,$2116,$0454,$00BB,$0458,$0405,$0455,$0457,
163 $0410,$0411,$0412,$0413,$0414,$0415,$0416,$0417,$0418,$0419,$041A,$041B,$041C,$041D,$041E,$041F,
164 $0420,$0421,$0422,$0423,$0424,$0425,$0426,$0427,$0428,$0429,$042A,$042B,$042C,$042D,$042E,$042F,
165 $0430,$0431,$0432,$0433,$0434,$0435,$0436,$0437,$0438,$0439,$043A,$043B,$043C,$043D,$043E,$043F,
167 );
171 var
173 begin
182 begin
188 // ////////////////////////////////////////////////////////////////////////// //
190 var
196 begin
206 begin
208 SDL_WINDOWEVENT_MINIMIZED: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
210 begin
212 begin
219 SDL_WINDOWEVENT_FOCUS_GAINED: if not fuiWinActive then begin fuiWinActive := true; if assigned(winFocusCB) then winFocusCB(); end;
220 SDL_WINDOWEVENT_FOCUS_LOST: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
224 begin
232 begin
233 // fix left/right modifiers
235 begin
237 end
238 else
239 begin
255 SDL_SCANCODE_LCTRL: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModCtrl) else fuiSetModState(fuiModState and (not TFUIEvent.ModCtrl));
256 SDL_SCANCODE_LALT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModAlt) else fuiSetModState(fuiModState and (not TFUIEvent.ModAlt));
257 SDL_SCANCODE_LSHIFT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModShift) else fuiSetModState(fuiModState and (not TFUIEvent.ModShift));
261 begin
268 begin
270 begin
272 end
273 else
274 begin
287 begin
288 // ev.button.clicks: Byte
289 if (ev.type_ = SDL_MOUSEBUTTONDOWN) then fuiSetButState(fuiButState or fev.but) else fuiSetButState(fuiButState and (not fev.but));
291 begin
297 SDL_MOUSEWHEEL:
298 begin
300 begin
310 begin
316 SDL_MOUSEMOTION:
317 begin
329 begin
335 SDL_TEXTINPUT:
337 begin
342 begin
357 begin