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
73 {$IF DEFINED(LINUX)}
74 unixtype, linux
75 {$ELSEIF DEFINED(WINDOWS)}
76 Windows
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 {$ELSE}
118 {$ENDIF}
124 var
126 begin
127 //if (mFrequency = 0) then initTimerIntr();
128 {$IF DEFINED(LINUX)}
131 {$ELSE}
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
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
231 if (ev.type_ = SDL_KEYDOWN) then kev.kind := THKeyEvent.TKind.Press else kev.kind := THKeyEvent.TKind.Release;
233 //kev.sym := ev.key.keysym.sym;
240 {
241 if (kev.sym = SDLK_RCTRL) then kev.sym := SDLK_LCTRL;
242 if (kev.sym = SDLK_RALT) then kev.sym := SDLK_LALT;
243 if (kev.sym = SDLK_RSHIFT) then kev.sym := SDLK_LSHIFT;
244 if (kev.sym = SDLK_RGUI) then kev.sym := SDLK_LGUI;
245 }
253 SDL_SCANCODE_LCTRL: if (kev.press) then fuiSetModState(fuiModState or THKeyEvent.ModCtrl) else fuiSetModState(fuiModState and (not THKeyEvent.ModCtrl));
254 SDL_SCANCODE_LALT: if (kev.press) then fuiSetModState(fuiModState or THKeyEvent.ModAlt) else fuiSetModState(fuiModState and (not THKeyEvent.ModAlt));
255 SDL_SCANCODE_LSHIFT: if (kev.press) then fuiSetModState(fuiModState or THKeyEvent.ModShift) else fuiSetModState(fuiModState and (not THKeyEvent.ModShift));
259 begin
266 begin
269 if (ev.type_ = SDL_MOUSEBUTTONDOWN) then mev.kind := THMouseEvent.TKind.Press else mev.kind := THMouseEvent.TKind.Release;
280 begin
281 // ev.button.clicks: Byte
282 if (ev.type_ = SDL_MOUSEBUTTONDOWN) then fuiSetButState(fuiButState or mev.but) else fuiSetButState(fuiButState and (not mev.but));
284 begin
290 SDL_MOUSEWHEEL:
291 begin
293 begin
299 if (ev.wheel.y < 0) then mev.but := THMouseEvent.WheelUp else mev.but := THMouseEvent.WheelDown;
305 begin
311 SDL_MOUSEMOTION:
312 begin
326 begin
332 SDL_TEXTINPUT:
334 begin
339 begin
357 begin