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

    module Graphics.Gloss.Internals.Interface.ViewState.Motion
            (callback_viewState_motion)
    where
    import Graphics.Gloss.Data.ViewState
    import Graphics.Gloss.Internals.Interface.Callback
    import Graphics.Gloss.Internals.Interface.Backend
    import Graphics.Gloss.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