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, version 3 of the License ONLY.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License
13 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 *)
15 {$INCLUDE ../shared/a_modes.inc}
18 interface
20 uses
24 // ////////////////////////////////////////////////////////////////////////// //
25 // call this with SDL2 event; returns `true` if event was eaten
29 // ////////////////////////////////////////////////////////////////////////// //
30 // event handlers
31 var
32 winFocusCB: procedure () = nil; // this will be called when window got focus; `fuiWinActive` already set
33 winBlurCB: procedure () = nil; // this will be called when window lost focus; `fuiWinActive` already set
34 // for standalone
37 exposeFrameCB: procedure () = nil; // call `glSwap()` here instead; automatically set by standalone
38 //
46 var
47 // default size
54 // ////////////////////////////////////////////////////////////////////////// //
59 // ////////////////////////////////////////////////////////////////////////// //
60 // only for standalone mode
67 implementation
69 uses
71 {$INCLUDE ../nogl/noGLuses.inc}
72 {$IF DEFINED(LINUX) OR DEFINED(ANDROID)}
73 unixtype, linux
74 {$ELSEIF DEFINED(WINDOWS)}
75 Windows
76 {$ELSEIF DEFINED(HAIKU)}
77 unixtype
78 {$ELSE}
79 {$WARNING You suck!}
80 {$ENDIF}
81 ;
84 // ////////////////////////////////////////////////////////////////////////// //
85 var
89 procedure setFUIFPS (v: Integer); inline; begin if (v < 1) then v := 1 else if (v > 60*4) then v := 60*4; gEffFPS := v; end;
92 // ////////////////////////////////////////////////////////////////////////// //
93 {$IF DEFINED(LINUX)}
95 {$ELSE}
97 {$ENDIF}
99 var
104 var
106 begin
108 begin
109 {$IF DEFINED(LINUX)}
110 if (clock_getres(CLOCK_MONOTONIC, @r) <> 0) then raise Exception.Create('profiler error: cannot get timer resolution');
115 {$ELSEIF DEFINED(WINDOWS)}
119 {$ENDIF}
125 var
127 begin
128 //if (mFrequency = 0) then initTimerIntr();
129 {$IF DEFINED(LINUX)}
132 {$ELSEIF DEFINED(WINDOWS)}
135 {$ENDIF}
140 begin
145 // ////////////////////////////////////////////////////////////////////////// //
146 var
151 // ////////////////////////////////////////////////////////////////////////// //
152 const
154 $0402,$0403,$201A,$0453,$201E,$2026,$2020,$2021,$20AC,$2030,$0409,$2039,$040A,$040C,$040B,$040F,
155 $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$003F,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
156 $00A0,$040E,$045E,$0408,$00A4,$0490,$00A6,$00A7,$0401,$00A9,$0404,$00AB,$00AC,$00AD,$00AE,$0407,
157 $00B0,$00B1,$0406,$0456,$0491,$00B5,$00B6,$00B7,$0451,$2116,$0454,$00BB,$0458,$0405,$0455,$0457,
158 $0410,$0411,$0412,$0413,$0414,$0415,$0416,$0417,$0418,$0419,$041A,$041B,$041C,$041D,$041E,$041F,
159 $0420,$0421,$0422,$0423,$0424,$0425,$0426,$0427,$0428,$0429,$042A,$042B,$042C,$042D,$042E,$042F,
160 $0430,$0431,$0432,$0433,$0434,$0435,$0436,$0437,$0438,$0439,$043A,$043B,$043C,$043D,$043E,$043F,
162 );
166 var
168 begin
177 begin
183 // ////////////////////////////////////////////////////////////////////////// //
185 var
191 begin
201 begin
203 SDL_WINDOWEVENT_MINIMIZED: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
205 begin
207 begin
214 SDL_WINDOWEVENT_FOCUS_GAINED: if not fuiWinActive then begin fuiWinActive := true; if assigned(winFocusCB) then winFocusCB(); end;
215 SDL_WINDOWEVENT_FOCUS_LOST: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
219 begin
227 begin
228 // fix left/right modifiers
230 begin
232 end
233 else
234 begin
250 SDL_SCANCODE_LCTRL: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModCtrl) else fuiSetModState(fuiModState and (not TFUIEvent.ModCtrl));
251 SDL_SCANCODE_LALT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModAlt) else fuiSetModState(fuiModState and (not TFUIEvent.ModAlt));
252 SDL_SCANCODE_LSHIFT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModShift) else fuiSetModState(fuiModState and (not TFUIEvent.ModShift));
256 begin
263 begin
265 begin
267 end
268 else
269 begin
282 begin
283 // ev.button.clicks: Byte
284 if (ev.type_ = SDL_MOUSEBUTTONDOWN) then fuiSetButState(fuiButState or fev.but) else fuiSetButState(fuiButState and (not fev.but));
286 begin
292 SDL_MOUSEWHEEL:
293 begin
295 begin
305 begin
311 SDL_MOUSEMOTION:
312 begin
324 begin
330 SDL_TEXTINPUT:
332 begin
337 begin
352 begin