module Graphics.Aosd.CallbackUtil(UserData,Callback,UniversalCallback,mkUniversalCallback,tunnelCallback) where
import Foreign
import Graphics.Aosd.Util
type UserData = Ptr ()
type Callback a = a -> UserData -> IO ()
newtype UniversalCallback a = UniversalCallback (FunPtr (Callback a))
mkUniversalCallback :: forall a.
(Callback a -> IO (FunPtr (Callback a)))
-> IO (UniversalCallback a)
mkUniversalCallback foreignImportWrapper =
UniversalCallback `fmap` foreignImportWrapper universalCallback
universalCallback :: a -> Ptr () -> IO ()
universalCallback a userData = do
handler <- deRefStablePtr (castPtrToStablePtr userData) :: IO (a -> IO ())
handler a
tunnelCallback ::
UniversalCallback a
-> (FunPtr (Callback a) -> UserData -> IO ())
-> (a -> IO ())
-> IO (StablePtr (a -> IO ()))
tunnelCallback (UniversalCallback u) setCallback haskellCallback = do
sp <- newStablePtrDebug "tunnelCallback" "callback" haskellCallback
setCallback u (castStablePtrToPtr sp)
return sp