module Graphics.UI.GLUT.Callbacks.Global (
MenuUsage(..), MenuStatusCallback, menuStatusCallback,
IdleCallback, idleCallback,
Timeout, TimerCallback, addTimerCallback
) where
import Control.Monad.Fix ( mfix )
import Data.StateVar ( SettableStateVar, makeSettableStateVar )
import Foreign.C.Types ( CInt )
import Graphics.Rendering.OpenGL ( Position(..) )
import Graphics.UI.GLUT.Callbacks.Registration
import Graphics.UI.GLUT.Raw
data
= NotInUse
| InUse
deriving ( MenuUsage -> MenuUsage -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MenuUsage -> MenuUsage -> Bool
$c/= :: MenuUsage -> MenuUsage -> Bool
== :: MenuUsage -> MenuUsage -> Bool
$c== :: MenuUsage -> MenuUsage -> Bool
Eq, Eq MenuUsage
MenuUsage -> MenuUsage -> Bool
MenuUsage -> MenuUsage -> Ordering
MenuUsage -> MenuUsage -> MenuUsage
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: MenuUsage -> MenuUsage -> MenuUsage
$cmin :: MenuUsage -> MenuUsage -> MenuUsage
max :: MenuUsage -> MenuUsage -> MenuUsage
$cmax :: MenuUsage -> MenuUsage -> MenuUsage
>= :: MenuUsage -> MenuUsage -> Bool
$c>= :: MenuUsage -> MenuUsage -> Bool
> :: MenuUsage -> MenuUsage -> Bool
$c> :: MenuUsage -> MenuUsage -> Bool
<= :: MenuUsage -> MenuUsage -> Bool
$c<= :: MenuUsage -> MenuUsage -> Bool
< :: MenuUsage -> MenuUsage -> Bool
$c< :: MenuUsage -> MenuUsage -> Bool
compare :: MenuUsage -> MenuUsage -> Ordering
$ccompare :: MenuUsage -> MenuUsage -> Ordering
Ord, Timeout -> MenuUsage -> ShowS
[MenuUsage] -> ShowS
MenuUsage -> String
forall a.
(Timeout -> a -> ShowS)
-> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MenuUsage] -> ShowS
$cshowList :: [MenuUsage] -> ShowS
show :: MenuUsage -> String
$cshow :: MenuUsage -> String
showsPrec :: Timeout -> MenuUsage -> ShowS
$cshowsPrec :: Timeout -> MenuUsage -> ShowS
Show )
unmarshalMenuUsage :: CInt -> MenuUsage
CInt
x
| CInt
x forall a. Eq a => a -> a -> Bool
== CInt
glut_MENU_NOT_IN_USE = MenuUsage
NotInUse
| CInt
x forall a. Eq a => a -> a -> Bool
== CInt
glut_MENU_IN_USE = MenuUsage
InUse
| Bool
otherwise = forall a. HasCallStack => String -> a
error (String
"unmarshalMenuUsage: illegal value " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show CInt
x)
type = MenuUsage -> Position -> IO ()
menuStatusCallback :: SettableStateVar (Maybe MenuStatusCallback)
=
forall a. (a -> IO ()) -> SettableStateVar a
makeSettableStateVar forall a b. (a -> b) -> a -> b
$
forall a b.
CallbackType
-> (FunPtr a -> IO ()) -> (b -> IO (FunPtr a)) -> Maybe b -> IO ()
setCallback CallbackType
MenuStatusCB forall (m :: * -> *). MonadIO m => FunPtr MenuStatusFunc -> m ()
glutMenuStatusFunc
(MenuStatusFunc -> IO (FunPtr MenuStatusFunc)
makeMenuStatusFunc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {a} {a} {t}.
(Integral a, Integral a) =>
(MenuUsage -> Position -> t) -> CInt -> a -> a -> t
unmarshal)
where unmarshal :: (MenuUsage -> Position -> t) -> CInt -> a -> a -> t
unmarshal MenuUsage -> Position -> t
cb CInt
s a
x a
y =
MenuUsage -> Position -> t
cb (CInt -> MenuUsage
unmarshalMenuUsage CInt
s)
(GLint -> GLint -> Position
Position (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
x) (forall a b. (Integral a, Num b) => a -> b
fromIntegral a
y))
type IdleCallback = IO ()
idleCallback :: SettableStateVar (Maybe IdleCallback)
idleCallback :: SettableStateVar (Maybe (IO ()))
idleCallback =
forall a. (a -> IO ()) -> SettableStateVar a
makeSettableStateVar forall a b. (a -> b) -> a -> b
$ forall a b.
CallbackType
-> (FunPtr a -> IO ()) -> (b -> IO (FunPtr a)) -> Maybe b -> IO ()
setCallback CallbackType
IdleCB forall (m :: * -> *). MonadIO m => FunPtr (IO ()) -> m ()
glutIdleFunc IO () -> IO (FunPtr (IO ()))
makeIdleFunc
type Timeout = Int
type TimerCallback = IO ()
addTimerCallback :: Timeout -> TimerCallback -> IO ()
addTimerCallback :: Timeout -> IO () -> IO ()
addTimerCallback Timeout
msecs IO ()
timerCallback = do
FunPtr TimerFunc
funPtr <- forall (m :: * -> *) a. MonadFix m => (a -> m a) -> m a
mfix (\FunPtr TimerFunc
self -> TimerFunc -> IO (FunPtr TimerFunc)
makeTimerFunc (\CInt
_ -> do forall a. FunPtr a -> IO ()
registerForCleanup FunPtr TimerFunc
self
IO ()
timerCallback))
forall (m :: * -> *).
MonadIO m =>
CUInt -> FunPtr TimerFunc -> CInt -> m ()
glutTimerFunc (forall a b. (Integral a, Num b) => a -> b
fromIntegral Timeout
msecs) FunPtr TimerFunc
funPtr CInt
0