packages feed

brillo-1.13.3: Brillo/Internals/Interface/Event.hs

{-# LANGUAGE RankNTypes #-}

module Brillo.Internals.Interface.Event (
  Event (..),
  keyMouseEvent,
  motionEvent,
)
where

import Brillo.Internals.Interface.Backend
import Data.IORef


-- | 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'