    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Graphics.UI.SDL.Framerate
    -- Copyright   :  (c) David Himmelstrup 2005
    -- License     :  BSD-like
    --
    -- Maintainer  :  lemmih@gmail.com
    -- Stability   :  provisional
    -- Portability :  portable
    --
    -----------------------------------------------------------------------------
    module Graphics.UI.SDL.Framerate
        ( new
        , init
        , set
        , get
        , delay
        , FPSManager
        ) where

    import Foreign as Foreign hiding (new)
    import Foreign.C

    import Prelude hiding (init)

    data FPSManagerStruct
    type FPSManager = ForeignPtr FPSManagerStruct

    sizeOfManager :: Int
    sizeOfManager = 16

    new :: IO FPSManager
    new  = do manager <- Foreign.mallocBytes sizeOfManager >>= newForeignPtr finalizerFree
              init manager
              return manager

    -- void SDL_initFramerate(FPSmanager * manager);
    foreign import ccall unsafe "SDL_initFramerate" sdlInitFramerate :: Ptr FPSManagerStruct -> IO ()
    init :: FPSManager -> IO ()
    init manager
        = withForeignPtr manager sdlInitFramerate

    -- int SDL_setFramerate(FPSmanager * manager, int rate);
    foreign import ccall unsafe "SDL_setFramerate" sdlSetFramerate :: Ptr FPSManagerStruct -> Int -> IO Int
    set :: FPSManager -> Int -> IO Bool
    set manager hz
        = withForeignPtr manager $ \fpsPtr ->
          do ret <- sdlSetFramerate fpsPtr hz
             case ret of
               (-1) -> return False
               _    -> return True

    -- int SDL_getFramerate(FPSmanager * manager);
    foreign import ccall unsafe "SDL_getFramerate" sdlGetFramerate :: Ptr FPSManagerStruct -> IO Int
    get :: FPSManager -> IO Int
    get manager = withForeignPtr manager sdlGetFramerate

    -- void SDL_framerateDelay(FPSmanager * manager);
    foreign import ccall unsafe "SDL_framerateDelay" sdlFramerateDelay :: Ptr FPSManagerStruct -> IO ()
    delay :: FPSManager -> IO ()
    delay manager = withForeignPtr manager sdlFramerateDelay