DEADSOFTWARE

fix joystick deadzones
[d2df-sdl.git] / src / game / g_window.pas
index 8336ea9b82cb39b11cd0b5b95c8e992e8cc3b0dd..245efa3a1ee2d425efcd2e100f10db90cab708bd 100644 (file)
@@ -84,7 +84,7 @@ var
   ticksOverflow: Int64 = -1;
   lastTicks: Uint32 = 0; // to detect overflow
 {$ENDIF}
-
+  JoystickHatState: array [0..e_MaxJoyHats, HAT_LEFT..HAT_DOWN] of Boolean;
 
 procedure KillGLWindow (preserveGL: Boolean);
 begin
@@ -314,8 +314,6 @@ begin
     SDL_WINDOWEVENT_MINIMIZED:
     begin
       e_UnpressAllKeys();
-      if (gPlayer1 <> nil) then gPlayer1.releaseAllWeaponSwitchKeys();
-      if (gPlayer2 <> nil) then gPlayer2.releaseAllWeaponSwitchKeys();
       if not wMinimized then
       begin
         e_ResizeWindow(0, 0);
@@ -404,8 +402,6 @@ begin
     begin
       wDeactivate := true;
       e_UnpressAllKeys();
-      if (gPlayer1 <> nil) then gPlayer1.releaseAllWeaponSwitchKeys();
-      if (gPlayer2 <> nil) then gPlayer2.releaseAllWeaponSwitchKeys();
       //e_WriteLog('window lost focus!', MSG_NOTIFY);
     end;
   end;
@@ -468,9 +464,11 @@ end;
 
 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;
 begin
   result := false;
 
@@ -509,10 +507,95 @@ begin
           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 < Joysticks[ev.jaxis.which].AxisZero[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 > Joysticks[ev.jaxis.which].AxisZero[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, 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] := hat
+      end;
+
+(*
+    SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED:
+      begin
+        // TODO update menu here
+      end
+*)
+
     {$IF not DEFINED(HEADLESS) and DEFINED(ENABLE_HOLMES)}
     SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEWHEEL, SDL_MOUSEMOTION:
       fuiOnSDLEvent(ev);
@@ -663,7 +746,7 @@ begin
     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
@@ -730,7 +813,7 @@ begin
     result := EventHandler(ev);
     if (ev.type_ = SDL_QUITEV) then exit;
   end;
-  e_PollJoysticks();
+  //e_PollJoysticks();
 end;