{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

All the fields in the GObject structure are private
to the 'GI.GObject.Objects.Object.Object' implementation and should never be accessed directly.
-}

#define ENABLE_OVERLOADING \
       (!defined(__HADDOCK_VERSION__))

module GI.GObject.Objects.Object
    ( 
#if ENABLE_OVERLOADING
    ObjectInterfaceListPropertiesMethodInfo ,
#endif

-- * Exported types
    Object(..)                              ,
    IsObject                                ,
    toObject                                ,
    noObject                                ,


 -- * Methods
-- ** bindProperty #method:bindProperty#

#if ENABLE_OVERLOADING
    ObjectBindPropertyMethodInfo            ,
#endif
    objectBindProperty                      ,


-- ** bindPropertyFull #method:bindPropertyFull#

#if ENABLE_OVERLOADING
    ObjectBindPropertyFullMethodInfo        ,
#endif
    objectBindPropertyFull                  ,


-- ** compatControl #method:compatControl#

    objectCompatControl                     ,


-- ** forceFloating #method:forceFloating#

#if ENABLE_OVERLOADING
    ObjectForceFloatingMethodInfo           ,
#endif
    objectForceFloating                     ,


-- ** freezeNotify #method:freezeNotify#

#if ENABLE_OVERLOADING
    ObjectFreezeNotifyMethodInfo            ,
#endif
    objectFreezeNotify                      ,


-- ** getData #method:getData#

#if ENABLE_OVERLOADING
    ObjectGetDataMethodInfo                 ,
#endif
    objectGetData                           ,


-- ** getProperty #method:getProperty#

#if ENABLE_OVERLOADING
    ObjectGetPropertyMethodInfo             ,
#endif
    objectGetProperty                       ,


-- ** getQdata #method:getQdata#

#if ENABLE_OVERLOADING
    ObjectGetQdataMethodInfo                ,
#endif
    objectGetQdata                          ,


-- ** getv #method:getv#

#if ENABLE_OVERLOADING
    ObjectGetvMethodInfo                    ,
#endif
    objectGetv                              ,


-- ** interfaceFindProperty #method:interfaceFindProperty#

    objectInterfaceFindProperty             ,


-- ** interfaceInstallProperty #method:interfaceInstallProperty#

    objectInterfaceInstallProperty          ,


-- ** isFloating #method:isFloating#

#if ENABLE_OVERLOADING
    ObjectIsFloatingMethodInfo              ,
#endif
    objectIsFloating                        ,


-- ** newv #method:newv#

    objectNewv                              ,


-- ** notify #method:notify#

#if ENABLE_OVERLOADING
    ObjectNotifyMethodInfo                  ,
#endif
    objectNotify                            ,


-- ** notifyByPspec #method:notifyByPspec#

#if ENABLE_OVERLOADING
    ObjectNotifyByPspecMethodInfo           ,
#endif
    objectNotifyByPspec                     ,


-- ** ref #method:ref#

#if ENABLE_OVERLOADING
    ObjectRefMethodInfo                     ,
#endif
    objectRef                               ,


-- ** refSink #method:refSink#

#if ENABLE_OVERLOADING
    ObjectRefSinkMethodInfo                 ,
#endif
    objectRefSink                           ,


-- ** runDispose #method:runDispose#

#if ENABLE_OVERLOADING
    ObjectRunDisposeMethodInfo              ,
#endif
    objectRunDispose                        ,


-- ** setData #method:setData#

#if ENABLE_OVERLOADING
    ObjectSetDataMethodInfo                 ,
#endif
    objectSetData                           ,


-- ** setDataFull #method:setDataFull#

#if ENABLE_OVERLOADING
    ObjectSetDataFullMethodInfo             ,
#endif
    objectSetDataFull                       ,


-- ** setProperty #method:setProperty#

#if ENABLE_OVERLOADING
    ObjectSetPropertyMethodInfo             ,
#endif
    objectSetProperty                       ,


-- ** stealData #method:stealData#

#if ENABLE_OVERLOADING
    ObjectStealDataMethodInfo               ,
#endif
    objectStealData                         ,


-- ** stealQdata #method:stealQdata#

#if ENABLE_OVERLOADING
    ObjectStealQdataMethodInfo              ,
#endif
    objectStealQdata                        ,


-- ** thawNotify #method:thawNotify#

#if ENABLE_OVERLOADING
    ObjectThawNotifyMethodInfo              ,
#endif
    objectThawNotify                        ,


-- ** unref #method:unref#

#if ENABLE_OVERLOADING
    ObjectUnrefMethodInfo                   ,
#endif
    objectUnref                             ,


-- ** watchClosure #method:watchClosure#

#if ENABLE_OVERLOADING
    ObjectWatchClosureMethodInfo            ,
#endif
    objectWatchClosure                      ,




 -- * Signals
-- ** notify #signal:notify#

    C_ObjectNotifyCallback                  ,
    ObjectNotifyCallback                    ,
#if ENABLE_OVERLOADING
    ObjectNotifySignalInfo                  ,
#endif
    afterObjectNotify                       ,
    genClosure_ObjectNotify                 ,
    mk_ObjectNotifyCallback                 ,
    noObjectNotifyCallback                  ,
    onObjectNotify                          ,
    wrap_ObjectNotifyCallback               ,




    ) 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.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.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP

import qualified GI.GLib.Callbacks as GLib.Callbacks
import {-# SOURCE #-} qualified GI.GObject.Flags as GObject.Flags
import {-# SOURCE #-} qualified GI.GObject.Objects.Binding as GObject.Binding
import {-# SOURCE #-} qualified GI.GObject.Structs.Parameter as GObject.Parameter
import {-# SOURCE #-} qualified GI.GObject.Structs.TypeInterface as GObject.TypeInterface

-- | Memory-managed wrapper type.
newtype Object = Object (ManagedPtr Object)
foreign import ccall "g_object_get_type"
    c_g_object_get_type :: IO GType

instance GObject Object where
    gobjectType :: Object -> IO GType
gobjectType _ = IO GType
c_g_object_get_type
    

-- | Type class for types which can be safely cast to `Object`, for instance with `toObject`.
class GObject o => IsObject o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError Object a) =>
    IsObject a
#endif
instance IsObject Object

-- | Cast to `Object`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toObject :: (MonadIO m, IsObject o) => o -> m Object
toObject :: o -> m Object
toObject = IO Object -> m Object
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Object -> m Object) -> (o -> IO Object) -> o -> m Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ManagedPtr Object -> Object) -> o -> IO Object
forall o o'.
(HasCallStack, GObject o, GObject o') =>
(ManagedPtr o' -> o') -> o -> IO o'
unsafeCastTo ManagedPtr Object -> Object
Object

-- | A convenience alias for `Nothing` :: `Maybe` `Object`.
noObject :: Maybe Object
noObject :: Maybe Object
noObject = Maybe Object
forall a. Maybe a
Nothing

#if ENABLE_OVERLOADING
type family ResolveObjectMethod (t :: Symbol) (o :: *) :: * where
    ResolveObjectMethod "bindProperty" o = ObjectBindPropertyMethodInfo
    ResolveObjectMethod "bindPropertyFull" o = ObjectBindPropertyFullMethodInfo
    ResolveObjectMethod "forceFloating" o = ObjectForceFloatingMethodInfo
    ResolveObjectMethod "freezeNotify" o = ObjectFreezeNotifyMethodInfo
    ResolveObjectMethod "getv" o = ObjectGetvMethodInfo
    ResolveObjectMethod "isFloating" o = ObjectIsFloatingMethodInfo
    ResolveObjectMethod "notify" o = ObjectNotifyMethodInfo
    ResolveObjectMethod "notifyByPspec" o = ObjectNotifyByPspecMethodInfo
    ResolveObjectMethod "ref" o = ObjectRefMethodInfo
    ResolveObjectMethod "refSink" o = ObjectRefSinkMethodInfo
    ResolveObjectMethod "runDispose" o = ObjectRunDisposeMethodInfo
    ResolveObjectMethod "stealData" o = ObjectStealDataMethodInfo
    ResolveObjectMethod "stealQdata" o = ObjectStealQdataMethodInfo
    ResolveObjectMethod "thawNotify" o = ObjectThawNotifyMethodInfo
    ResolveObjectMethod "unref" o = ObjectUnrefMethodInfo
    ResolveObjectMethod "watchClosure" o = ObjectWatchClosureMethodInfo
    ResolveObjectMethod "getData" o = ObjectGetDataMethodInfo
    ResolveObjectMethod "getProperty" o = ObjectGetPropertyMethodInfo
    ResolveObjectMethod "getQdata" o = ObjectGetQdataMethodInfo
    ResolveObjectMethod "setData" o = ObjectSetDataMethodInfo
    ResolveObjectMethod "setDataFull" o = ObjectSetDataFullMethodInfo
    ResolveObjectMethod "setProperty" o = ObjectSetPropertyMethodInfo
    ResolveObjectMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveObjectMethod t Object, O.MethodInfo info Object p) => O.IsLabelProxy t (Object -> p) where
    fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveObjectMethod t Object, O.MethodInfo info Object p) => O.IsLabel t (Object -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif
#endif

#endif

-- signal Object::notify
{- |
The notify signal is emitted on an object when one of its properties has
its value set through 'GI.GObject.Objects.Object.objectSetProperty', @/g_object_set()/@, et al.

Note that getting this signal doesn’t itself guarantee that the value of
the property has actually changed. When it is emitted is determined by the
derived GObject class. If the implementor did not create the property with
'GI.GObject.Flags.ParamFlagsExplicitNotify', then any call to 'GI.GObject.Objects.Object.objectSetProperty' results
in ::notify being emitted, even if the new value is the same as the old.
If they did pass 'GI.GObject.Flags.ParamFlagsExplicitNotify', then this signal is emitted only
when they explicitly call 'GI.GObject.Objects.Object.objectNotify' or 'GI.GObject.Objects.Object.objectNotifyByPspec',
and common practice is to do that only when the value has actually changed.

This signal is typically used to obtain change notification for a
single property, by specifying the property name as a detail in the
@/g_signal_connect()/@ call, like this:

=== /C code/
>
>g_signal_connect (text_view->buffer, "notify::paste-target-list",
>                  G_CALLBACK (gtk_text_view_target_list_notify),
>                  text_view)

It is important to note that you must use
[canonical parameter names][canonical-parameter-names] as
detail strings for the notify signal.
-}
type ObjectNotifyCallback =
    GParamSpec
    {- ^ /@pspec@/: the 'GI.GObject.Objects.ParamSpec.ParamSpec' of the property which changed. -}
    -> IO ()

-- | A convenience synonym for @`Nothing` :: `Maybe` `ObjectNotifyCallback`@.
noObjectNotifyCallback :: Maybe ObjectNotifyCallback
noObjectNotifyCallback :: Maybe ObjectNotifyCallback
noObjectNotifyCallback = Maybe ObjectNotifyCallback
forall a. Maybe a
Nothing

-- | Type for the callback on the (unwrapped) C side.
type C_ObjectNotifyCallback =
    Ptr () ->                               -- object
    Ptr GParamSpec ->
    Ptr () ->                               -- user_data
    IO ()

-- | Generate a function pointer callable from C code, from a `C_ObjectNotifyCallback`.
foreign import ccall "wrapper"
    mk_ObjectNotifyCallback :: C_ObjectNotifyCallback -> IO (FunPtr C_ObjectNotifyCallback)

-- | Wrap the callback into a `Closure`.
genClosure_ObjectNotify :: ObjectNotifyCallback -> IO Closure
genClosure_ObjectNotify :: ObjectNotifyCallback -> IO Closure
genClosure_ObjectNotify cb :: ObjectNotifyCallback
cb = do
    let cb' :: C_ObjectNotifyCallback
cb' = ObjectNotifyCallback -> C_ObjectNotifyCallback
wrap_ObjectNotifyCallback ObjectNotifyCallback
cb
    C_ObjectNotifyCallback -> IO (FunPtr C_ObjectNotifyCallback)
mk_ObjectNotifyCallback C_ObjectNotifyCallback
cb' IO (FunPtr C_ObjectNotifyCallback)
-> (FunPtr C_ObjectNotifyCallback -> IO Closure) -> IO Closure
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= FunPtr C_ObjectNotifyCallback -> IO Closure
forall a. FunPtr a -> IO Closure
newCClosure


-- | Wrap a `ObjectNotifyCallback` into a `C_ObjectNotifyCallback`.
wrap_ObjectNotifyCallback ::
    ObjectNotifyCallback ->
    C_ObjectNotifyCallback
wrap_ObjectNotifyCallback :: ObjectNotifyCallback -> C_ObjectNotifyCallback
wrap_ObjectNotifyCallback _cb :: ObjectNotifyCallback
_cb _ pspec :: Ptr GParamSpec
pspec _ = do
    GParamSpec
pspec' <- Ptr GParamSpec -> IO GParamSpec
B.GParamSpec.newGParamSpecFromPtr Ptr GParamSpec
pspec
    ObjectNotifyCallback
_cb  GParamSpec
pspec'


{- |
Connect a signal handler for the “@notify@” signal, to be run before the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.on' object #notify callback
@
-}
onObjectNotify :: (IsObject a, MonadIO m) => a -> ObjectNotifyCallback -> m SignalHandlerId
onObjectNotify :: a -> ObjectNotifyCallback -> m SignalHandlerId
onObjectNotify obj :: a
obj cb :: ObjectNotifyCallback
cb = IO SignalHandlerId -> m SignalHandlerId
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO SignalHandlerId -> m SignalHandlerId)
-> IO SignalHandlerId -> m SignalHandlerId
forall a b. (a -> b) -> a -> b
$ do
    let cb' :: C_ObjectNotifyCallback
cb' = ObjectNotifyCallback -> C_ObjectNotifyCallback
wrap_ObjectNotifyCallback ObjectNotifyCallback
cb
    FunPtr C_ObjectNotifyCallback
cb'' <- C_ObjectNotifyCallback -> IO (FunPtr C_ObjectNotifyCallback)
mk_ObjectNotifyCallback C_ObjectNotifyCallback
cb'
    a
-> String
-> FunPtr C_ObjectNotifyCallback
-> SignalConnectMode
-> IO SignalHandlerId
forall o a.
GObject o =>
o -> String -> FunPtr a -> SignalConnectMode -> IO SignalHandlerId
connectSignalFunPtr a
obj "notify" FunPtr C_ObjectNotifyCallback
cb'' SignalConnectMode
SignalConnectBefore

{- |
Connect a signal handler for the “@notify@” signal, to be run after the default handler.
When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

@
'Data.GI.Base.Signals.after' object #notify callback
@
-}
afterObjectNotify :: (IsObject a, MonadIO m) => a -> ObjectNotifyCallback -> m SignalHandlerId
afterObjectNotify :: a -> ObjectNotifyCallback -> m SignalHandlerId
afterObjectNotify obj :: a
obj cb :: ObjectNotifyCallback
cb = IO SignalHandlerId -> m SignalHandlerId
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO SignalHandlerId -> m SignalHandlerId)
-> IO SignalHandlerId -> m SignalHandlerId
forall a b. (a -> b) -> a -> b
$ do
    let cb' :: C_ObjectNotifyCallback
cb' = ObjectNotifyCallback -> C_ObjectNotifyCallback
wrap_ObjectNotifyCallback ObjectNotifyCallback
cb
    FunPtr C_ObjectNotifyCallback
cb'' <- C_ObjectNotifyCallback -> IO (FunPtr C_ObjectNotifyCallback)
mk_ObjectNotifyCallback C_ObjectNotifyCallback
cb'
    a
-> String
-> FunPtr C_ObjectNotifyCallback
-> SignalConnectMode
-> IO SignalHandlerId
forall o a.
GObject o =>
o -> String -> FunPtr a -> SignalConnectMode -> IO SignalHandlerId
connectSignalFunPtr a
obj "notify" FunPtr C_ObjectNotifyCallback
cb'' SignalConnectMode
SignalConnectAfter


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

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
data ObjectNotifySignalInfo
instance SignalInfo ObjectNotifySignalInfo where
    type HaskellCallbackType ObjectNotifySignalInfo = ObjectNotifyCallback
    connectSignal _ obj cb connectMode = do
        let cb' = wrap_ObjectNotifyCallback cb
        cb'' <- mk_ObjectNotifyCallback cb'
        connectSignalFunPtr obj "notify" cb'' connectMode

type instance O.SignalList Object = ObjectSignalList
type ObjectSignalList = ('[ '("notify", ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

-- method Object::newv
-- method type : Constructor
-- Args : [Arg {argCName = "object_type", argType = TBasicType TGType, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the type id of the #GObject subtype to instantiate", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_parameters", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of the @parameters array", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "parameters", argType = TCArray False (-1) 1 (TInterface (Name {namespace = "GObject", name = "Parameter"})), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an array of #GParameter", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : [Arg {argCName = "n_parameters", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the length of the @parameters array", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- returnType : Just (TInterface (Name {namespace = "GObject", name = "Object"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_object_newv" g_object_newv :: 
    CGType ->                               -- object_type : TBasicType TGType
    Word32 ->                               -- n_parameters : TBasicType TUInt
    Ptr GObject.Parameter.Parameter ->      -- parameters : TCArray False (-1) 1 (TInterface (Name {namespace = "GObject", name = "Parameter"}))
    IO (Ptr Object)

{-# DEPRECATED objectNewv ["(Since version 2.54)","Use @/g_object_new_with_properties()/@ instead.","deprecated. See 'GI.GObject.Structs.Parameter.Parameter' for more information."] #-}
{- |
Creates a new instance of a 'GI.GObject.Objects.Object.Object' subtype and sets its properties.

Construction parameters (see @/G_PARAM_CONSTRUCT/@, @/G_PARAM_CONSTRUCT_ONLY/@)
which are not explicitly specified are set to their default values.
-}
objectNewv ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GType
    {- ^ /@objectType@/: the type id of the 'GI.GObject.Objects.Object.Object' subtype to instantiate -}
    -> [GObject.Parameter.Parameter]
    {- ^ /@parameters@/: an array of 'GI.GObject.Structs.Parameter.Parameter' -}
    -> m Object
    {- ^ __Returns:__ a new instance of
/@objectType@/ -}
objectNewv :: GType -> [Parameter] -> m Object
objectNewv objectType :: GType
objectType parameters :: [Parameter]
parameters = IO Object -> m Object
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Object -> m Object) -> IO Object -> m Object
forall a b. (a -> b) -> a -> b
$ do
    let nParameters :: Word32
nParameters = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word32) -> Int -> Word32
forall a b. (a -> b) -> a -> b
$ [Parameter] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Parameter]
parameters
    let objectType' :: CGType
objectType' = GType -> CGType
gtypeToCGType GType
objectType
    [Ptr Parameter]
parameters' <- (Parameter -> IO (Ptr Parameter))
-> [Parameter] -> IO [Ptr Parameter]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Parameter -> IO (Ptr Parameter)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr [Parameter]
parameters
    Ptr Parameter
parameters'' <- Int -> [Ptr Parameter] -> IO (Ptr Parameter)
forall a. Int -> [Ptr a] -> IO (Ptr a)
packBlockArray 32 [Ptr Parameter]
parameters'
    Ptr Object
result <- CGType -> Word32 -> Ptr Parameter -> IO (Ptr Object)
g_object_newv CGType
objectType' Word32
nParameters Ptr Parameter
parameters''
    Text -> Ptr Object -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectNewv" Ptr Object
result
    Object
result' <- ((ManagedPtr Object -> Object) -> Ptr Object -> IO Object
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
wrapObject ManagedPtr Object -> Object
Object) Ptr Object
result
    (Parameter -> IO ()) -> [Parameter] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Parameter -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr [Parameter]
parameters
    Ptr Parameter -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr Parameter
parameters''
    Object -> IO Object
forall (m :: * -> *) a. Monad m => a -> m a
return Object
result'

#if ENABLE_OVERLOADING
#endif

-- method Object::bind_property
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "source", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the source #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "source_property", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the property on @source to bind", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "target", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the target #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "target_property", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the property on @target to bind", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "flags", argType = TInterface (Name {namespace = "GObject", name = "BindingFlags"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "flags to pass to #GBinding", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "GObject", name = "Binding"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_object_bind_property" g_object_bind_property :: 
    Ptr Object ->                           -- source : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- source_property : TBasicType TUTF8
    Ptr Object ->                           -- target : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- target_property : TBasicType TUTF8
    CUInt ->                                -- flags : TInterface (Name {namespace = "GObject", name = "BindingFlags"})
    IO (Ptr GObject.Binding.Binding)

{- |
Creates a binding between /@sourceProperty@/ on /@source@/ and /@targetProperty@/
on /@target@/. Whenever the /@sourceProperty@/ is changed the /@targetProperty@/ is
updated using the same value. For instance:

>
>  g_object_bind_property (action, "active", widget, "sensitive", 0);


Will result in the \"sensitive\" property of the widget 'GI.GObject.Objects.Object.Object' instance to be
updated with the same value of the \"active\" property of the action 'GI.GObject.Objects.Object.Object'
instance.

If /@flags@/ contains 'GI.GObject.Flags.BindingFlagsBidirectional' then the binding will be mutual:
if /@targetProperty@/ on /@target@/ changes then the /@sourceProperty@/ on /@source@/
will be updated as well.

The binding will automatically be removed when either the /@source@/ or the
/@target@/ instances are finalized. To remove the binding without affecting the
/@source@/ and the /@target@/ you can just call 'GI.GObject.Objects.Object.objectUnref' on the returned
'GI.GObject.Objects.Binding.Binding' instance.

A 'GI.GObject.Objects.Object.Object' can have multiple bindings.

/Since: 2.26/
-}
objectBindProperty ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a, IsObject b) =>
    a
    {- ^ /@source@/: the source 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@sourceProperty@/: the property on /@source@/ to bind -}
    -> b
    {- ^ /@target@/: the target 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@targetProperty@/: the property on /@target@/ to bind -}
    -> [GObject.Flags.BindingFlags]
    {- ^ /@flags@/: flags to pass to 'GI.GObject.Objects.Binding.Binding' -}
    -> m GObject.Binding.Binding
    {- ^ __Returns:__ the 'GI.GObject.Objects.Binding.Binding' instance representing the
    binding between the two 'GI.GObject.Objects.Object.Object' instances. The binding is released
    whenever the 'GI.GObject.Objects.Binding.Binding' reference count reaches zero. -}
objectBindProperty :: a -> Text -> b -> Text -> [BindingFlags] -> m Binding
objectBindProperty source :: a
source sourceProperty :: Text
sourceProperty target :: b
target targetProperty :: Text
targetProperty flags :: [BindingFlags]
flags = IO Binding -> m Binding
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Binding -> m Binding) -> IO Binding -> m Binding
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
source' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
source
    CString
sourceProperty' <- Text -> IO CString
textToCString Text
sourceProperty
    Ptr Object
target' <- b -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr b
target
    CString
targetProperty' <- Text -> IO CString
textToCString Text
targetProperty
    let flags' :: CUInt
flags' = [BindingFlags] -> CUInt
forall b a. (Num b, IsGFlag a) => [a] -> b
gflagsToWord [BindingFlags]
flags
    Ptr Binding
result <- Ptr Object
-> CString -> Ptr Object -> CString -> CUInt -> IO (Ptr Binding)
g_object_bind_property Ptr Object
source' CString
sourceProperty' Ptr Object
target' CString
targetProperty' CUInt
flags'
    Text -> Ptr Binding -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectBindProperty" Ptr Binding
result
    Binding
result' <- ((ManagedPtr Binding -> Binding) -> Ptr Binding -> IO Binding
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
newObject ManagedPtr Binding -> Binding
GObject.Binding.Binding) Ptr Binding
result
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
source
    b -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr b
target
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
sourceProperty'
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
targetProperty'
    Binding -> IO Binding
forall (m :: * -> *) a. Monad m => a -> m a
return Binding
result'

#if ENABLE_OVERLOADING
data ObjectBindPropertyMethodInfo
instance (signature ~ (T.Text -> b -> T.Text -> [GObject.Flags.BindingFlags] -> m GObject.Binding.Binding), MonadIO m, IsObject a, IsObject b) => O.MethodInfo ObjectBindPropertyMethodInfo a signature where
    overloadedMethod _ = objectBindProperty

#endif

-- method Object::bind_property_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "source", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the source #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "source_property", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the property on @source to bind", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "target", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the target #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "target_property", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the property on @target to bind", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "flags", argType = TInterface (Name {namespace = "GObject", name = "BindingFlags"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "flags to pass to #GBinding", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "transform_to", argType = TInterface (Name {namespace = "GObject", name = "Closure"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GClosure wrapping the transformation function\n    from the @source to the @target, or %NULL to use the default", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "transform_from", argType = TInterface (Name {namespace = "GObject", name = "Closure"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GClosure wrapping the transformation function\n    from the @target to the @source, or %NULL to use the default", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "GObject", name = "Binding"}))
-- throws : False
-- Skip return : False

foreign import ccall "g_object_bind_property_with_closures" g_object_bind_property_with_closures :: 
    Ptr Object ->                           -- source : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- source_property : TBasicType TUTF8
    Ptr Object ->                           -- target : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- target_property : TBasicType TUTF8
    CUInt ->                                -- flags : TInterface (Name {namespace = "GObject", name = "BindingFlags"})
    Ptr Closure ->                          -- transform_to : TInterface (Name {namespace = "GObject", name = "Closure"})
    Ptr Closure ->                          -- transform_from : TInterface (Name {namespace = "GObject", name = "Closure"})
    IO (Ptr GObject.Binding.Binding)

{- |
Creates a binding between /@sourceProperty@/ on /@source@/ and /@targetProperty@/
on /@target@/, allowing you to set the transformation functions to be used by
the binding.

This function is the language bindings friendly version of
@/g_object_bind_property_full()/@, using @/GClosures/@ instead of
function pointers.

/Since: 2.26/
-}
objectBindPropertyFull ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a, IsObject b) =>
    a
    {- ^ /@source@/: the source 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@sourceProperty@/: the property on /@source@/ to bind -}
    -> b
    {- ^ /@target@/: the target 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@targetProperty@/: the property on /@target@/ to bind -}
    -> [GObject.Flags.BindingFlags]
    {- ^ /@flags@/: flags to pass to 'GI.GObject.Objects.Binding.Binding' -}
    -> Closure
    {- ^ /@transformTo@/: a 'GI.GObject.Structs.Closure.Closure' wrapping the transformation function
    from the /@source@/ to the /@target@/, or 'Nothing' to use the default -}
    -> Closure
    {- ^ /@transformFrom@/: a 'GI.GObject.Structs.Closure.Closure' wrapping the transformation function
    from the /@target@/ to the /@source@/, or 'Nothing' to use the default -}
    -> m GObject.Binding.Binding
    {- ^ __Returns:__ the 'GI.GObject.Objects.Binding.Binding' instance representing the
    binding between the two 'GI.GObject.Objects.Object.Object' instances. The binding is released
    whenever the 'GI.GObject.Objects.Binding.Binding' reference count reaches zero. -}
objectBindPropertyFull :: a
-> Text
-> b
-> Text
-> [BindingFlags]
-> Closure
-> Closure
-> m Binding
objectBindPropertyFull source :: a
source sourceProperty :: Text
sourceProperty target :: b
target targetProperty :: Text
targetProperty flags :: [BindingFlags]
flags transformTo :: Closure
transformTo transformFrom :: Closure
transformFrom = IO Binding -> m Binding
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Binding -> m Binding) -> IO Binding -> m Binding
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
source' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
source
    CString
sourceProperty' <- Text -> IO CString
textToCString Text
sourceProperty
    Ptr Object
target' <- b -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr b
target
    CString
targetProperty' <- Text -> IO CString
textToCString Text
targetProperty
    let flags' :: CUInt
flags' = [BindingFlags] -> CUInt
forall b a. (Num b, IsGFlag a) => [a] -> b
gflagsToWord [BindingFlags]
flags
    Ptr Closure
transformTo' <- Closure -> IO (Ptr Closure)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr Closure
transformTo
    Ptr Closure
transformFrom' <- Closure -> IO (Ptr Closure)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr Closure
transformFrom
    Ptr Binding
result <- Ptr Object
-> CString
-> Ptr Object
-> CString
-> CUInt
-> Ptr Closure
-> Ptr Closure
-> IO (Ptr Binding)
g_object_bind_property_with_closures Ptr Object
source' CString
sourceProperty' Ptr Object
target' CString
targetProperty' CUInt
flags' Ptr Closure
transformTo' Ptr Closure
transformFrom'
    Text -> Ptr Binding -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectBindPropertyFull" Ptr Binding
result
    Binding
result' <- ((ManagedPtr Binding -> Binding) -> Ptr Binding -> IO Binding
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
newObject ManagedPtr Binding -> Binding
GObject.Binding.Binding) Ptr Binding
result
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
source
    b -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr b
target
    Closure -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr Closure
transformTo
    Closure -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr Closure
transformFrom
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
sourceProperty'
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
targetProperty'
    Binding -> IO Binding
forall (m :: * -> *) a. Monad m => a -> m a
return Binding
result'

#if ENABLE_OVERLOADING
data ObjectBindPropertyFullMethodInfo
instance (signature ~ (T.Text -> b -> T.Text -> [GObject.Flags.BindingFlags] -> Closure -> Closure -> m GObject.Binding.Binding), MonadIO m, IsObject a, IsObject b) => O.MethodInfo ObjectBindPropertyFullMethodInfo a signature where
    overloadedMethod _ = objectBindPropertyFull

#endif

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

foreign import ccall "g_object_force_floating" g_object_force_floating :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO ()

{- |
This function is intended for 'GI.GObject.Objects.Object.Object' implementations to re-enforce
a [floating][floating-ref] object reference. Doing this is seldom
required: all @/GInitiallyUnowneds/@ are created with a floating reference
which usually just needs to be sunken by calling 'GI.GObject.Objects.Object.objectRefSink'.

/Since: 2.10/
-}
objectForceFloating ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m ()
objectForceFloating :: a -> m ()
objectForceFloating object :: a
object = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object -> IO ()
g_object_force_floating Ptr Object
object'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectForceFloatingMethodInfo
instance (signature ~ (m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectForceFloatingMethodInfo a signature where
    overloadedMethod _ = objectForceFloating

#endif

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

foreign import ccall "g_object_freeze_notify" g_object_freeze_notify :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO ()

{- |
Increases the freeze count on /@object@/. If the freeze count is
non-zero, the emission of \"notify\" signals on /@object@/ is
stopped. The signals are queued until the freeze count is decreased
to zero. Duplicate notifications are squashed so that at most one
'GI.GObject.Objects.Object.Object'::@/notify/@ signal is emitted for each property modified while the
object is frozen.

This is necessary for accessors that modify multiple properties to prevent
premature notification while the object is still being modified.
-}
objectFreezeNotify ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m ()
objectFreezeNotify :: a -> m ()
objectFreezeNotify object :: a
object = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object -> IO ()
g_object_freeze_notify Ptr Object
object'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectFreezeNotifyMethodInfo
instance (signature ~ (m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectFreezeNotifyMethodInfo a signature where
    overloadedMethod _ = objectFreezeNotify

#endif

-- method Object::get_data
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GObject containing the associations", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of the key for that association", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_object_get_data" g_object_get_data :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- key : TBasicType TUTF8
    IO (Ptr ())

{- |
Gets a named field from the objects table of associations (see 'GI.GObject.Objects.Object.objectSetData').
-}
objectGetData ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: 'GI.GObject.Objects.Object.Object' containing the associations -}
    -> T.Text
    {- ^ /@key@/: name of the key for that association -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data if found,
         or 'Nothing' if no such data exists. -}
objectGetData :: a -> Text -> m (Ptr ())
objectGetData object :: a
object key :: Text
key = IO (Ptr ()) -> m (Ptr ())
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Ptr ()) -> m (Ptr ())) -> IO (Ptr ()) -> m (Ptr ())
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
key' <- Text -> IO CString
textToCString Text
key
    Ptr ()
result <- Ptr Object -> CString -> IO (Ptr ())
g_object_get_data Ptr Object
object' CString
key'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
key'
    Ptr () -> IO (Ptr ())
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr ()
result

#if ENABLE_OVERLOADING
data ObjectGetDataMethodInfo
instance (signature ~ (T.Text -> m (Ptr ())), MonadIO m, IsObject a) => O.MethodInfo ObjectGetDataMethodInfo a signature where
    overloadedMethod _ = objectGetData

#endif

-- method Object::get_property
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "property_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the property to get", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "value", argType = TInterface (Name {namespace = "GObject", name = "Value"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "return location for the property value", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_get_property" g_object_get_property :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- property_name : TBasicType TUTF8
    Ptr GValue ->                           -- value : TInterface (Name {namespace = "GObject", name = "Value"})
    IO ()

{- |
Gets a property of an object.

The /@value@/ can be:

 - an empty 'GI.GObject.Structs.Value.Value' initialized by @/G_VALUE_INIT/@, which will be
   automatically initialized with the expected type of the property
   (since GLib 2.60)
 - a 'GI.GObject.Structs.Value.Value' initialized with the expected type of the property
 - a 'GI.GObject.Structs.Value.Value' initialized with a type to which the expected type
   of the property can be transformed

In general, a copy is made of the property contents and the caller is
responsible for freeing the memory by calling 'GI.GObject.Structs.Value.valueUnset'.

Note that 'GI.GObject.Objects.Object.objectGetProperty' is really intended for language
bindings, @/g_object_get()/@ is much more convenient for C programming.
-}
objectGetProperty ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@propertyName@/: the name of the property to get -}
    -> GValue
    {- ^ /@value@/: return location for the property value -}
    -> m ()
objectGetProperty :: a -> Text -> GValue -> m ()
objectGetProperty object :: a
object propertyName :: Text
propertyName value :: GValue
value = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
propertyName' <- Text -> IO CString
textToCString Text
propertyName
    Ptr GValue
value' <- GValue -> IO (Ptr GValue)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr GValue
value
    Ptr Object -> CString -> Ptr GValue -> IO ()
g_object_get_property Ptr Object
object' CString
propertyName' Ptr GValue
value'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    GValue -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr GValue
value
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
propertyName'
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectGetPropertyMethodInfo
instance (signature ~ (T.Text -> GValue -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectGetPropertyMethodInfo a signature where
    overloadedMethod _ = objectGetProperty

#endif

-- method Object::get_qdata
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The GObject to get a stored user data pointer from", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "quark", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GQuark, naming the user data pointer", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_object_get_qdata" g_object_get_qdata :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    Word32 ->                               -- quark : TBasicType TUInt32
    IO (Ptr ())

{- |
This function gets back user data pointers stored via
@/g_object_set_qdata()/@.
-}
objectGetQdata ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: The GObject to get a stored user data pointer from -}
    -> Word32
    {- ^ /@quark@/: A @/GQuark/@, naming the user data pointer -}
    -> m (Ptr ())
    {- ^ __Returns:__ The user data pointer set, or 'Nothing' -}
objectGetQdata :: a -> Word32 -> m (Ptr ())
objectGetQdata object :: a
object quark :: Word32
quark = IO (Ptr ()) -> m (Ptr ())
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Ptr ()) -> m (Ptr ())) -> IO (Ptr ()) -> m (Ptr ())
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr ()
result <- Ptr Object -> Word32 -> IO (Ptr ())
g_object_get_qdata Ptr Object
object' Word32
quark
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Ptr () -> IO (Ptr ())
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr ()
result

#if ENABLE_OVERLOADING
data ObjectGetQdataMethodInfo
instance (signature ~ (Word32 -> m (Ptr ())), MonadIO m, IsObject a) => O.MethodInfo ObjectGetQdataMethodInfo a signature where
    overloadedMethod _ = objectGetQdata

#endif

-- method Object::getv
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_properties", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of properties", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "names", argType = TCArray False (-1) 1 (TBasicType TUTF8), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the names of each property to get", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "values", argType = TCArray False (-1) 1 (TInterface (Name {namespace = "GObject", name = "Value"})), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the values of each property to get", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : [Arg {argCName = "n_properties", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of properties", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "n_properties", argType = TBasicType TUInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the number of properties", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_getv" g_object_getv :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    Word32 ->                               -- n_properties : TBasicType TUInt
    Ptr CString ->                          -- names : TCArray False (-1) 1 (TBasicType TUTF8)
    Ptr GValue ->                           -- values : TCArray False (-1) 1 (TInterface (Name {namespace = "GObject", name = "Value"}))
    IO ()

{- |
Gets /@nProperties@/ properties for an /@object@/.
Obtained properties will be set to /@values@/. All properties must be valid.
Warnings will be emitted and undefined behaviour may result if invalid
properties are passed in.

/Since: 2.54/
-}
objectGetv ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> [T.Text]
    {- ^ /@names@/: the names of each property to get -}
    -> [GValue]
    {- ^ /@values@/: the values of each property to get -}
    -> m ()
objectGetv :: a -> [Text] -> [GValue] -> m ()
objectGetv object :: a
object names :: [Text]
names values :: [GValue]
values = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ do
    let nProperties :: Word32
nProperties = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word32) -> Int -> Word32
forall a b. (a -> b) -> a -> b
$ [GValue] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [GValue]
values
    let names_expected_length_ :: Word32
names_expected_length_ = Int -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word32) -> Int -> Word32
forall a b. (a -> b) -> a -> b
$ [Text] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Text]
names
    Bool -> IO () -> IO ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Word32
names_expected_length_ Word32 -> Word32 -> Bool
forall a. Eq a => a -> a -> Bool
/= Word32
nProperties) (IO () -> IO ()) -> IO () -> IO ()
forall a b. (a -> b) -> a -> b
$
        String -> IO ()
forall a. HasCallStack => String -> a
error "GObject.objectGetv : length of 'names' does not agree with that of 'values'."
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr CString
names' <- [Text] -> IO (Ptr CString)
packUTF8CArray [Text]
names
    [Ptr GValue]
values' <- (GValue -> IO (Ptr GValue)) -> [GValue] -> IO [Ptr GValue]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM GValue -> IO (Ptr GValue)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr [GValue]
values
    Ptr GValue
values'' <- Int -> [Ptr GValue] -> IO (Ptr GValue)
forall a. Int -> [Ptr a] -> IO (Ptr a)
packBlockArray 24 [Ptr GValue]
values'
    Ptr Object -> Word32 -> Ptr CString -> Ptr GValue -> IO ()
g_object_getv Ptr Object
object' Word32
nProperties Ptr CString
names' Ptr GValue
values''
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    (GValue -> IO ()) -> [GValue] -> IO ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ GValue -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr [GValue]
values
    (Word32 -> (CString -> IO ()) -> Ptr CString -> IO ()
forall a b c.
(Storable a, Integral b) =>
b -> (a -> IO c) -> Ptr a -> IO ()
mapCArrayWithLength Word32
nProperties) CString -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CString
names'
    Ptr CString -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr CString
names'
    Ptr GValue -> IO ()
forall a. Ptr a -> IO ()
freeMem Ptr GValue
values''
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectGetvMethodInfo
instance (signature ~ ([T.Text] -> [GValue] -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectGetvMethodInfo a signature where
    overloadedMethod _ = objectGetv

#endif

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

foreign import ccall "g_object_is_floating" g_object_is_floating :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO CInt

{- |
Checks whether /@object@/ has a [floating][floating-ref] reference.

/Since: 2.10/
-}
objectIsFloating ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m Bool
    {- ^ __Returns:__ 'True' if /@object@/ has a floating reference -}
objectIsFloating :: a -> m Bool
objectIsFloating object :: a
object = IO Bool -> m Bool
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Bool -> m Bool) -> IO Bool -> m Bool
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CInt
result <- Ptr Object -> IO CInt
g_object_is_floating Ptr Object
object'
    let result' :: Bool
result' = (CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
/= 0) CInt
result
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
result'

#if ENABLE_OVERLOADING
data ObjectIsFloatingMethodInfo
instance (signature ~ (m Bool), MonadIO m, IsObject a) => O.MethodInfo ObjectIsFloatingMethodInfo a signature where
    overloadedMethod _ = objectIsFloating

#endif

-- method Object::notify
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "property_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of a property installed on the class of @object.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_notify" g_object_notify :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- property_name : TBasicType TUTF8
    IO ()

{- |
Emits a \"notify\" signal for the property /@propertyName@/ on /@object@/.

When possible, eg. when signaling a property change from within the class
that registered the property, you should use 'GI.GObject.Objects.Object.objectNotifyByPspec'
instead.

Note that emission of the notify signal may be blocked with
'GI.GObject.Objects.Object.objectFreezeNotify'. In this case, the signal emissions are queued
and will be emitted (in reverse order) when 'GI.GObject.Objects.Object.objectThawNotify' is
called.
-}
objectNotify ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@propertyName@/: the name of a property installed on the class of /@object@/. -}
    -> m ()
objectNotify :: a -> Text -> m ()
objectNotify object :: a
object propertyName :: Text
propertyName = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
propertyName' <- Text -> IO CString
textToCString Text
propertyName
    Ptr Object -> CString -> IO ()
g_object_notify Ptr Object
object' CString
propertyName'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
propertyName'
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectNotifyMethodInfo
instance (signature ~ (T.Text -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectNotifyMethodInfo a signature where
    overloadedMethod _ = objectNotify

#endif

-- method Object::notify_by_pspec
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "pspec", argType = TParamSpec, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GParamSpec of a property installed on the class of @object.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_notify_by_pspec" g_object_notify_by_pspec :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    Ptr GParamSpec ->                       -- pspec : TParamSpec
    IO ()

{- |
Emits a \"notify\" signal for the property specified by /@pspec@/ on /@object@/.

This function omits the property name lookup, hence it is faster than
'GI.GObject.Objects.Object.objectNotify'.

One way to avoid using 'GI.GObject.Objects.Object.objectNotify' from within the
class that registered the properties, and using 'GI.GObject.Objects.Object.objectNotifyByPspec'
instead, is to store the GParamSpec used with
'GI.GObject.Structs.ObjectClass.objectClassInstallProperty' inside a static array, e.g.:


=== /C code/
>
>  enum
>  {
>    PROP_0,
>    PROP_FOO,
>    PROP_LAST
>  };
>
>  static GParamSpec *properties[PROP_LAST];
>
>  static void
>  my_object_class_init (MyObjectClass *klass)
>  {
>    properties[PROP_FOO] = g_param_spec_int ("foo", "Foo", "The foo",
>                                             0, 100,
>                                             50,
>                                             G_PARAM_READWRITE);
>    g_object_class_install_property (gobject_class,
>                                     PROP_FOO,
>                                     properties[PROP_FOO]);
>  }


and then notify a change on the \"foo\" property with:


=== /C code/
>
>  g_object_notify_by_pspec (self, properties[PROP_FOO]);


/Since: 2.26/
-}
objectNotifyByPspec ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> GParamSpec
    {- ^ /@pspec@/: the 'GI.GObject.Objects.ParamSpec.ParamSpec' of a property installed on the class of /@object@/. -}
    -> m ()
objectNotifyByPspec :: a -> GParamSpec -> m ()
objectNotifyByPspec object :: a
object pspec :: GParamSpec
pspec = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr GParamSpec
pspec' <- GParamSpec -> IO (Ptr GParamSpec)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr GParamSpec
pspec
    Ptr Object -> Ptr GParamSpec -> IO ()
g_object_notify_by_pspec Ptr Object
object' Ptr GParamSpec
pspec'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    ObjectNotifyCallback
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr GParamSpec
pspec
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectNotifyByPspecMethodInfo
instance (signature ~ (GParamSpec -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectNotifyByPspecMethodInfo a signature where
    overloadedMethod _ = objectNotifyByPspec

#endif

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

foreign import ccall "g_object_ref" g_object_ref :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO (Ptr Object)

{- |
Increases the reference count of /@object@/.

Since GLib 2.56, if @GLIB_VERSION_MAX_ALLOWED@ is 2.56 or greater, the type
of /@object@/ will be propagated to the return type (using the GCC @/typeof()/@
extension), so any casting the caller needs to do on the return type must be
explicit.
-}
objectRef ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m Object
    {- ^ __Returns:__ the same /@object@/ -}
objectRef :: a -> m Object
objectRef object :: a
object = IO Object -> m Object
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Object -> m Object) -> IO Object -> m Object
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object
result <- Ptr Object -> IO (Ptr Object)
g_object_ref Ptr Object
object'
    Text -> Ptr Object -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectRef" Ptr Object
result
    Object
result' <- ((ManagedPtr Object -> Object) -> Ptr Object -> IO Object
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
newObject ManagedPtr Object -> Object
Object) Ptr Object
result
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Object -> IO Object
forall (m :: * -> *) a. Monad m => a -> m a
return Object
result'

#if ENABLE_OVERLOADING
data ObjectRefMethodInfo
instance (signature ~ (m Object), MonadIO m, IsObject a) => O.MethodInfo ObjectRefMethodInfo a signature where
    overloadedMethod _ = objectRef

#endif

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

foreign import ccall "g_object_ref_sink" g_object_ref_sink :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO (Ptr Object)

{- |
Increase the reference count of /@object@/, and possibly remove the
[floating][floating-ref] reference, if /@object@/ has a floating reference.

In other words, if the object is floating, then this call \"assumes
ownership\" of the floating reference, converting it to a normal
reference by clearing the floating flag while leaving the reference
count unchanged.  If the object is not floating, then this call
adds a new normal reference increasing the reference count by one.

Since GLib 2.56, the type of /@object@/ will be propagated to the return type
under the same conditions as for 'GI.GObject.Objects.Object.objectRef'.

/Since: 2.10/
-}
objectRefSink ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m Object
    {- ^ __Returns:__ /@object@/ -}
objectRefSink :: a -> m Object
objectRefSink object :: a
object = IO Object -> m Object
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Object -> m Object) -> IO Object -> m Object
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object
result <- Ptr Object -> IO (Ptr Object)
g_object_ref_sink Ptr Object
object'
    Text -> Ptr Object -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectRefSink" Ptr Object
result
    Object
result' <- ((ManagedPtr Object -> Object) -> Ptr Object -> IO Object
forall a b.
(HasCallStack, GObject a, GObject b) =>
(ManagedPtr a -> a) -> Ptr b -> IO a
newObject ManagedPtr Object -> Object
Object) Ptr Object
result
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Object -> IO Object
forall (m :: * -> *) a. Monad m => a -> m a
return Object
result'

#if ENABLE_OVERLOADING
data ObjectRefSinkMethodInfo
instance (signature ~ (m Object), MonadIO m, IsObject a) => O.MethodInfo ObjectRefSinkMethodInfo a signature where
    overloadedMethod _ = objectRefSink

#endif

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

foreign import ccall "g_object_run_dispose" g_object_run_dispose :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO ()

{- |
Releases all references to other objects. This can be used to break
reference cycles.

This function should only be called from object system implementations.
-}
objectRunDispose ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m ()
objectRunDispose :: a -> m ()
objectRunDispose object :: a
object = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object -> IO ()
g_object_run_dispose Ptr Object
object'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectRunDisposeMethodInfo
instance (signature ~ (m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectRunDisposeMethodInfo a signature where
    overloadedMethod _ = objectRunDispose

#endif

-- method Object::set_data
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GObject containing the associations.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of the key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "data to associate with that key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_set_data" g_object_set_data :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- key : TBasicType TUTF8
    Ptr () ->                               -- data : TBasicType TPtr
    IO ()

{- |
Each object carries around a table of associations from
strings to pointers.  This function lets you set an association.

If the object already had an association with that name,
the old association will be destroyed.

Internally, the /@key@/ is converted to a @/GQuark/@ using 'GI.GLib.Functions.quarkFromString'.
This means a copy of /@key@/ is kept permanently (even after /@object@/ has been
finalized) — so it is recommended to only use a small, bounded set of values
for /@key@/ in your program, to avoid the @/GQuark/@ storage growing unbounded.
-}
objectSetData ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: 'GI.GObject.Objects.Object.Object' containing the associations. -}
    -> T.Text
    {- ^ /@key@/: name of the key -}
    -> Ptr ()
    {- ^ /@data@/: data to associate with that key -}
    -> m ()
objectSetData :: a -> Text -> Ptr () -> m ()
objectSetData object :: a
object key :: Text
key data_ :: Ptr ()
data_ = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
key' <- Text -> IO CString
textToCString Text
key
    Ptr Object -> CString -> Ptr () -> IO ()
g_object_set_data Ptr Object
object' CString
key' Ptr ()
data_
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
key'
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectSetDataMethodInfo
instance (signature ~ (T.Text -> Ptr () -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectSetDataMethodInfo a signature where
    overloadedMethod _ = objectSetData

#endif

-- method Object::set_data_full
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GObject containing the associations", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of the key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "data to associate with that key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "destroy", argType = TInterface (Name {namespace = "GLib", name = "DestroyNotify"}), direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "function to call when the association is destroyed", sinceVersion = Nothing}, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_set_data_full" g_object_set_data_full :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- key : TBasicType TUTF8
    Ptr () ->                               -- data : TBasicType TPtr
    FunPtr GLib.Callbacks.C_DestroyNotify -> -- destroy : TInterface (Name {namespace = "GLib", name = "DestroyNotify"})
    IO ()

{- |
Like 'GI.GObject.Objects.Object.objectSetData' except it adds notification
for when the association is destroyed, either by setting it
to a different value or when the object is destroyed.

Note that the /@destroy@/ callback is not called if /@data@/ is 'Nothing'.
-}
objectSetDataFull ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: 'GI.GObject.Objects.Object.Object' containing the associations -}
    -> T.Text
    {- ^ /@key@/: name of the key -}
    -> Ptr ()
    {- ^ /@data@/: data to associate with that key -}
    -> Maybe (GLib.Callbacks.DestroyNotify)
    {- ^ /@destroy@/: function to call when the association is destroyed -}
    -> m ()
objectSetDataFull :: a -> Text -> Ptr () -> Maybe (Ptr () -> IO ()) -> m ()
objectSetDataFull object :: a
object key :: Text
key data_ :: Ptr ()
data_ destroy :: Maybe (Ptr () -> IO ())
destroy = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
key' <- Text -> IO CString
textToCString Text
key
    FunPtr (Ptr () -> IO ())
maybeDestroy <- case Maybe (Ptr () -> IO ())
destroy of
        Nothing -> FunPtr (Ptr () -> IO ()) -> IO (FunPtr (Ptr () -> IO ()))
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr Any -> FunPtr (Ptr () -> IO ())
forall a b. Ptr a -> FunPtr b
castPtrToFunPtr Ptr Any
forall a. Ptr a
nullPtr)
        Just jDestroy :: Ptr () -> IO ()
jDestroy -> do
            Ptr (FunPtr (Ptr () -> IO ()))
ptrdestroy <- IO (Ptr (FunPtr (Ptr () -> IO ())))
forall a. Storable a => IO (Ptr a)
callocMem :: IO (Ptr (FunPtr GLib.Callbacks.C_DestroyNotify))
            FunPtr (Ptr () -> IO ())
jDestroy' <- (Ptr () -> IO ()) -> IO (FunPtr (Ptr () -> IO ()))
GLib.Callbacks.mk_DestroyNotify (Maybe (Ptr (FunPtr (Ptr () -> IO ())))
-> (Ptr () -> IO ()) -> Ptr () -> IO ()
GLib.Callbacks.wrap_DestroyNotify (Ptr (FunPtr (Ptr () -> IO ()))
-> Maybe (Ptr (FunPtr (Ptr () -> IO ())))
forall a. a -> Maybe a
Just Ptr (FunPtr (Ptr () -> IO ()))
ptrdestroy) Ptr () -> IO ()
jDestroy)
            Ptr (FunPtr (Ptr () -> IO ())) -> FunPtr (Ptr () -> IO ()) -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr (FunPtr (Ptr () -> IO ()))
ptrdestroy FunPtr (Ptr () -> IO ())
jDestroy'
            FunPtr (Ptr () -> IO ()) -> IO (FunPtr (Ptr () -> IO ()))
forall (m :: * -> *) a. Monad m => a -> m a
return FunPtr (Ptr () -> IO ())
jDestroy'
    Ptr Object
-> CString -> Ptr () -> FunPtr (Ptr () -> IO ()) -> IO ()
g_object_set_data_full Ptr Object
object' CString
key' Ptr ()
data_ FunPtr (Ptr () -> IO ())
maybeDestroy
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
key'
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectSetDataFullMethodInfo
instance (signature ~ (T.Text -> Ptr () -> Maybe (GLib.Callbacks.DestroyNotify) -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectSetDataFullMethodInfo a signature where
    overloadedMethod _ = objectSetDataFull

#endif

-- method Object::set_property
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GObject", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "property_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the name of the property to set", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "value", argType = TInterface (Name {namespace = "GObject", name = "Value"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the value", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_set_property" g_object_set_property :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- property_name : TBasicType TUTF8
    Ptr GValue ->                           -- value : TInterface (Name {namespace = "GObject", name = "Value"})
    IO ()

{- |
Sets a property on an object.
-}
objectSetProperty ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> T.Text
    {- ^ /@propertyName@/: the name of the property to set -}
    -> GValue
    {- ^ /@value@/: the value -}
    -> m ()
objectSetProperty :: a -> Text -> GValue -> m ()
objectSetProperty object :: a
object propertyName :: Text
propertyName value :: GValue
value = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
propertyName' <- Text -> IO CString
textToCString Text
propertyName
    Ptr GValue
value' <- GValue -> IO (Ptr GValue)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr GValue
value
    Ptr Object -> CString -> Ptr GValue -> IO ()
g_object_set_property Ptr Object
object' CString
propertyName' Ptr GValue
value'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    GValue -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr GValue
value
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
propertyName'
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectSetPropertyMethodInfo
instance (signature ~ (T.Text -> GValue -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectSetPropertyMethodInfo a signature where
    overloadedMethod _ = objectSetProperty

#endif

-- method Object::steal_data
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GObject containing the associations", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "key", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of the key", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_object_steal_data" g_object_steal_data :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    CString ->                              -- key : TBasicType TUTF8
    IO (Ptr ())

{- |
Remove a specified datum from the object\'s data associations,
without invoking the association\'s destroy handler.
-}
objectStealData ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: 'GI.GObject.Objects.Object.Object' containing the associations -}
    -> T.Text
    {- ^ /@key@/: name of the key -}
    -> m (Ptr ())
    {- ^ __Returns:__ the data if found, or 'Nothing'
         if no such data exists. -}
objectStealData :: a -> Text -> m (Ptr ())
objectStealData object :: a
object key :: Text
key = IO (Ptr ()) -> m (Ptr ())
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Ptr ()) -> m (Ptr ())) -> IO (Ptr ()) -> m (Ptr ())
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    CString
key' <- Text -> IO CString
textToCString Text
key
    Ptr ()
result <- Ptr Object -> CString -> IO (Ptr ())
g_object_steal_data Ptr Object
object' CString
key'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
key'
    Ptr () -> IO (Ptr ())
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr ()
result

#if ENABLE_OVERLOADING
data ObjectStealDataMethodInfo
instance (signature ~ (T.Text -> m (Ptr ())), MonadIO m, IsObject a) => O.MethodInfo ObjectStealDataMethodInfo a signature where
    overloadedMethod _ = objectStealData

#endif

-- method Object::steal_qdata
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The GObject to get a stored user data pointer from", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "quark", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GQuark, naming the user data pointer", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TPtr)
-- throws : False
-- Skip return : False

foreign import ccall "g_object_steal_qdata" g_object_steal_qdata :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    Word32 ->                               -- quark : TBasicType TUInt32
    IO (Ptr ())

{- |
This function gets back user data pointers stored via
@/g_object_set_qdata()/@ and removes the /@data@/ from object
without invoking its @/destroy()/@ function (if any was
set).
Usually, calling this function is only required to update
user data pointers with a destroy notifier, for example:

=== /C code/
>
>void
>object_add_to_user_list (GObject     *object,
>                         const gchar *new_string)
>{
>  // the quark, naming the object data
>  GQuark quark_string_list = g_quark_from_static_string ("my-string-list");
>  // retrive the old string list
>  GList *list = g_object_steal_qdata (object, quark_string_list);
>
>  // prepend new string
>  list = g_list_prepend (list, g_strdup (new_string));
>  // this changed 'list', so we need to set it again
>  g_object_set_qdata_full (object, quark_string_list, list, free_string_list);
>}
>static void
>free_string_list (gpointer data)
>{
>  GList *node, *list = data;
>
>  for (node = list; node; node = node->next)
>    g_free (node->data);
>  g_list_free (list);
>}

Using 'GI.GObject.Objects.Object.objectGetQdata' in the above example, instead of
'GI.GObject.Objects.Object.objectStealQdata' would have left the destroy function set,
and thus the partial string list would have been freed upon
@/g_object_set_qdata_full()/@.
-}
objectStealQdata ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: The GObject to get a stored user data pointer from -}
    -> Word32
    {- ^ /@quark@/: A @/GQuark/@, naming the user data pointer -}
    -> m (Ptr ())
    {- ^ __Returns:__ The user data pointer set, or 'Nothing' -}
objectStealQdata :: a -> Word32 -> m (Ptr ())
objectStealQdata object :: a
object quark :: Word32
quark = IO (Ptr ()) -> m (Ptr ())
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Ptr ()) -> m (Ptr ())) -> IO (Ptr ()) -> m (Ptr ())
forall a b. (a -> b) -> a -> b
$ do
    Ptr Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr ()
result <- Ptr Object -> Word32 -> IO (Ptr ())
g_object_steal_qdata Ptr Object
object' Word32
quark
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Ptr () -> IO (Ptr ())
forall (m :: * -> *) a. Monad m => a -> m a
return Ptr ()
result

#if ENABLE_OVERLOADING
data ObjectStealQdataMethodInfo
instance (signature ~ (Word32 -> m (Ptr ())), MonadIO m, IsObject a) => O.MethodInfo ObjectStealQdataMethodInfo a signature where
    overloadedMethod _ = objectStealQdata

#endif

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

foreign import ccall "g_object_thaw_notify" g_object_thaw_notify :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO ()

{- |
Reverts the effect of a previous call to
'GI.GObject.Objects.Object.objectFreezeNotify'. The freeze count is decreased on /@object@/
and when it reaches zero, queued \"notify\" signals are emitted.

Duplicate notifications for each property are squashed so that at most one
'GI.GObject.Objects.Object.Object'::@/notify/@ signal is emitted for each property, in the reverse order
in which they have been queued.

It is an error to call this function when the freeze count is zero.
-}
objectThawNotify ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m ()
objectThawNotify :: a -> m ()
objectThawNotify object :: a
object = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object -> IO ()
g_object_thaw_notify Ptr Object
object'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectThawNotifyMethodInfo
instance (signature ~ (m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectThawNotifyMethodInfo a signature where
    overloadedMethod _ = objectThawNotify

#endif

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

foreign import ccall "g_object_unref" g_object_unref :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    IO ()

{- |
Decreases the reference count of /@object@/. When its reference count
drops to 0, the object is finalized (i.e. its memory is freed).

If the pointer to the 'GI.GObject.Objects.Object.Object' may be reused in future (for example, if it is
an instance variable of another object), it is recommended to clear the
pointer to 'Nothing' rather than retain a dangling pointer to a potentially
invalid 'GI.GObject.Objects.Object.Object' instance. Use @/g_clear_object()/@ for this.
-}
objectUnref ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: a 'GI.GObject.Objects.Object.Object' -}
    -> m ()
objectUnref :: a -> m ()
objectUnref object :: a
object = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Object -> IO ()
g_object_unref Ptr Object
object'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectUnrefMethodInfo
instance (signature ~ (m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectUnrefMethodInfo a signature where
    overloadedMethod _ = objectUnref

#endif

-- method Object::watch_closure
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "object", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GObject restricting lifetime of @closure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "closure", argType = TInterface (Name {namespace = "GObject", name = "Closure"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "#GClosure to watch", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_watch_closure" g_object_watch_closure :: 
    Ptr Object ->                           -- object : TInterface (Name {namespace = "GObject", name = "Object"})
    Ptr Closure ->                          -- closure : TInterface (Name {namespace = "GObject", name = "Closure"})
    IO ()

{- |
This function essentially limits the life time of the /@closure@/ to
the life time of the object. That is, when the object is finalized,
the /@closure@/ is invalidated by calling 'GI.GObject.Structs.Closure.closureInvalidate' on
it, in order to prevent invocations of the closure with a finalized
(nonexisting) object. Also, 'GI.GObject.Objects.Object.objectRef' and 'GI.GObject.Objects.Object.objectUnref' are
added as marshal guards to the /@closure@/, to ensure that an extra
reference count is held on /@object@/ during invocation of the
/@closure@/.  Usually, this function will be called on closures that
use this /@object@/ as closure data.
-}
objectWatchClosure ::
    (B.CallStack.HasCallStack, MonadIO m, IsObject a) =>
    a
    {- ^ /@object@/: 'GI.GObject.Objects.Object.Object' restricting lifetime of /@closure@/ -}
    -> Closure
    {- ^ /@closure@/: 'GI.GObject.Structs.Closure.Closure' to watch -}
    -> m ()
objectWatchClosure :: a -> Closure -> m ()
objectWatchClosure object :: a
object closure :: Closure
closure = 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 Object
object' <- a -> IO (Ptr Object)
forall a b. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr b)
unsafeManagedPtrCastPtr a
object
    Ptr Closure
closure' <- Closure -> IO (Ptr Closure)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr Closure
closure
    Ptr Object -> Ptr Closure -> IO ()
g_object_watch_closure Ptr Object
object' Ptr Closure
closure'
    a -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr a
object
    Closure -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr Closure
closure
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
data ObjectWatchClosureMethodInfo
instance (signature ~ (Closure -> m ()), MonadIO m, IsObject a) => O.MethodInfo ObjectWatchClosureMethodInfo a signature where
    overloadedMethod _ = objectWatchClosure

#endif

-- method Object::compat_control
-- method type : MemberFunction
-- Args : [Arg {argCName = "what", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Nothing, sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Nothing, sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUInt64)
-- throws : False
-- Skip return : False

foreign import ccall "g_object_compat_control" g_object_compat_control :: 
    Word64 ->                               -- what : TBasicType TUInt64
    Ptr () ->                               -- data : TBasicType TPtr
    IO Word64

{- |
/No description available in the introspection data./
-}
objectCompatControl ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Word64
    -> Ptr ()
    -> m Word64
objectCompatControl :: CGType -> Ptr () -> m CGType
objectCompatControl what :: CGType
what data_ :: Ptr ()
data_ = IO CGType -> m CGType
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO CGType -> m CGType) -> IO CGType -> m CGType
forall a b. (a -> b) -> a -> b
$ do
    CGType
result <- CGType -> Ptr () -> IO CGType
g_object_compat_control CGType
what Ptr ()
data_
    CGType -> IO CGType
forall (m :: * -> *) a. Monad m => a -> m a
return CGType
result

#if ENABLE_OVERLOADING
#endif

-- method Object::interface_find_property
-- method type : MemberFunction
-- Args : [Arg {argCName = "g_iface", argType = TInterface (Name {namespace = "GObject", name = "TypeInterface"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "any interface vtable for the\n interface, or the default vtable for the interface", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "property_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "name of a property to look up.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just TParamSpec
-- throws : False
-- Skip return : False

foreign import ccall "g_object_interface_find_property" g_object_interface_find_property :: 
    Ptr GObject.TypeInterface.TypeInterface -> -- g_iface : TInterface (Name {namespace = "GObject", name = "TypeInterface"})
    CString ->                              -- property_name : TBasicType TUTF8
    IO (Ptr GParamSpec)

{- |
Find the 'GI.GObject.Objects.ParamSpec.ParamSpec' with the given name for an
interface. Generally, the interface vtable passed in as /@gIface@/
will be the default vtable from 'GI.GObject.Functions.typeDefaultInterfaceRef', or,
if you know the interface has already been loaded,
'GI.GObject.Functions.typeDefaultInterfacePeek'.

/Since: 2.4/
-}
objectInterfaceFindProperty ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GObject.TypeInterface.TypeInterface
    {- ^ /@gIface@/: any interface vtable for the
 interface, or the default vtable for the interface -}
    -> T.Text
    {- ^ /@propertyName@/: name of a property to look up. -}
    -> m GParamSpec
    {- ^ __Returns:__ the 'GI.GObject.Objects.ParamSpec.ParamSpec' for the property of the
         interface with the name /@propertyName@/, or 'Nothing' if no
         such property exists. -}
objectInterfaceFindProperty :: TypeInterface -> Text -> m GParamSpec
objectInterfaceFindProperty gIface :: TypeInterface
gIface propertyName :: Text
propertyName = IO GParamSpec -> m GParamSpec
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO GParamSpec -> m GParamSpec) -> IO GParamSpec -> m GParamSpec
forall a b. (a -> b) -> a -> b
$ do
    Ptr TypeInterface
gIface' <- TypeInterface -> IO (Ptr TypeInterface)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr TypeInterface
gIface
    CString
propertyName' <- Text -> IO CString
textToCString Text
propertyName
    Ptr GParamSpec
result <- Ptr TypeInterface -> CString -> IO (Ptr GParamSpec)
g_object_interface_find_property Ptr TypeInterface
gIface' CString
propertyName'
    Text -> Ptr GParamSpec -> IO ()
forall a. HasCallStack => Text -> Ptr a -> IO ()
checkUnexpectedReturnNULL "objectInterfaceFindProperty" Ptr GParamSpec
result
    GParamSpec
result' <- Ptr GParamSpec -> IO GParamSpec
B.GParamSpec.newGParamSpecFromPtr Ptr GParamSpec
result
    TypeInterface -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr TypeInterface
gIface
    CString -> IO ()
forall a. Ptr a -> IO ()
freeMem CString
propertyName'
    GParamSpec -> IO GParamSpec
forall (m :: * -> *) a. Monad m => a -> m a
return GParamSpec
result'

#if ENABLE_OVERLOADING
#endif

-- method Object::interface_install_property
-- method type : MemberFunction
-- Args : [Arg {argCName = "g_iface", argType = TInterface (Name {namespace = "GObject", name = "TypeInterface"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "any interface vtable for the\n   interface, or the default\n vtable for the interface.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "pspec", argType = TParamSpec, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the #GParamSpec for the new property", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "g_object_interface_install_property" g_object_interface_install_property :: 
    Ptr GObject.TypeInterface.TypeInterface -> -- g_iface : TInterface (Name {namespace = "GObject", name = "TypeInterface"})
    Ptr GParamSpec ->                       -- pspec : TParamSpec
    IO ()

{- |
Add a property to an interface; this is only useful for interfaces
that are added to GObject-derived types. Adding a property to an
interface forces all objects classes with that interface to have a
compatible property. The compatible property could be a newly
created 'GI.GObject.Objects.ParamSpec.ParamSpec', but normally
'GI.GObject.Structs.ObjectClass.objectClassOverrideProperty' will be used so that the object
class only needs to provide an implementation and inherits the
property description, default value, bounds, and so forth from the
interface property.

This function is meant to be called from the interface\'s default
vtable initialization function (the /@classInit@/ member of
'GI.GObject.Structs.TypeInfo.TypeInfo'.) It must not be called after after /@classInit@/ has
been called for any object types implementing this interface.

If /@pspec@/ is a floating reference, it will be consumed.

/Since: 2.4/
-}
objectInterfaceInstallProperty ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    GObject.TypeInterface.TypeInterface
    {- ^ /@gIface@/: any interface vtable for the
   interface, or the default
 vtable for the interface. -}
    -> GParamSpec
    {- ^ /@pspec@/: the 'GI.GObject.Objects.ParamSpec.ParamSpec' for the new property -}
    -> m ()
objectInterfaceInstallProperty :: TypeInterface -> GParamSpec -> m ()
objectInterfaceInstallProperty gIface :: TypeInterface
gIface pspec :: GParamSpec
pspec = 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 TypeInterface
gIface' <- TypeInterface -> IO (Ptr TypeInterface)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr TypeInterface
gIface
    Ptr GParamSpec
pspec' <- GParamSpec -> IO (Ptr GParamSpec)
forall a. (HasCallStack, ManagedPtrNewtype a) => a -> IO (Ptr a)
unsafeManagedPtrGetPtr GParamSpec
pspec
    Ptr TypeInterface -> Ptr GParamSpec -> IO ()
g_object_interface_install_property Ptr TypeInterface
gIface' Ptr GParamSpec
pspec'
    TypeInterface -> IO ()
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr TypeInterface
gIface
    ObjectNotifyCallback
forall a. ManagedPtrNewtype a => a -> IO ()
touchManagedPtr GParamSpec
pspec
    () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()

#if ENABLE_OVERLOADING
#endif

-- XXX Could not generate method Object::interface_list_properties
-- Error was : Not implemented: "unpackCArray : Don't know how to unpack C Array of type TParamSpec"
#if ENABLE_OVERLOADING
-- XXX: Dummy instance, since code generation failed.
-- Please file a bug at http://github.com/haskell-gi/haskell-gi.
data ObjectInterfaceListPropertiesMethodInfo
instance (p ~ (), o ~ O.MethodResolutionFailed "interfaceListProperties" Object) => O.MethodInfo ObjectInterfaceListPropertiesMethodInfo o p where
    overloadedMethod _ = undefined
#endif