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

module GI.Gtk.Objects.EventController
    ( 

-- * Exported types
    EventController(..)                     ,
    EventControllerK                        ,
    toEventController                       ,
    noEventController                       ,


 -- * Methods
-- ** eventControllerGetPropagationPhase
    eventControllerGetPropagationPhase      ,


-- ** eventControllerGetWidget
    eventControllerGetWidget                ,


-- ** eventControllerHandleEvent
    eventControllerHandleEvent              ,


-- ** eventControllerReset
    eventControllerReset                    ,


-- ** eventControllerSetPropagationPhase
    eventControllerSetPropagationPhase      ,




 -- * Properties
-- ** PropagationPhase
    EventControllerPropagationPhasePropertyInfo,
    constructEventControllerPropagationPhase,
    getEventControllerPropagationPhase      ,
    setEventControllerPropagationPhase      ,


-- ** Widget
    EventControllerWidgetPropertyInfo       ,
    constructEventControllerWidget          ,
    getEventControllerWidget                ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.Gtk.Types
import GI.Gtk.Callbacks
import qualified GI.GObject as GObject
import qualified GI.Gdk as Gdk

newtype EventController = EventController (ForeignPtr EventController)
foreign import ccall "gtk_event_controller_get_type"
    c_gtk_event_controller_get_type :: IO GType

type instance ParentTypes EventController = EventControllerParentTypes
type EventControllerParentTypes = '[GObject.Object]

instance GObject EventController where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_gtk_event_controller_get_type
    

class GObject o => EventControllerK o
instance (GObject o, IsDescendantOf EventController o) => EventControllerK o

toEventController :: EventControllerK o => o -> IO EventController
toEventController = unsafeCastTo EventController

noEventController :: Maybe EventController
noEventController = Nothing

-- VVV Prop "propagation-phase"
   -- Type: TInterface "Gtk" "PropagationPhase"
   -- Flags: [PropertyReadable,PropertyWritable]

getEventControllerPropagationPhase :: (MonadIO m, EventControllerK o) => o -> m PropagationPhase
getEventControllerPropagationPhase obj = liftIO $ getObjectPropertyEnum obj "propagation-phase"

setEventControllerPropagationPhase :: (MonadIO m, EventControllerK o) => o -> PropagationPhase -> m ()
setEventControllerPropagationPhase obj val = liftIO $ setObjectPropertyEnum obj "propagation-phase" val

constructEventControllerPropagationPhase :: PropagationPhase -> IO ([Char], GValue)
constructEventControllerPropagationPhase val = constructObjectPropertyEnum "propagation-phase" val

data EventControllerPropagationPhasePropertyInfo
instance AttrInfo EventControllerPropagationPhasePropertyInfo where
    type AttrAllowedOps EventControllerPropagationPhasePropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint EventControllerPropagationPhasePropertyInfo = (~) PropagationPhase
    type AttrBaseTypeConstraint EventControllerPropagationPhasePropertyInfo = EventControllerK
    type AttrGetType EventControllerPropagationPhasePropertyInfo = PropagationPhase
    type AttrLabel EventControllerPropagationPhasePropertyInfo = "EventController::propagation-phase"
    attrGet _ = getEventControllerPropagationPhase
    attrSet _ = setEventControllerPropagationPhase
    attrConstruct _ = constructEventControllerPropagationPhase

-- VVV Prop "widget"
   -- Type: TInterface "Gtk" "Widget"
   -- Flags: [PropertyReadable,PropertyWritable,PropertyConstructOnly]

getEventControllerWidget :: (MonadIO m, EventControllerK o) => o -> m Widget
getEventControllerWidget obj = liftIO $ getObjectPropertyObject obj "widget" Widget

constructEventControllerWidget :: (WidgetK a) => a -> IO ([Char], GValue)
constructEventControllerWidget val = constructObjectPropertyObject "widget" val

data EventControllerWidgetPropertyInfo
instance AttrInfo EventControllerWidgetPropertyInfo where
    type AttrAllowedOps EventControllerWidgetPropertyInfo = '[ 'AttrConstruct, 'AttrGet]
    type AttrSetTypeConstraint EventControllerWidgetPropertyInfo = WidgetK
    type AttrBaseTypeConstraint EventControllerWidgetPropertyInfo = EventControllerK
    type AttrGetType EventControllerWidgetPropertyInfo = Widget
    type AttrLabel EventControllerWidgetPropertyInfo = "EventController::widget"
    attrGet _ = getEventControllerWidget
    attrSet _ = undefined
    attrConstruct _ = constructEventControllerWidget

type instance AttributeList EventController = EventControllerAttributeList
type EventControllerAttributeList = ('[ '("propagation-phase", EventControllerPropagationPhasePropertyInfo), '("widget", EventControllerWidgetPropertyInfo)] :: [(Symbol, *)])

type instance SignalList EventController = EventControllerSignalList
type EventControllerSignalList = ('[ '("notify", GObject.ObjectNotifySignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

-- method EventController::get_propagation_phase
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gtk" "PropagationPhase"
-- throws : False
-- Skip return : False

foreign import ccall "gtk_event_controller_get_propagation_phase" gtk_event_controller_get_propagation_phase :: 
    Ptr EventController ->                  -- _obj : TInterface "Gtk" "EventController"
    IO CUInt


eventControllerGetPropagationPhase ::
    (MonadIO m, EventControllerK a) =>
    a ->                                    -- _obj
    m PropagationPhase
eventControllerGetPropagationPhase _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- gtk_event_controller_get_propagation_phase _obj'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr _obj
    return result'

-- method EventController::get_widget
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "Gtk" "Widget"
-- throws : False
-- Skip return : False

foreign import ccall "gtk_event_controller_get_widget" gtk_event_controller_get_widget :: 
    Ptr EventController ->                  -- _obj : TInterface "Gtk" "EventController"
    IO (Ptr Widget)


eventControllerGetWidget ::
    (MonadIO m, EventControllerK a) =>
    a ->                                    -- _obj
    m Widget
eventControllerGetWidget _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    result <- gtk_event_controller_get_widget _obj'
    checkUnexpectedReturnNULL "gtk_event_controller_get_widget" result
    result' <- (newObject Widget) result
    touchManagedPtr _obj
    return result'

-- method EventController::handle_event
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "event", argType = TInterface "Gdk" "Event", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "event", argType = TInterface "Gdk" "Event", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TBoolean
-- throws : False
-- Skip return : False

foreign import ccall "gtk_event_controller_handle_event" gtk_event_controller_handle_event :: 
    Ptr EventController ->                  -- _obj : TInterface "Gtk" "EventController"
    Ptr Gdk.Event ->                        -- event : TInterface "Gdk" "Event"
    IO CInt


eventControllerHandleEvent ::
    (MonadIO m, EventControllerK a) =>
    a ->                                    -- _obj
    Gdk.Event ->                            -- event
    m Bool
eventControllerHandleEvent _obj event = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let event' = unsafeManagedPtrGetPtr event
    result <- gtk_event_controller_handle_event _obj' event'
    let result' = (/= 0) result
    touchManagedPtr _obj
    touchManagedPtr event
    return result'

-- method EventController::reset
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gtk_event_controller_reset" gtk_event_controller_reset :: 
    Ptr EventController ->                  -- _obj : TInterface "Gtk" "EventController"
    IO ()


eventControllerReset ::
    (MonadIO m, EventControllerK a) =>
    a ->                                    -- _obj
    m ()
eventControllerReset _obj = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    gtk_event_controller_reset _obj'
    touchManagedPtr _obj
    return ()

-- method EventController::set_propagation_phase
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "phase", argType = TInterface "Gtk" "PropagationPhase", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "Gtk" "EventController", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "phase", argType = TInterface "Gtk" "PropagationPhase", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "gtk_event_controller_set_propagation_phase" gtk_event_controller_set_propagation_phase :: 
    Ptr EventController ->                  -- _obj : TInterface "Gtk" "EventController"
    CUInt ->                                -- phase : TInterface "Gtk" "PropagationPhase"
    IO ()


eventControllerSetPropagationPhase ::
    (MonadIO m, EventControllerK a) =>
    a ->                                    -- _obj
    PropagationPhase ->                     -- phase
    m ()
eventControllerSetPropagationPhase _obj phase = liftIO $ do
    let _obj' = unsafeManagedPtrCastPtr _obj
    let phase' = (fromIntegral . fromEnum) phase
    gtk_event_controller_set_propagation_phase _obj' phase'
    touchManagedPtr _obj
    return ()