aboutsummaryrefslogtreecommitdiff
path: root/src/Game/Controller.hs
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-04-15 22:59:15 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-04-15 22:59:15 +0100
commit7b3aa61462dc5a1135e01beedcbc98efe47ffb13 (patch)
tree7969d4f80f2640f9b51690eb853993131ad48454 /src/Game/Controller.hs
parent631c611d929ea8fb633fdaa285485b6dbd5db702 (diff)
downloadspace-plat-hs-7b3aa61462dc5a1135e01beedcbc98efe47ffb13.tar.gz
space-plat-hs-7b3aa61462dc5a1135e01beedcbc98efe47ffb13.zip
"Toaster" notifications
To provide feedback to the user when a controller is plugged/unplugged.
Diffstat (limited to 'src/Game/Controller.hs')
-rw-r--r--src/Game/Controller.hs41
1 files changed, 22 insertions, 19 deletions
diff --git a/src/Game/Controller.hs b/src/Game/Controller.hs
index d47963e..4d0ba81 100644
--- a/src/Game/Controller.hs
+++ b/src/Game/Controller.hs
@@ -4,6 +4,7 @@ import Control.Monad
import Data.Int (Int32)
import Data.Maybe (fromMaybe, isNothing)
import Foreign.C (peekCAString)
+import qualified Game.Toaster as T
import qualified SDL
import qualified SDL.Input.GameController as SDL
import qualified SDL.Raw
@@ -22,28 +23,27 @@ data Controls = Controls
}
deriving (Show)
-processControllerEvents :: Controls -> [SDL.EventPayload] -> IO Controls
-processControllerEvents controls (SDL.ControllerDeviceEvent (SDL.ControllerDeviceEventData SDL.ControllerDeviceAdded joyIndex) : t) = do
+processControllerEvents :: Controls -> T.Toaster -> [SDL.EventPayload] -> IO (Controls, T.Toaster)
+processControllerEvents controls toaster (SDL.ControllerDeviceEvent (SDL.ControllerDeviceEventData SDL.ControllerDeviceAdded joyIndex) : t) = do
if isNothing controls.joyId
then do
joyName <- peekCAString =<< SDL.Raw.gameControllerNameForIndex (fromIntegral joyIndex)
- putStrLn $ "Connected gamepad: " ++ show joyName
+ let toaster' = T.add toaster $ "Connected " ++ show joyName
gc <- SDL.Raw.gameControllerOpen (fromIntegral joyIndex)
joy <- SDL.Raw.gameControllerGetJoystick gc
joyId <- SDL.Raw.joystickInstanceID joy
- processControllerEvents controls {joyId = Just joyId, gc = Just gc} t
- else processControllerEvents controls t
-processControllerEvents controls (SDL.ControllerDeviceEvent (SDL.ControllerDeviceEventData SDL.ControllerDeviceRemoved joyId) : t) = do
- c <-
+ processControllerEvents controls {joyId = Just joyId, gc = Just gc} toaster' t
+ else processControllerEvents controls toaster t
+processControllerEvents controls toaster (SDL.ControllerDeviceEvent (SDL.ControllerDeviceEventData SDL.ControllerDeviceRemoved joyId) : t) = do
+ (c, toaster') <-
if Just joyId == controls.joyId
then do
forM_ (controls.gc) SDL.Raw.gameControllerClose
- putStrLn "Disconnected gamepad"
- pure controls {joyId = Nothing, gc = Nothing}
- else pure controls
- processControllerEvents c t
-processControllerEvents controls (_ : t) = processControllerEvents controls t
-processControllerEvents controls [] = pure controls
+ pure (controls {joyId = Nothing, gc = Nothing}, T.add toaster "Gamepad disconnected")
+ else pure (controls, toaster)
+ processControllerEvents c toaster' t
+processControllerEvents controls toaster (_ : t) = processControllerEvents controls toaster t
+processControllerEvents controls toaster [] = pure (controls, toaster)
init :: Controls
init = Controls False False False False False False False Nothing Nothing
@@ -78,12 +78,15 @@ updateKeyboard controls events =
menu = fromMaybe False $ isPressed SDL.KeycodeReturn events
}
-update :: Controls -> [SDL.EventPayload] -> IO Controls
-update controls events = do
- updated <- processControllerEvents controls events
- pure $ case updated.joyId of
- Just _ -> updateGamepad updated events
- _ -> updateKeyboard updated events
+update :: Controls -> T.Toaster -> [SDL.EventPayload] -> IO (Controls, T.Toaster)
+update controls toaster events = do
+ (updated, toaster') <- processControllerEvents controls toaster events
+ pure
+ ( case updated.joyId of
+ Just _ -> updateGamepad updated events
+ _ -> updateKeyboard updated events,
+ toaster'
+ )
isPressed :: SDL.Keycode -> [SDL.EventPayload] -> Maybe Bool
isPressed code events