GLHUI-1.0.0: Graphics/UI/GLWindow.hs
{-# LANGUAGE ForeignFunctionInterface #-}
-- |
-- Module : Graphics.UI.GLWindow
-- Copyright : (c) 2011 Hugo Gomes
--
-- License : BSD-style
-- Maintainer : mr.hugo.gomes@gmail.com
-- Stability : experimental
-- Portability : GHC
--
-- A simple OpenGL window creator that runs on X.Org with libX11.
-- This module allows the creation of different versions of OpenGL contexts
-- by initializing with the required versions.
--
-- /Note/: The Haskell only has bindings up to OpenGL 3.2
-- This module is intended to be imported qualified, to avoid clashes with
-- Prelude functions, e.g.
--
-- > import qualified Graphics.UI.GLWindow as Window
--
-- As an example, here is a simple module that uses some of these functions
-- to open a OpenGL 3.2 Context:
--
-- > module Main where
-- >
-- > import Graphics.Rendering.OpenGL
-- > import qualified Graphics.UI.GLWindow as Window
-- >
-- > myLoop = do clear [ColorBuffer]
-- > t <- Window.time
-- > clearColor $= Color4 (sin (realToFrac t) * 0.5 + 0.5)
-- > (sin (realToFrac (t+1)) * 0.5 + 0.5)
-- > (sin (realToFrac (t+2)) * 0.5 +0.5)
-- > 0
-- >
-- > main = do Window.init 3 2 -- initializes a OpenGL 3.2 context
-- > Window.loop myLoop -- stops when the ESC key is pressed
-- > Window.kill -- removes the window when the loop stops
--
module Graphics.UI.GLWindow
(
-- * Types
LoopFunc
-- * Window initialization
, init
, setFullscreen
-- * Window elimination
, kill
-- * Window state query
, frame
, time
, dtime
, width
, height
, scrWidth
, scrHeight
-- * Loop
, loop
) where
import Foreign.C
import Foreign.Ptr
import Control.Applicative
import Prelude hiding (init)
foreign import ccall unsafe "WindowInit"
c_init :: CUInt -> CUInt -> IO (CInt)
init :: Integer -> Integer -> IO (Integer)
init glMajor glMinor = fromIntegral <$> c_init (fromIntegral glMajor) (fromIntegral glMinor)
foreign import ccall unsafe "WindowKill"
kill :: IO ()
foreign import ccall unsafe "WindowSetFullscreen"
c_fullscreen :: CInt -> IO ()
setFullscreen :: Bool -> IO ()
setFullscreen f = if f then c_fullscreen 1
else c_fullscreen 0
foreign import ccall unsafe "WindowFrame"
c_frame :: IO (CUInt)
frame :: IO (Integer)
frame = fromIntegral <$> c_frame
foreign import ccall unsafe "WindowTime"
c_time :: IO (CDouble)
time :: IO (Double)
time = realToFrac <$> c_time
foreign import ccall unsafe "WindowDTime"
c_dtime :: IO (CDouble)
dtime :: IO (Double)
dtime = realToFrac <$> c_dtime
foreign import ccall unsafe "WindowWidth"
c_width :: IO (CUInt)
width :: IO (Integer)
width = fromIntegral <$> c_width
foreign import ccall unsafe "WindowHeight"
c_height :: IO (CUInt)
height :: IO (Integer)
height = fromIntegral <$> c_height
foreign import ccall unsafe "WindowScrWidth"
c_scrWidth :: IO (CUInt)
scrWidth :: IO (Integer)
scrWidth = fromIntegral <$> c_scrWidth
foreign import ccall unsafe "WindowScrHeight"
c_scrHeight :: IO (CUInt)
scrHeight :: IO (Integer)
scrHeight = fromIntegral <$> c_scrHeight
type LoopFunc = IO ()
foreign import ccall "WindowLoop"
c_loop :: FunPtr (LoopFunc) -> IO ()
loop :: LoopFunc -> IO ()
loop lf = mkLoop lf >>= c_loop
foreign import ccall "wrapper"
mkLoop :: LoopFunc -> IO( FunPtr (LoopFunc) )