{-# LANGUAGE RankNTypes #-}
module Graphics.Gloss.Internals.Interface.Event
        ( Event (..)
	, keyMouseEvent
	, motionEvent )
where
import Data.IORef
import Data.Functor ((<$>))
import Graphics.Gloss.Internals.Interface.Backend

-- | Possible input events.
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'