diff --git a/src/game/g_window.pas b/src/game/g_window.pas
index 3958d24d12df79b518b6dc351942a53d487acc52..44997de63c8046824eb8b1c762ad9fb636fe57f1 100644 (file)
--- a/src/game/g_window.pas
+++ b/src/game/g_window.pas
{$IFDEF ENABLE_HOLMES}
g_holmes, sdlcarcass, fui_ctls,
{$ENDIF}
- SysUtils, Classes, MAPDEF,
+ SysUtils, Classes, MAPDEF, Math,
SDL2, e_graphics, e_log, e_texture, g_main,
g_console, e_input, g_options, g_game,
g_basic, g_textures, e_sound, g_sound, g_menu, ENet, g_net,
ticksOverflow: Int64 = -1;
lastTicks: Uint32 = 0; // to detect overflow
{$ENDIF}
-
+ JoystickHatState: array [0..e_MaxJoys, 0..e_MaxJoyHats, HAT_LEFT..HAT_DOWN] of Boolean;
+ JoystickZeroAxes: array [0..e_MaxJoys, 0..e_MaxJoyAxes] of Integer;
procedure KillGLWindow (preserveGL: Boolean);
begin
if gWinActive then
begin
e_WriteLog('deactivating window', TMsgType.Notify);
- e_EnableInput := false;
- e_ClearInputBuffer();
+ e_UnpressAllKeys;
if gMuteWhenInactive then
begin
if not gWinActive then
begin
//e_WriteLog('activating window', MSG_NOTIFY);
- e_EnableInput := true;
if gMuteWhenInactive then
begin
function EventHandler (var ev: TSDL_Event): Boolean;
var
- key, keychr: Word;
+ key, keychr, minuskey: Word;
uc: UnicodeChar;
down: Boolean;
+ i: Integer;
+ hat: array [HAT_LEFT..HAT_DOWN] of Boolean;
+ joy: PSDL_Joystick;
begin
result := false;
exit;
end;
{$ENDIF}
- e_KeyUpDown(key, down);
+ if ev.key._repeat = 0 then
+ begin
+ e_KeyUpDown(key, down);
+ g_Console_ProcessBind(key, down)
+ end;
if down then KeyPress(key);
end;
+ SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP:
+ if (ev.jbutton.which < e_MaxJoys) and (ev.jbutton.button < e_MaxJoyBtns) then
+ begin
+ key := e_JoyButtonToKey(ev.jbutton.which, ev.jbutton.button);
+ down := ev.type_ = SDL_JOYBUTTONDOWN;
+ e_KeyUpDown(key, down);
+ g_Console_ProcessBind(key, down);
+ if down then KeyPress(key)
+ end;
+
+ SDL_JOYAXISMOTION:
+ if (ev.jaxis.which < e_MaxJoys) and (ev.jaxis.axis < e_MaxJoyAxes) then
+ begin
+ key := e_JoyAxisToKey(ev.jaxis.which, ev.jaxis.axis, AX_PLUS);
+ minuskey := e_JoyAxisToKey(ev.jaxis.which, ev.jaxis.axis, AX_MINUS);
+
+ if ev.jaxis.value < JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] - e_JoystickDeadzones[ev.jaxis.which] then
+ begin
+ if (e_KeyPressed(key)) then
+ begin
+ e_KeyUpDown(key, False);
+ g_Console_ProcessBind(key, False);
+ end;
+ e_KeyUpDown(minuskey, True);
+ g_Console_ProcessBind(minuskey, True);
+ KeyPress(minuskey);
+ end
+ else if ev.jaxis.value > JoystickZeroAxes[ev.jaxis.which, ev.jaxis.axis] + e_JoystickDeadzones[ev.jaxis.which] then
+ begin
+ if (e_KeyPressed(minuskey)) then
+ begin
+ e_KeyUpDown(minuskey, False);
+ g_Console_ProcessBind(minuskey, False);
+ end;
+ e_KeyUpDown(key, True);
+ g_Console_ProcessBind(key, True);
+ KeyPress(key);
+ end
+ else
+ begin
+ if (e_KeyPressed(minuskey)) then
+ begin
+ e_KeyUpDown(minuskey, False);
+ g_Console_ProcessBind(minuskey, False);
+ end;
+ if (e_KeyPressed(key)) then
+ begin
+ e_KeyUpDown(key, False);
+ g_Console_ProcessBind(key, False);
+ end;
+ end;
+ end;
+
+ SDL_JOYHATMOTION:
+ if (ev.jhat.which < e_MaxJoys) and (ev.jhat.hat < e_MaxJoyHats) then
+ begin
+ hat[HAT_UP] := LongBool(ev.jhat.value and SDL_HAT_UP);
+ hat[HAT_DOWN] := LongBool(ev.jhat.value and SDL_HAT_DOWN);
+ hat[HAT_LEFT] := LongBool(ev.jhat.value and SDL_HAT_LEFT);
+ hat[HAT_RIGHT] := LongBool(ev.jhat.value and SDL_HAT_RIGHT);
+ for i := HAT_LEFT to HAT_DOWN do
+ begin
+ if JoystickHatState[ev.jhat.which, ev.jhat.hat, i] <> hat[i] then
+ begin
+ down := hat[i];
+ key := e_JoyHatToKey(ev.jhat.which, ev.jhat.hat, i);
+ e_KeyUpDown(key, down);
+ g_Console_ProcessBind(key, down);
+ if down then KeyPress(key)
+ end
+ end;
+ JoystickHatState[ev.jhat.which, ev.jhat.hat] := hat
+ end;
+
+ SDL_JOYDEVICEADDED:
+ if (ev.jdevice.which < e_MaxJoys) then
+ begin
+ joy := SDL_JoystickOpen(ev.jdevice.which);
+ ASSERT(joy <> nil);
+ e_LogWritefln('Added Joystick %s', [ev.jdevice.which]);
+ e_JoystickAvailable[ev.jdevice.which] := True;
+ for i := 0 to Min(SDL_JoystickNumAxes(joy), e_MaxJoyAxes) do
+ JoystickZeroAxes[ev.jdevice.which, i] := SDL_JoystickGetAxis(joy, i);
+ SDL_JoystickClose(joy)
+ end;
+
+ SDL_JOYDEVICEREMOVED:
+ if (ev.jdevice.which < e_MaxJoys) then
+ begin
+ e_JoystickAvailable[ev.jdevice.which] := False;
+ e_LogWritefln('Removed Joystick %s', [ev.jdevice.which])
+ end;
+
{$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEWHEEL, SDL_MOUSEMOTION:
fuiOnSDLEvent(ev);
EventHandler(ev);
if (ev.type_ = SDL_QUITEV) then break;
end;
- e_PollJoysticks();
+ //e_PollJoysticks();
if (ev.type_ = SDL_QUITEV) or (gExit = EXIT_QUIT) then
begin
result := EventHandler(ev);
if (ev.type_ = SDL_QUITEV) then exit;
end;
- e_PollJoysticks();
+ //e_PollJoysticks();
end;