{-# LANGUAGE RankNTypes #-}
module Graphics.Gloss.Internals.Interface.Event
( Event (..)
, keyMouseEvent
, motionEvent )
where
import Data.IORef
import Graphics.Gloss.Internals.Interface.Backend
data Event
= EventKey Key KeyState Modifiers (Float, Float)
| EventMotion (Float, Float)
| EventResize (Int, Int)
deriving (Eq, Show)
keyMouseEvent ::
forall a . Backend a
=> IORef a
-> Key
-> KeyState
-> Modifiers
-> (Int, Int)
-> IO Event
keyMouseEvent backendRef key keyState modifiers pos
= EventKey key keyState modifiers <$> convertPoint backendRef pos
motionEvent ::
forall a . Backend a
=> IORef a
-> (Int, Int)
-> IO Event
motionEvent backendRef pos
= EventMotion <$> convertPoint backendRef pos
convertPoint ::
forall a . Backend a
=> IORef a
-> (Int, Int)
-> IO (Float,Float)
convertPoint backendRef pos
= do (sizeX_, sizeY_) <- getWindowDimensions backendRef
let (sizeX, sizeY) = (fromIntegral sizeX_, fromIntegral sizeY_)
let (px_, py_) = pos
let px = fromIntegral px_
let py = sizeY - fromIntegral py_
let px' = px - sizeX / 2
let py' = py - sizeY / 2
let pos' = (px', py')
return pos'