File: UserEvents.hs

package info (click to toggle)
haskell-sdl2 2.5.5.0-2
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 17,348 kB
  • sloc: haskell: 10,160; ansic: 102; makefile: 5
file content (65 lines) | stat: -rw-r--r-- 2,273 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
module UserEvents where

import Control.Concurrent (myThreadId)
import Control.Monad (void)
import Data.Maybe (Maybe(Nothing))
import Data.Word (Word32)
import qualified Data.Text as Text
import Foreign.Ptr (nullPtr)
import SDL

-- | A timer event with timestamp
data TimerEvent = TimerEvent Word32

timerEvent :: IO TimerEvent
timerEvent = do
  t <- show <$> ticks
  tid <- show <$> myThreadId
  putStrLn $ "Created timer event at " ++ t ++ " ticks. Threadid: " ++ tid
  return $ TimerEvent 0

main :: IO ()
main = do
  initializeAll
  let toTimerEvent _ = return . Just . TimerEvent
      fromTimerEvent = const $ return emptyRegisteredEvent
  registeredEvent <- registerEvent toTimerEvent fromTimerEvent
  case registeredEvent of
    Nothing -> putStrLn "Fatal error: unable to register timer events."
    Just registeredTimerEvent -> do
      void . addTimer 1000 $ mkTimerCb registeredTimerEvent
      putStrLn "press q at any time to quit"
      appLoop registeredTimerEvent

mkTimerCb :: RegisteredEventType TimerEvent -> TimerCallback
mkTimerCb (RegisteredEventType pushTimerEvent _) interval = do
  pushResult <- pushTimerEvent =<< timerEvent
  case pushResult of
    EventPushSuccess -> return ()
    EventPushFiltered -> putStrLn "event push was filtered: this is impossible"
    EventPushFailure e -> putStrLn $ "Couldn't push event: " ++ Text.unpack e
  return $ Reschedule interval

appLoop :: RegisteredEventType TimerEvent -> IO ()
appLoop (RegisteredEventType _pushTimerEvent getTimerEvent) = waitEvent >>= go
  where
  go :: Event -> IO ()
  go ev =
    case eventPayload ev of
      -- Press Q to quit
      KeyboardEvent keyboardEvent
        |  keyboardEventKeyMotion keyboardEvent == Pressed &&
           keysymKeycode (keyboardEventKeysym keyboardEvent) == KeycodeQ
        -> return ()
      UserEvent _ -> do
        maybeTimerEvent <- getTimerEvent ev
        case maybeTimerEvent of
          Just (TimerEvent ts) -> do
             t <- show <$> ticks
             tid <- show <$> myThreadId
             putStrLn $ "Got timer event from queue at " ++ t ++ " ticks."
             putStrLn $ "Timestamp: " ++ show ts
             putStrLn $ "Threadid: " ++ tid
          Nothing -> return ()
        waitEvent >>= go
      _ -> waitEvent >>= go