{-# OPTIONS_HADDOCK hide #-}
{- | 
This FunGEn module controls timing (how time-based functions will behave).
-}
{- 

FunGEN - Functional Game Engine
http://www.cin.ufpe.br/~haskell/fungen
Copyright (C) 2002  Andre Furtado <awbf@cin.ufpe.br>

This code is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

-}

module Graphics.UI.Fungen.Timer (
        RefreshType(..),
        setRefresh
) where

import Graphics.UI.GLUT
import Graphics.UI.GLUT.Input

-- | Used by 'Graphics.UI.Fungen.funInit' to configure the main loop's timing strategy.

data RefreshType
        = Idle
        | Timer Int

-- | Change the current timing strategy.

setRefresh :: RefreshType -> StillDownHandler -> IO ()
setRefresh :: RefreshType -> StillDownHandler -> StillDownHandler
setRefresh RefreshType
Idle StillDownHandler
stillDown = SettableStateVar (Maybe StillDownHandler)
idleCallback SettableStateVar (Maybe StillDownHandler)
-> Maybe StillDownHandler -> StillDownHandler
forall t a (m :: * -> *).
(HasSetter t a, MonadIO m) =>
t -> a -> m ()
$= StillDownHandler -> Maybe StillDownHandler
forall a. a -> Maybe a
Just (StillDownHandler
stillDown StillDownHandler -> StillDownHandler -> StillDownHandler
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Maybe Window -> StillDownHandler
forall (m :: * -> *). MonadIO m => Maybe Window -> m ()
postRedisplay Maybe Window
forall a. Maybe a
Nothing)
setRefresh (Timer Int
t) StillDownHandler
stillDown = Int -> StillDownHandler -> StillDownHandler
addTimerCallback Int
t (StillDownHandler -> Int -> StillDownHandler
timer StillDownHandler
stillDown Int
t)

-- | Generate a GLUT timer callback.

timer :: StillDownHandler -> Int -> TimerCallback
timer :: StillDownHandler -> Int -> StillDownHandler
timer StillDownHandler
stillDown Int
t = do
        StillDownHandler
stillDown
        Maybe Window -> StillDownHandler
forall (m :: * -> *). MonadIO m => Maybe Window -> m ()
postRedisplay Maybe Window
forall a. Maybe a
Nothing
        Int -> StillDownHandler -> StillDownHandler
addTimerCallback Int
t (StillDownHandler -> Int -> StillDownHandler
timer StillDownHandler
stillDown Int
t)