packages feed

brillo-1.13.3: Brillo/Internals/Interface/ViewState/Motion.hs

{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_HADDOCK hide #-}

module Brillo.Internals.Interface.ViewState.Motion (callback_viewState_motion)
where

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


{-| Callback to handle keyboard and mouse button events
     for controlling the viewport.
-}
callback_viewState_motion
  :: IORef ViewState
  -> Callback
callback_viewState_motion portRef =
  Motion (viewState_motion portRef)


viewState_motion :: IORef ViewState -> MotionCallback
viewState_motion viewStateRef stateRef pos =
  do
    viewState <- readIORef viewStateRef
    ev <- motionEvent stateRef pos
    case updateViewStateWithEventMaybe ev viewState of
      Nothing -> return ()
      Just viewState' ->
        do
          viewStateRef `writeIORef` viewState'
          postRedisplay stateRef