-- | Window actions, mostly corresponding to user input. Analogous to those from
-- 'Graphics.UI.GLFW', but in the GPipe 'ContextT' monad.
module Graphics.GPipe.Context.GLFW.Input
(
  -- * Exposed actions
  getCursorPos,
  getMouseButton,
  getKey,
  windowShouldClose,
  -- * Re-exported from GLFW
  MouseButtonState(..), MouseButton(..), KeyState(..), Key(..)
) where

import Graphics.GPipe.Context.GLFW.Unsafe (GLFWWindow(..))

import Control.Monad.IO.Class (MonadIO)
import Graphics.GPipe.Context (ContextT, withContextWindow)
import qualified Graphics.UI.GLFW as GLFW (getCursorPos, getMouseButton, getKey, windowShouldClose)
import Graphics.UI.GLFW (MouseButtonState(..), MouseButton(..), KeyState(..), Key(..))

-- | Gets the current cursor position, in pixels relative to the top-left corner
-- of the window.
getCursorPos :: MonadIO m => ContextT GLFWWindow os f m (Double, Double)
getCursorPos = withContextWindow (GLFW.getCursorPos . getGLFWWindow)

-- | Gets the state of the specified 'MouseButton'.
getMouseButton :: MonadIO m => MouseButton -> ContextT GLFWWindow os f m MouseButtonState
getMouseButton mb = withContextWindow (\(GLFWWindow w) -> GLFW.getMouseButton w mb)

-- | Gets the state of the specified 'Key'.
getKey :: MonadIO m => Key -> ContextT GLFWWindow os f m KeyState
getKey k = withContextWindow (\(GLFWWindow w) -> GLFW.getKey w k)

-- | Returns 'True' if the window should close (e.g. because the user pressed
-- the \'x\' button).
windowShouldClose :: MonadIO m => ContextT GLFWWindow os f m Bool
windowShouldClose = withContextWindow (GLFW.windowShouldClose . getGLFWWindow)