edbf2d17d7ec45124c680d5a844e6e498ced0730
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 {$IF DEFINED(LINUX) OR DEFINED(ANDROID)}
72 unixtype, linux
73 {$ELSEIF DEFINED(WINDOWS)}
74 Windows
75 {$ELSEIF DEFINED(HAIKU) OR DEFINED(UNIX)}
76 unixtype
77 {$ELSE}
78 {$WARNING You suck!}
79 {$ENDIF}
80 ;
83 // ////////////////////////////////////////////////////////////////////////// //
84 var
88 procedure setFUIFPS (v: Integer); inline; begin if (v < 1) then v := 1 else if (v > 60*4) then v := 60*4; gEffFPS := v; end;
91 // ////////////////////////////////////////////////////////////////////////// //
92 {$IF DEFINED(LINUX)}
94 {$ELSE}
96 {$ENDIF}
98 var
103 var
105 begin
107 begin
108 {$IF DEFINED(LINUX)}
109 if (clock_getres(CLOCK_MONOTONIC, @r) <> 0) then raise Exception.Create('profiler error: cannot get timer resolution');
114 {$ELSEIF DEFINED(WINDOWS)}
118 {$ENDIF}
124 var
126 begin
127 //if (mFrequency = 0) then initTimerIntr();
128 {$IF DEFINED(LINUX)}
131 {$ELSEIF DEFINED(WINDOWS)}
134 {$ENDIF}
139 begin
144 // ////////////////////////////////////////////////////////////////////////// //
145 var
150 // ////////////////////////////////////////////////////////////////////////// //
151 const
153 $0402,$0403,$201A,$0453,$201E,$2026,$2020,$2021,$20AC,$2030,$0409,$2039,$040A,$040C,$040B,$040F,
154 $0452,$2018,$2019,$201C,$201D,$2022,$2013,$2014,$003F,$2122,$0459,$203A,$045A,$045C,$045B,$045F,
155 $00A0,$040E,$045E,$0408,$00A4,$0490,$00A6,$00A7,$0401,$00A9,$0404,$00AB,$00AC,$00AD,$00AE,$0407,
156 $00B0,$00B1,$0406,$0456,$0491,$00B5,$00B6,$00B7,$0451,$2116,$0454,$00BB,$0458,$0405,$0455,$0457,
157 $0410,$0411,$0412,$0413,$0414,$0415,$0416,$0417,$0418,$0419,$041A,$041B,$041C,$041D,$041E,$041F,
158 $0420,$0421,$0422,$0423,$0424,$0425,$0426,$0427,$0428,$0429,$042A,$042B,$042C,$042D,$042E,$042F,
159 $0430,$0431,$0432,$0433,$0434,$0435,$0436,$0437,$0438,$0439,$043A,$043B,$043C,$043D,$043E,$043F,
161 );
165 var
167 begin
176 begin
182 // ////////////////////////////////////////////////////////////////////////// //
184 var
190 begin
200 begin
202 SDL_WINDOWEVENT_MINIMIZED: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
204 begin
206 begin
213 SDL_WINDOWEVENT_FOCUS_GAINED: if not fuiWinActive then begin fuiWinActive := true; if assigned(winFocusCB) then winFocusCB(); end;
214 SDL_WINDOWEVENT_FOCUS_LOST: if fuiWinActive then begin fuiResetKMState(true); fuiWinActive := false; if assigned(winBlurCB) then winBlurCB(); end;
218 begin
226 begin
227 // fix left/right modifiers
229 begin
231 end
232 else
233 begin
249 SDL_SCANCODE_LCTRL: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModCtrl) else fuiSetModState(fuiModState and (not TFUIEvent.ModCtrl));
250 SDL_SCANCODE_LALT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModAlt) else fuiSetModState(fuiModState and (not TFUIEvent.ModAlt));
251 SDL_SCANCODE_LSHIFT: if (fev.press) then fuiSetModState(fuiModState or TFUIEvent.ModShift) else fuiSetModState(fuiModState and (not TFUIEvent.ModShift));
255 begin
262 begin
264 begin
266 end
267 else
268 begin
281 begin
282 // ev.button.clicks: Byte
283 if (ev.type_ = SDL_MOUSEBUTTONDOWN) then fuiSetButState(fuiButState or fev.but) else fuiSetButState(fuiButState and (not fev.but));
285 begin
291 SDL_MOUSEWHEEL:
292 begin
294 begin
304 begin
310 SDL_MOUSEMOTION:
311 begin
323 begin
329 SDL_TEXTINPUT:
331 begin
336 begin
351 begin