{- |
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 GInitiallyUnowned structure
are private to the 'GI.GObject.Objects.InitiallyUnowned.InitiallyUnowned' implementation and should never be
accessed directly.
-}

module GI.GObject.Objects.InitiallyUnowned
    ( 

-- * Exported types
    InitiallyUnowned(..)                    ,
    IsInitiallyUnowned                      ,
    toInitiallyUnowned                      ,
    noInitiallyUnowned                      ,


    ) 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.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 {-# SOURCE #-} qualified GI.GObject.Objects.Object as GObject.Object

newtype InitiallyUnowned = InitiallyUnowned (ManagedPtr InitiallyUnowned)
foreign import ccall "g_initially_unowned_get_type"
    c_g_initially_unowned_get_type :: IO GType

instance GObject InitiallyUnowned where
    gobjectType _ = c_g_initially_unowned_get_type
    

class GObject o => IsInitiallyUnowned o
#if MIN_VERSION_base(4,9,0)
instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError InitiallyUnowned a) =>
    IsInitiallyUnowned a
#endif
instance IsInitiallyUnowned InitiallyUnowned
instance GObject.Object.IsObject InitiallyUnowned

toInitiallyUnowned :: IsInitiallyUnowned o => o -> IO InitiallyUnowned
toInitiallyUnowned = unsafeCastTo InitiallyUnowned

noInitiallyUnowned :: Maybe InitiallyUnowned
noInitiallyUnowned = Nothing

type family ResolveInitiallyUnownedMethod (t :: Symbol) (o :: *) :: * where
    ResolveInitiallyUnownedMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveInitiallyUnownedMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveInitiallyUnownedMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveInitiallyUnownedMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveInitiallyUnownedMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveInitiallyUnownedMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveInitiallyUnownedMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveInitiallyUnownedMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveInitiallyUnownedMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveInitiallyUnownedMethod "replaceData" o = GObject.Object.ObjectReplaceDataMethodInfo
    ResolveInitiallyUnownedMethod "replaceQdata" o = GObject.Object.ObjectReplaceQdataMethodInfo
    ResolveInitiallyUnownedMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveInitiallyUnownedMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveInitiallyUnownedMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveInitiallyUnownedMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveInitiallyUnownedMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveInitiallyUnownedMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveInitiallyUnownedMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveInitiallyUnownedMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveInitiallyUnownedMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveInitiallyUnownedMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveInitiallyUnownedMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveInitiallyUnownedMethod l o = O.MethodResolutionFailed l o

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

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

instance O.HasAttributeList InitiallyUnowned
type instance O.AttributeList InitiallyUnowned = InitiallyUnownedAttributeList
type InitiallyUnownedAttributeList = ('[ ] :: [(Symbol, *)])

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