{-# LANGUAGE TypeApplications #-}


-- | Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
-- License    : LGPL-2.1
-- Maintainer : Iñaki García Etxebarria
-- 
-- The @GskRenderNode@ structure contains only private data.

#if (MIN_VERSION_haskell_gi_overloading(1,0,0) && !defined(__HADDOCK_VERSION__))
#define ENABLE_OVERLOADING
#endif

module GI.Gsk.Structs.RenderNode
    ( 

-- * Exported types
    RenderNode(..)                          ,
    noRenderNode                            ,


 -- * Methods
-- ** Overloaded methods #method:Overloaded methods#

#if defined(ENABLE_OVERLOADING)
    ResolveRenderNodeMethod                 ,
#endif


-- ** draw #method:draw#

#if defined(ENABLE_OVERLOADING)
    RenderNodeDrawMethodInfo                ,
#endif
    renderNodeDraw                          ,


-- ** getBounds #method:getBounds#

#if defined(ENABLE_OVERLOADING)
    RenderNodeGetBoundsMethodInfo           ,
#endif
    renderNodeGetBounds                     ,


-- ** getNodeType #method:getNodeType#

#if defined(ENABLE_OVERLOADING)
    RenderNodeGetNodeTypeMethodInfo         ,
#endif
    renderNodeGetNodeType                   ,


-- ** ref #method:ref#

#if defined(ENABLE_OVERLOADING)
    RenderNodeRefMethodInfo                 ,
#endif
    renderNodeRef                           ,


-- ** serialize #method:serialize#

#if defined(ENABLE_OVERLOADING)
    RenderNodeSerializeMethodInfo           ,
#endif
    renderNodeSerialize                     ,


-- ** unref #method:unref#

#if defined(ENABLE_OVERLOADING)
    RenderNodeUnrefMethodInfo               ,
#endif
    renderNodeUnref                         ,


-- ** writeToFile #method:writeToFile#

#if defined(ENABLE_OVERLOADING)
    RenderNodeWriteToFileMethodInfo         ,
#endif
    renderNodeWriteToFile                   ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.GI.Base.Signals as B.Signals
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import qualified GI.Cairo.Structs.Context as Cairo.Context
import qualified GI.GLib.Structs.Bytes as GLib.Bytes
import qualified GI.Graphene.Structs.Rect as Graphene.Rect
import {-# SOURCE #-} qualified GI.Gsk.Enums as Gsk.Enums

-- | Memory-managed wrapper type.
newtype RenderNode = RenderNode (ManagedPtr RenderNode)
    deriving (RenderNode -> RenderNode -> Bool
(RenderNode -> RenderNode -> Bool)
-> (RenderNode -> RenderNode -> Bool) -> Eq RenderNode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RenderNode -> RenderNode -> Bool
$c/= :: RenderNode -> RenderNode -> Bool
== :: RenderNode -> RenderNode -> Bool
$c== :: RenderNode -> RenderNode -> Bool
Eq)
foreign import ccall "gsk_render_node_get_type" c_gsk_render_node_get_type :: 
    IO GType

instance BoxedObject RenderNode where
    boxedType :: RenderNode -> IO GType
boxedType _ = IO GType
c_gsk_render_node_get_type

-- | Convert 'RenderNode' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'.
instance B.GValue.IsGValue RenderNode where
    toGValue :: RenderNode -> IO GValue
toGValue o :: RenderNode
o = do
        GType
gtype <- IO GType
c_gsk_render_node_get_type
        RenderNode -> (Ptr RenderNode -> IO GValue) -> IO GValue
forall a c.
(HasCallStack, ManagedPtrNewtype a) =>
a -> (Ptr a -> IO c) -> IO c
B.ManagedPtr.withManagedPtr RenderNode
o (GType
-> (GValue -> Ptr RenderNode -> IO ())
-> Ptr RenderNode
-> IO GValue
forall a. GType -> (GValue -> a -> IO ()) -> a -> IO GValue
B.GValue.buildGValue GType
gtype GValue -> Ptr RenderNode -> IO ()
forall a. GValue -> Ptr a -> IO ()
B.GValue.set_boxed)
        
    fromGValue :: GValue -> IO RenderNode
fromGValue gv :: GValue
gv = do
        Ptr RenderNode
ptr <- GValue -> IO (Ptr RenderNode)
forall b. GValue -> IO (Ptr b)
B.GValue.get_boxed GValue
gv :: IO (Ptr RenderNode)
        (ManagedPtr RenderNode -> RenderNode)
-> Ptr RenderNode -> IO RenderNode
forall a.
(HasCallStack, BoxedObject a) =>
(ManagedPtr a -> a) -> Ptr a -> IO a
B.ManagedPtr.newBoxed ManagedPtr RenderNode -> RenderNode
RenderNode Ptr RenderNode
ptr
        
    

-- | A convenience alias for `Nothing` :: `Maybe` `RenderNode`.
noRenderNode :: Maybe RenderNode
noRenderNode :: Maybe RenderNode
noRenderNode = Maybe RenderNode
forall a. Maybe a
Nothing


#if defined(ENABLE_OVERLOADING)
instance O.HasAttributeList RenderNode
type instance O.AttributeList RenderNode = RenderNodeAttributeList
type RenderNodeAttributeList = ('[ ] :: [(Symbol, *)])
#endif

-- method RenderNode::draw
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       , Arg
--           { argCName = "cr"
--           , argType =
--               TInterface Name { namespace = "cairo" , name = "Context" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "cairo context to draw to"
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_draw" gsk_render_node_draw :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    Ptr Cairo.Context.Context ->            -- cr : TInterface (Name {namespace = "cairo", name = "Context"})
    IO ()

-- | Draw the contents of /@node@/ to the given cairo context.
-- 
-- Typically, you\'ll use this function to implement fallback rendering
-- of @/GskRenderNodes/@ on an intermediate Cairo context, instead of using
-- the drawing context associated to a t'GI.Gdk.Objects.Surface.Surface'\'s rendering buffer.
-- 
-- For advanced nodes that cannot be supported using Cairo, in particular
-- for nodes doing 3D operations, this function may fail.
renderNodeDraw ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> Cairo.Context.Context
    -- ^ /@cr@/: cairo context to draw to
    -> m ()
renderNodeDraw :: RenderNode -> Context -> m ()
renderNodeDraw node :: RenderNode
node cr :: Context
cr = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    Ptr Context
cr' <- Context -> IO (Ptr Context)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr Context
cr
    Ptr RenderNode -> Ptr Context -> IO ()
gsk_render_node_draw Ptr RenderNode
node' Ptr Context
cr'
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    Context -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr Context
cr
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if defined(ENABLE_OVERLOADING)
data RenderNodeDrawMethodInfo
instance (signature ~ (Cairo.Context.Context -> m ()), MonadIO m) => O.MethodInfo RenderNodeDrawMethodInfo RenderNode signature where
    overloadedMethod = renderNodeDraw

#endif

-- method RenderNode::get_bounds
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       , Arg
--           { argCName = "bounds"
--           , argType =
--               TInterface Name { namespace = "Graphene" , name = "Rect" }
--           , direction = DirectionOut
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "return location for the boundaries"
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = True
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_get_bounds" gsk_render_node_get_bounds :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    Ptr Graphene.Rect.Rect ->               -- bounds : TInterface (Name {namespace = "Graphene", name = "Rect"})
    IO ()

-- | Retrieves the boundaries of the /@node@/. The node will not draw outside
-- of its boundaries.
renderNodeGetBounds ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> m (Graphene.Rect.Rect)
renderNodeGetBounds :: RenderNode -> m Rect
renderNodeGetBounds node :: RenderNode
node = IO Rect -> m Rect
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Rect -> m Rect) -> IO Rect -> m Rect
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    Ptr Rect
bounds <- Int -> IO (Ptr Rect)
forall a. BoxedObject a => Int -> IO (Ptr a)
callocBoxedBytes 16 :: IO (Ptr Graphene.Rect.Rect)
    Ptr RenderNode -> Ptr Rect -> IO ()
gsk_render_node_get_bounds Ptr RenderNode
node' Ptr Rect
bounds
    Rect
bounds' <- ((ManagedPtr Rect -> Rect) -> Ptr Rect -> IO Rect
forall a.
(HasCallStack, BoxedObject a) =>
(ManagedPtr a -> a) -> Ptr a -> IO a
wrapBoxed ManagedPtr Rect -> Rect
Graphene.Rect.Rect) Ptr Rect
bounds
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    Rect -> IO Rect
forall (m :: * -> *) a. Monad m => a -> m a
return Rect
bounds'

#if defined(ENABLE_OVERLOADING)
data RenderNodeGetBoundsMethodInfo
instance (signature ~ (m (Graphene.Rect.Rect)), MonadIO m) => O.MethodInfo RenderNodeGetBoundsMethodInfo RenderNode signature where
    overloadedMethod = renderNodeGetBounds

#endif

-- method RenderNode::get_node_type
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Just
--               (TInterface Name { namespace = "Gsk" , name = "RenderNodeType" })
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_get_node_type" gsk_render_node_get_node_type :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    IO CUInt

-- | Returns the type of the /@node@/.
renderNodeGetNodeType ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> m Gsk.Enums.RenderNodeType
    -- ^ __Returns:__ the type of the t'GI.Gsk.Structs.RenderNode.RenderNode'
renderNodeGetNodeType :: RenderNode -> m RenderNodeType
renderNodeGetNodeType node :: RenderNode
node = IO RenderNodeType -> m RenderNodeType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO RenderNodeType -> m RenderNodeType)
-> IO RenderNodeType -> m RenderNodeType
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    CUInt
result <- Ptr RenderNode -> IO CUInt
gsk_render_node_get_node_type Ptr RenderNode
node'
    let result' :: RenderNodeType
result' = (Int -> RenderNodeType
forall a. Enum a => Int -> a
toEnum (Int -> RenderNodeType)
-> (CUInt -> Int) -> CUInt -> RenderNodeType
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CUInt -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral) CUInt
result
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    RenderNodeType -> IO RenderNodeType
forall (m :: * -> *) a. Monad m => a -> m a
return RenderNodeType
result'

#if defined(ENABLE_OVERLOADING)
data RenderNodeGetNodeTypeMethodInfo
instance (signature ~ (m Gsk.Enums.RenderNodeType), MonadIO m) => O.MethodInfo RenderNodeGetNodeTypeMethodInfo RenderNode signature where
    overloadedMethod = renderNodeGetNodeType

#endif

-- method RenderNode::ref
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Just (TInterface Name { namespace = "Gsk" , name = "RenderNode" })
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_ref" gsk_render_node_ref :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    IO (Ptr RenderNode)

-- | Acquires a reference on the given t'GI.Gsk.Structs.RenderNode.RenderNode'.
renderNodeRef ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> m RenderNode
    -- ^ __Returns:__ the t'GI.Gsk.Structs.RenderNode.RenderNode' with an additional reference
renderNodeRef :: RenderNode -> m RenderNode
renderNodeRef node :: RenderNode
node = IO RenderNode -> m RenderNode
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO RenderNode -> m RenderNode) -> IO RenderNode -> m RenderNode
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    Ptr RenderNode
result <- Ptr RenderNode -> IO (Ptr RenderNode)
gsk_render_node_ref Ptr RenderNode
node'
    Text -> Ptr RenderNode -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "renderNodeRef" Ptr RenderNode
result
    RenderNode
result' <- ((ManagedPtr RenderNode -> RenderNode)
-> Ptr RenderNode -> IO RenderNode
forall a.
(HasCallStack, BoxedObject a) =>
(ManagedPtr a -> a) -> Ptr a -> IO a
newBoxed ManagedPtr RenderNode -> RenderNode
RenderNode) Ptr RenderNode
result
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    RenderNode -> IO RenderNode
forall (m :: * -> *) a. Monad m => a -> m a
return RenderNode
result'

#if defined(ENABLE_OVERLOADING)
data RenderNodeRefMethodInfo
instance (signature ~ (m RenderNode), MonadIO m) => O.MethodInfo RenderNodeRefMethodInfo RenderNode signature where
    overloadedMethod = renderNodeRef

#endif

-- method RenderNode::serialize
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Just (TInterface Name { namespace = "GLib" , name = "Bytes" })
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_serialize" gsk_render_node_serialize :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    IO (Ptr GLib.Bytes.Bytes)

-- | Serializes the /@node@/ for later deserialization via
-- @/gsk_render_node_deserialize()/@. No guarantees are made about the format
-- used other than that the same version of GTK+ will be able to deserialize
-- the result of a call to 'GI.Gsk.Structs.RenderNode.renderNodeSerialize' and
-- @/gsk_render_node_deserialize()/@ will correctly reject files it cannot open
-- that were created with previous versions of GTK+.
-- 
-- The intended use of this functions is testing, benchmarking and debugging.
-- The format is not meant as a permanent storage format.
renderNodeSerialize ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> m GLib.Bytes.Bytes
    -- ^ __Returns:__ a t'GI.GLib.Structs.Bytes.Bytes' representing the node.
renderNodeSerialize :: RenderNode -> m Bytes
renderNodeSerialize node :: RenderNode
node = IO Bytes -> m Bytes
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Bytes -> m Bytes) -> IO Bytes -> m Bytes
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    Ptr Bytes
result <- Ptr RenderNode -> IO (Ptr Bytes)
gsk_render_node_serialize Ptr RenderNode
node'
    Text -> Ptr Bytes -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "renderNodeSerialize" Ptr Bytes
result
    Bytes
result' <- ((ManagedPtr Bytes -> Bytes) -> Ptr Bytes -> IO Bytes
forall a.
(HasCallStack, BoxedObject a) =>
(ManagedPtr a -> a) -> Ptr a -> IO a
wrapBoxed ManagedPtr Bytes -> Bytes
GLib.Bytes.Bytes) Ptr Bytes
result
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    Bytes -> IO Bytes
forall (m :: * -> *) a. Monad m => a -> m a
return Bytes
result'

#if defined(ENABLE_OVERLOADING)
data RenderNodeSerializeMethodInfo
instance (signature ~ (m GLib.Bytes.Bytes), MonadIO m) => O.MethodInfo RenderNodeSerializeMethodInfo RenderNode signature where
    overloadedMethod = renderNodeSerialize

#endif

-- method RenderNode::unref
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gsk_render_node_unref" gsk_render_node_unref :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    IO ()

-- | Releases a reference on the given t'GI.Gsk.Structs.RenderNode.RenderNode'.
-- 
-- If the reference was the last, the resources associated to the /@node@/ are
-- freed.
renderNodeUnref ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> m ()
renderNodeUnref :: RenderNode -> m ()
renderNodeUnref node :: RenderNode
node = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    Ptr RenderNode -> IO ()
gsk_render_node_unref Ptr RenderNode
node'
    RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if defined(ENABLE_OVERLOADING)
data RenderNodeUnrefMethodInfo
instance (signature ~ (m ()), MonadIO m) => O.MethodInfo RenderNodeUnrefMethodInfo RenderNode signature where
    overloadedMethod = renderNodeUnref

#endif

-- method RenderNode::write_to_file
-- method type : OrdinaryMethod
-- Args: [ Arg
--           { argCName = "node"
--           , argType =
--               TInterface Name { namespace = "Gsk" , name = "RenderNode" }
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "a #GskRenderNode" , sinceVersion = Nothing }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       , Arg
--           { argCName = "filename"
--           , argType = TBasicType TUTF8
--           , direction = DirectionIn
--           , mayBeNull = False
--           , argDoc =
--               Documentation
--                 { rawDocText = Just "the file to save it to."
--                 , sinceVersion = Nothing
--                 }
--           , argScope = ScopeTypeInvalid
--           , argClosure = -1
--           , argDestroy = -1
--           , argCallerAllocates = False
--           , transfer = TransferNothing
--           }
--       ]
-- Lengths: []
-- returnType: Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "gsk_render_node_write_to_file" gsk_render_node_write_to_file :: 
    Ptr RenderNode ->                       -- node : TInterface (Name {namespace = "Gsk", name = "RenderNode"})
    CString ->                              -- filename : TBasicType TUTF8
    Ptr (Ptr GError) ->                     -- error
    IO CInt

-- | This function is equivalent to calling 'GI.Gsk.Structs.RenderNode.renderNodeSerialize'
-- followed by 'GI.GLib.Functions.fileSetContents'. See those two functions for details
-- on the arguments.
-- 
-- It is mostly intended for use inside a debugger to quickly dump a render
-- node to a file for later inspection.
renderNodeWriteToFile ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    RenderNode
    -- ^ /@node@/: a t'GI.Gsk.Structs.RenderNode.RenderNode'
    -> T.Text
    -- ^ /@filename@/: the file to save it to.
    -> m ()
    -- ^ /(Can throw 'Data.GI.Base.GError.GError')/
renderNodeWriteToFile :: RenderNode -> Text -> m ()
renderNodeWriteToFile node :: RenderNode
node filename :: Text
filename = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
    Ptr RenderNode
node' <- RenderNode -> IO (Ptr RenderNode)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr RenderNode
node
    CString
filename' <- Text -> IO CString
textToCString Text
filename
    IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO a
onException (do
        CInt
_ <- (Ptr (Ptr GError) -> IO CInt) -> IO CInt
forall a. (Ptr (Ptr GError) -> IO a) -> IO a
propagateGError ((Ptr (Ptr GError) -> IO CInt) -> IO CInt)
-> (Ptr (Ptr GError) -> IO CInt) -> IO CInt
forall a b. (a -> b) -> a -> b
$ Ptr RenderNode -> CString -> Ptr (Ptr GError) -> IO CInt
gsk_render_node_write_to_file Ptr RenderNode
node' CString
filename'
        RenderNode -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr RenderNode
node
        CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
filename'
        () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
     ) (do
        CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
filename'
     )

#if defined(ENABLE_OVERLOADING)
data RenderNodeWriteToFileMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m) => O.MethodInfo RenderNodeWriteToFileMethodInfo RenderNode signature where
    overloadedMethod = renderNodeWriteToFile

#endif

#if defined(ENABLE_OVERLOADING)
type family ResolveRenderNodeMethod (t :: Symbol) (o :: *) :: * where
    ResolveRenderNodeMethod "draw" o = RenderNodeDrawMethodInfo
    ResolveRenderNodeMethod "ref" o = RenderNodeRefMethodInfo
    ResolveRenderNodeMethod "serialize" o = RenderNodeSerializeMethodInfo
    ResolveRenderNodeMethod "unref" o = RenderNodeUnrefMethodInfo
    ResolveRenderNodeMethod "writeToFile" o = RenderNodeWriteToFileMethodInfo
    ResolveRenderNodeMethod "getBounds" o = RenderNodeGetBoundsMethodInfo
    ResolveRenderNodeMethod "getNodeType" o = RenderNodeGetNodeTypeMethodInfo
    ResolveRenderNodeMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveRenderNodeMethod t RenderNode, O.MethodInfo info RenderNode p) => OL.IsLabel t (RenderNode -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod @info
#else
    fromLabel _ = O.overloadedMethod @info
#endif

#endif