{-# LANGUAGE TypeFamilies, DataKinds #-}
module Data.GI.Base.GClosure
( GClosure(..)
, newGClosure
, wrapGClosurePtr
, newGClosureFromPtr
, noGClosure
, unrefGClosure
, disownGClosure
) where
import Foreign.Ptr (Ptr, FunPtr, nullPtr)
import Foreign.C (CInt(..))
import Control.Monad (when)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.GI.Base.BasicTypes
import Data.GI.Base.CallStack (HasCallStack)
import Data.GI.Base.ManagedPtr (newBoxed, newManagedPtr',
disownManagedPtr, withManagedPtr)
import Data.GI.Base.Overloading (ParentTypes, HasParentTypes)
newtype GClosure a = GClosure (ManagedPtr (GClosure a))
noGClosure :: Maybe (GClosure a)
noGClosure = Nothing
foreign import ccall "g_closure_get_type" c_g_closure_get_type ::
IO GType
type instance ParentTypes (GClosure a) = '[]
instance HasParentTypes (GClosure a)
instance TypedObject (GClosure a) where
glibType = c_g_closure_get_type
instance GBoxed (GClosure a)
foreign import ccall "g_cclosure_new" g_cclosure_new
:: FunPtr a -> Ptr () -> FunPtr c -> IO (Ptr (GClosure a))
foreign import ccall "& haskell_gi_release_signal_closure"
ptr_to_release_closure :: FunPtr (Ptr () -> Ptr () -> IO ())
newGClosure :: MonadIO m => FunPtr a -> m (GClosure a)
newGClosure ptr = liftIO $ do
closure <- g_cclosure_new ptr nullPtr ptr_to_release_closure
wrapGClosurePtr closure
foreign import ccall g_closure_ref :: Ptr (GClosure a) -> IO (Ptr (GClosure a))
foreign import ccall g_closure_sink :: Ptr (GClosure a) -> IO ()
foreign import ccall g_closure_unref :: Ptr (GClosure a) -> IO ()
foreign import ccall "&g_closure_unref" ptr_to_g_closure_unref ::
FunPtr (Ptr (GClosure a) -> IO ())
foreign import ccall "haskell_gi_g_closure_is_floating" g_closure_is_floating ::
Ptr (GClosure a) -> IO CInt
wrapGClosurePtr :: Ptr (GClosure a) -> IO (GClosure a)
wrapGClosurePtr closurePtr = do
floating <- g_closure_is_floating closurePtr
when (floating /= 0) $ do
_ <- g_closure_ref closurePtr
g_closure_sink closurePtr
fPtr <- newManagedPtr' ptr_to_g_closure_unref closurePtr
return $! GClosure fPtr
newGClosureFromPtr :: Ptr (GClosure a) -> IO (GClosure a)
newGClosureFromPtr = newBoxed GClosure
unrefGClosure :: (HasCallStack, MonadIO m) => GClosure a -> m ()
unrefGClosure closure = liftIO $ withManagedPtr closure g_closure_unref
disownGClosure :: GClosure a -> IO (Ptr (GClosure a))
disownGClosure = disownManagedPtr