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)
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
instance BoxedObject (GClosure a) where
boxedType _ = c_g_closure_get_type
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