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

/No description available in the introspection data./
-}

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

module GI.WebKit2WebExtension.Interfaces.DOMEventTarget
    (

-- * Exported types
    DOMEventTarget(..)                      ,
    noDOMEventTarget                        ,
    IsDOMEventTarget                        ,
    toDOMEventTarget                        ,


 -- * Methods
-- ** addEventListener #method:addEventListener#

#if ENABLE_OVERLOADING
    DOMEventTargetAddEventListenerMethodInfo,
#endif
    dOMEventTargetAddEventListener          ,


-- ** dispatchEvent #method:dispatchEvent#

#if ENABLE_OVERLOADING
    DOMEventTargetDispatchEventMethodInfo   ,
#endif
    dOMEventTargetDispatchEvent             ,


-- ** removeEventListener #method:removeEventListener#

#if ENABLE_OVERLOADING
    DOMEventTargetRemoveEventListenerMethodInfo,
#endif
    dOMEventTargetRemoveEventListener       ,




    ) where

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

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

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.WebKit2WebExtension.Objects.DOMEvent as WebKit2WebExtension.DOMEvent

-- interface DOMEventTarget 
-- | Memory-managed wrapper type.
newtype DOMEventTarget = DOMEventTarget (ManagedPtr DOMEventTarget)
-- | A convenience alias for `Nothing` :: `Maybe` `DOMEventTarget`.
noDOMEventTarget :: Maybe DOMEventTarget
noDOMEventTarget = Nothing

#if ENABLE_OVERLOADING
type instance O.SignalList DOMEventTarget = DOMEventTargetSignalList
type DOMEventTargetSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

foreign import ccall "webkit_dom_event_target_get_type"
    c_webkit_dom_event_target_get_type :: IO GType

instance GObject DOMEventTarget where
    gobjectType = c_webkit_dom_event_target_get_type


-- | Type class for types which can be safely cast to `DOMEventTarget`, for instance with `toDOMEventTarget`.
class (GObject o, O.IsDescendantOf DOMEventTarget o) => IsDOMEventTarget o
instance (GObject o, O.IsDescendantOf DOMEventTarget o) => IsDOMEventTarget o

instance O.HasParentTypes DOMEventTarget
type instance O.ParentTypes DOMEventTarget = '[GObject.Object.Object]

-- | Cast to `DOMEventTarget`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toDOMEventTarget :: (MonadIO m, IsDOMEventTarget o) => o -> m DOMEventTarget
toDOMEventTarget = liftIO . unsafeCastTo DOMEventTarget

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

#if ENABLE_OVERLOADING
#endif

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

instance (info ~ ResolveDOMEventTargetMethod t DOMEventTarget, O.MethodInfo info DOMEventTarget p) => OL.IsLabel t (DOMEventTarget -> 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

-- method DOMEventTarget::add_event_listener
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gchar", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "handler", argType = TGClosure Nothing, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GClosure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "use_capture", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gboolean", 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 "webkit_dom_event_target_add_event_listener_with_closure" webkit_dom_event_target_add_event_listener_with_closure ::
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    CString ->                              -- event_name : TBasicType TUTF8
    Ptr (GClosure ()) ->                    -- handler : TGClosure Nothing
    CInt ->                                 -- use_capture : TBasicType TBoolean
    IO CInt

{-# DEPRECATED dOMEventTargetAddEventListener ["(Since version 2.22)","Use JavaScriptCore API instead"] #-}
{- |
Version of @/webkit_dom_event_target_add_event_listener()/@ using a closure
instead of a callbacks for easier binding in other languages.
-}
dOMEventTargetAddEventListener ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> T.Text
    {- ^ /@eventName@/: A @/gchar/@ -}
    -> GClosure b
    {- ^ /@handler@/: A 'GI.GObject.Structs.Closure.Closure' -}
    -> Bool
    {- ^ /@useCapture@/: A 'Bool' -}
    -> m Bool
    {- ^ __Returns:__ a 'Bool' -}
dOMEventTargetAddEventListener target eventName handler useCapture = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    eventName' <- textToCString eventName
    handler' <- unsafeManagedPtrCastPtr handler
    let useCapture' = (fromIntegral . fromEnum) useCapture
    result <- webkit_dom_event_target_add_event_listener_with_closure target' eventName' handler' useCapture'
    let result' = (/= 0) result
    touchManagedPtr target
    touchManagedPtr handler
    freeMem eventName'
    return result'

#if ENABLE_OVERLOADING
data DOMEventTargetAddEventListenerMethodInfo
instance (signature ~ (T.Text -> GClosure b -> Bool -> m Bool), MonadIO m, IsDOMEventTarget a) => O.MethodInfo DOMEventTargetAddEventListenerMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetAddEventListener

#endif

-- method DOMEventTarget::dispatch_event
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEvent"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEvent", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TBoolean)
-- throws : True
-- Skip return : False

foreign import ccall "webkit_dom_event_target_dispatch_event" webkit_dom_event_target_dispatch_event ::
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    Ptr WebKit2WebExtension.DOMEvent.DOMEvent -> -- event : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEvent"})
    Ptr (Ptr GError) ->                     -- error
    IO CInt

{-# DEPRECATED dOMEventTargetDispatchEvent ["(Since version 2.22)","Use JavaScriptCore API instead"] #-}
{- |
/No description available in the introspection data./
-}
dOMEventTargetDispatchEvent ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a, WebKit2WebExtension.DOMEvent.IsDOMEvent b) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> b
    {- ^ /@event@/: A 'GI.WebKit2WebExtension.Objects.DOMEvent.DOMEvent' -}
    -> m ()
    {- ^ /(Can throw 'Data.GI.Base.GError.GError')/ -}
dOMEventTargetDispatchEvent target event = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    event' <- unsafeManagedPtrCastPtr event
    onException (do
        _ <- propagateGError $ webkit_dom_event_target_dispatch_event target' event'
        touchManagedPtr target
        touchManagedPtr event
        return ()
     ) (do
        return ()
     )

#if ENABLE_OVERLOADING
data DOMEventTargetDispatchEventMethodInfo
instance (signature ~ (b -> m ()), MonadIO m, IsDOMEventTarget a, WebKit2WebExtension.DOMEvent.IsDOMEvent b) => O.MethodInfo DOMEventTargetDispatchEventMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetDispatchEvent

#endif

-- method DOMEventTarget::remove_event_listener
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "target", argType = TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #WebKitDOMEventTarget", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event_name", argType = TBasicType TUTF8, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gchar", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "handler", argType = TGClosure Nothing, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GClosure", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "use_capture", argType = TBasicType TBoolean, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #gboolean", 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 "webkit_dom_event_target_remove_event_listener_with_closure" webkit_dom_event_target_remove_event_listener_with_closure ::
    Ptr DOMEventTarget ->                   -- target : TInterface (Name {namespace = "WebKit2WebExtension", name = "DOMEventTarget"})
    CString ->                              -- event_name : TBasicType TUTF8
    Ptr (GClosure ()) ->                    -- handler : TGClosure Nothing
    CInt ->                                 -- use_capture : TBasicType TBoolean
    IO CInt

{-# DEPRECATED dOMEventTargetRemoveEventListener ["(Since version 2.22)","Use JavaScriptCore API instead"] #-}
{- |
Version of @/webkit_dom_event_target_remove_event_listener()/@ using a closure
instead of a callbacks for easier binding in other languages.
-}
dOMEventTargetRemoveEventListener ::
    (B.CallStack.HasCallStack, MonadIO m, IsDOMEventTarget a) =>
    a
    {- ^ /@target@/: A 'GI.WebKit2WebExtension.Interfaces.DOMEventTarget.DOMEventTarget' -}
    -> T.Text
    {- ^ /@eventName@/: A @/gchar/@ -}
    -> GClosure b
    {- ^ /@handler@/: A 'GI.GObject.Structs.Closure.Closure' -}
    -> Bool
    {- ^ /@useCapture@/: A 'Bool' -}
    -> m Bool
    {- ^ __Returns:__ a 'Bool' -}
dOMEventTargetRemoveEventListener target eventName handler useCapture = liftIO $ do
    target' <- unsafeManagedPtrCastPtr target
    eventName' <- textToCString eventName
    handler' <- unsafeManagedPtrCastPtr handler
    let useCapture' = (fromIntegral . fromEnum) useCapture
    result <- webkit_dom_event_target_remove_event_listener_with_closure target' eventName' handler' useCapture'
    let result' = (/= 0) result
    touchManagedPtr target
    touchManagedPtr handler
    freeMem eventName'
    return result'

#if ENABLE_OVERLOADING
data DOMEventTargetRemoveEventListenerMethodInfo
instance (signature ~ (T.Text -> GClosure b -> Bool -> m Bool), MonadIO m, IsDOMEventTarget a) => O.MethodInfo DOMEventTargetRemoveEventListenerMethodInfo a signature where
    overloadedMethod _ = dOMEventTargetRemoveEventListener

#endif