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

    Monitors a file or directory for changes.

    To obtain a 'GI.Gio.Objects.FileMonitor.FileMonitor' for a file or directory, use
    'GI.Gio.Interfaces.File.fileMonitor', 'GI.Gio.Interfaces.File.fileMonitorFile', or
    'GI.Gio.Interfaces.File.fileMonitorDirectory'.

    To get informed about changes to the file or directory you are
    monitoring, connect to the 'GI.Gio.Objects.FileMonitor.FileMonitor'::@/changed/@ signal. The
    signal will be emitted in the
    [thread-default main context][g-main-context-push-thread-default]
    of the thread that the monitor was created in
    (though if the global default main context is blocked, this may
    cause notifications to be blocked even if the thread-default
    context is still running).
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Gio.Objects.FileMonitor
        (

    -- * Exported types
        FileMonitor(..)                         ,
        IsFileMonitor                           ,
        toFileMonitor                           ,
        noFileMonitor                           ,

     -- * Methods
    -- ** cancel #method:cancel#

    #if ENABLE_OVERLOADING
        FileMonitorCancelMethodInfo             ,
    #endif
        fileMonitorCancel                       ,

    -- ** emitEvent #method:emitEvent#

    #if ENABLE_OVERLOADING
        FileMonitorEmitEventMethodInfo          ,
    #endif
        fileMonitorEmitEvent                    ,

    -- ** isCancelled #method:isCancelled#

    #if ENABLE_OVERLOADING
        FileMonitorIsCancelledMethodInfo        ,
    #endif
        fileMonitorIsCancelled                  ,

    -- ** setRateLimit #method:setRateLimit#

    #if ENABLE_OVERLOADING
        FileMonitorSetRateLimitMethodInfo       ,
    #endif
        fileMonitorSetRateLimit                 ,

     -- * Properties
    -- ** cancelled #attr:cancelled#
    {- | /No description available in the introspection data./
    -}
    #if ENABLE_OVERLOADING
        FileMonitorCancelledPropertyInfo        ,
    #endif
    #if ENABLE_OVERLOADING
        fileMonitorCancelled                    ,
    #endif
        getFileMonitorCancelled                 ,

    -- ** rateLimit #attr:rateLimit#
    {- | /No description available in the introspection data./
    -}
    #if ENABLE_OVERLOADING
        FileMonitorRateLimitPropertyInfo        ,
    #endif
        constructFileMonitorRateLimit           ,
    #if ENABLE_OVERLOADING
        fileMonitorRateLimit                    ,
    #endif
        getFileMonitorRateLimit                 ,
        setFileMonitorRateLimit                 ,

     -- * Signals
    -- ** changed #signal:changed#

        C_FileMonitorChangedCallback            ,
        FileMonitorChangedCallback              ,
    #if ENABLE_OVERLOADING
        FileMonitorChangedSignalInfo            ,
    #endif
        afterFileMonitorChanged                 ,
        genClosure_FileMonitorChanged           ,
        mk_FileMonitorChangedCallback           ,
        noFileMonitorChangedCallback            ,
        onFileMonitorChanged                    ,
        wrap_FileMonitorChangedCallback         ,

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

    -- | Memory-managed wrapper type.
    newtype FileMonitor = FileMonitor (ManagedPtr FileMonitor)
    foreign import ccall "g_file_monitor_get_type"
        c_g_file_monitor_get_type :: IO GType

    instance GObject FileMonitor where
        gobjectType _ = c_g_file_monitor_get_type

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

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

    -- | A convenience alias for `Nothing` :: `Maybe` `FileMonitor`.
    noFileMonitor :: Maybe FileMonitor
    noFileMonitor = Nothing

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

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveFileMonitorMethod t FileMonitor, O.MethodInfo info FileMonitor p) => O.IsLabel t (FileMonitor -> 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 FileMonitor::changed
    {- |
    Emitted when /@file@/ has been changed.

    If using 'GI.Gio.Flags.FileMonitorFlagsWatchMoves' on a directory monitor, and
    the information is available (and if supported by the backend),
    /@eventType@/ may be 'GI.Gio.Enums.FileMonitorEventRenamed',
    'GI.Gio.Enums.FileMonitorEventMovedIn' or 'GI.Gio.Enums.FileMonitorEventMovedOut'.

    In all cases /@file@/ will be a child of the monitored directory.  For
    renames, /@file@/ will be the old name and /@otherFile@/ is the new
    name.  For \"moved in\" events, /@file@/ is the name of the file that
    appeared and /@otherFile@/ is the old name that it was moved from (in
    another directory).  For \"moved out\" events, /@file@/ is the name of
    the file that used to be in this directory and /@otherFile@/ is the
    name of the file at its new location.

    It makes sense to treat 'GI.Gio.Enums.FileMonitorEventMovedIn' as
    equivalent to 'GI.Gio.Enums.FileMonitorEventCreated' and
    'GI.Gio.Enums.FileMonitorEventMovedOut' as equivalent to
    'GI.Gio.Enums.FileMonitorEventDeleted', with extra information.
    'GI.Gio.Enums.FileMonitorEventRenamed' is equivalent to a delete\/create
    pair.  This is exactly how the events will be reported in the case
    that the 'GI.Gio.Flags.FileMonitorFlagsWatchMoves' flag is not in use.

    If using the deprecated flag 'GI.Gio.Flags.FileMonitorFlagsSendMoved' flag and /@eventType@/ is
    @/G_FILE_MONITOR_EVENT_MOVED/@, /@file@/ will be set to a 'GI.Gio.Interfaces.File.File' containing the
    old path, and /@otherFile@/ will be set to a 'GI.Gio.Interfaces.File.File' containing the new path.

    In all the other cases, /@otherFile@/ will be set to @/NULL/@.
    -}
    type FileMonitorChangedCallback =
        Gio.File.File
        {- ^ /@file@/: a 'GI.Gio.Interfaces.File.File'. -}
        -> Maybe Gio.File.File
        {- ^ /@otherFile@/: a 'GI.Gio.Interfaces.File.File' or @/NULL/@. -}
        -> Gio.Enums.FileMonitorEvent
        {- ^ /@eventType@/: a 'GI.Gio.Enums.FileMonitorEvent'. -}
        -> IO ()

    -- | A convenience synonym for @`Nothing` :: `Maybe` `FileMonitorChangedCallback`@.
    noFileMonitorChangedCallback :: Maybe FileMonitorChangedCallback
    noFileMonitorChangedCallback = Nothing

    -- | Type for the callback on the (unwrapped) C side.
    type C_FileMonitorChangedCallback =
        Ptr () ->                               -- object
        Ptr Gio.File.File ->
        Ptr Gio.File.File ->
        CUInt ->
        Ptr () ->                               -- user_data
        IO ()

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

    -- | Wrap the callback into a `Closure`.
    genClosure_FileMonitorChanged :: FileMonitorChangedCallback -> IO Closure
    genClosure_FileMonitorChanged cb = do
        let cb' = wrap_FileMonitorChangedCallback cb
        mk_FileMonitorChangedCallback cb' >>= newCClosure

    -- | Wrap a `FileMonitorChangedCallback` into a `C_FileMonitorChangedCallback`.
    wrap_FileMonitorChangedCallback ::
        FileMonitorChangedCallback ->
        C_FileMonitorChangedCallback
    wrap_FileMonitorChangedCallback _cb _ file otherFile eventType _ = do
        file' <- (newObject Gio.File.File) file
        maybeOtherFile <-
            if otherFile == nullPtr
            then return Nothing
            else do
                otherFile' <- (newObject Gio.File.File) otherFile
                return $ Just otherFile'
        let eventType' = (toEnum . fromIntegral) eventType
        _cb  file' maybeOtherFile eventType'

    {- |
    Connect a signal handler for the “@changed@” 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' fileMonitor #changed callback
    @
    -}
    onFileMonitorChanged :: (IsFileMonitor a, MonadIO m) => a -> FileMonitorChangedCallback -> m SignalHandlerId
    onFileMonitorChanged obj cb = liftIO $ do
        let cb' = wrap_FileMonitorChangedCallback cb
        cb'' <- mk_FileMonitorChangedCallback cb'
        connectSignalFunPtr obj "changed" cb'' SignalConnectBefore

    {- |
    Connect a signal handler for the “@changed@” 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' fileMonitor #changed callback
    @
    -}
    afterFileMonitorChanged :: (IsFileMonitor a, MonadIO m) => a -> FileMonitorChangedCallback -> m SignalHandlerId
    afterFileMonitorChanged obj cb = liftIO $ do
        let cb' = wrap_FileMonitorChangedCallback cb
        cb'' <- mk_FileMonitorChangedCallback cb'
        connectSignalFunPtr obj "changed" cb'' SignalConnectAfter

    -- VVV Prop "cancelled"
       -- Type: TBasicType TBoolean
       -- Flags: [PropertyReadable]
       -- Nullable: (Nothing,Nothing)

    {- |
    Get the value of the “@cancelled@” property.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' fileMonitor #cancelled
    @
    -}
    getFileMonitorCancelled :: (MonadIO m, IsFileMonitor o) => o -> m Bool
    getFileMonitorCancelled obj = liftIO $ getObjectPropertyBool obj "cancelled"

    #if ENABLE_OVERLOADING
    data FileMonitorCancelledPropertyInfo
    instance AttrInfo FileMonitorCancelledPropertyInfo where
        type AttrAllowedOps FileMonitorCancelledPropertyInfo = '[ 'AttrGet]
        type AttrSetTypeConstraint FileMonitorCancelledPropertyInfo = (~) ()
        type AttrBaseTypeConstraint FileMonitorCancelledPropertyInfo = IsFileMonitor
        type AttrGetType FileMonitorCancelledPropertyInfo = Bool
        type AttrLabel FileMonitorCancelledPropertyInfo = "cancelled"
        type AttrOrigin FileMonitorCancelledPropertyInfo = FileMonitor
        attrGet _ = getFileMonitorCancelled
        attrSet _ = undefined
        attrConstruct _ = undefined
        attrClear _ = undefined
    #endif

    -- VVV Prop "rate-limit"
       -- Type: TBasicType TInt
       -- Flags: [PropertyReadable,PropertyWritable]
       -- Nullable: (Nothing,Just False)

    {- |
    Get the value of the “@rate-limit@” property.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.get' fileMonitor #rateLimit
    @
    -}
    getFileMonitorRateLimit :: (MonadIO m, IsFileMonitor o) => o -> m Int32
    getFileMonitorRateLimit obj = liftIO $ getObjectPropertyInt32 obj "rate-limit"

    {- |
    Set the value of the “@rate-limit@” property.
    When <https://github.com/haskell-gi/haskell-gi/wiki/Overloading overloading> is enabled, this is equivalent to

    @
    'Data.GI.Base.Attributes.set' fileMonitor [ #rateLimit 'Data.GI.Base.Attributes.:=' value ]
    @
    -}
    setFileMonitorRateLimit :: (MonadIO m, IsFileMonitor o) => o -> Int32 -> m ()
    setFileMonitorRateLimit obj val = liftIO $ setObjectPropertyInt32 obj "rate-limit" val

    {- |
    Construct a `GValueConstruct` with valid value for the “@rate-limit@” property. This is rarely needed directly, but it is used by `Data.GI.Base.Constructible.new`.
    -}
    constructFileMonitorRateLimit :: (IsFileMonitor o) => Int32 -> IO (GValueConstruct o)
    constructFileMonitorRateLimit val = constructObjectPropertyInt32 "rate-limit" val

    #if ENABLE_OVERLOADING
    data FileMonitorRateLimitPropertyInfo
    instance AttrInfo FileMonitorRateLimitPropertyInfo where
        type AttrAllowedOps FileMonitorRateLimitPropertyInfo = '[ 'AttrSet, 'AttrConstruct, 'AttrGet]
        type AttrSetTypeConstraint FileMonitorRateLimitPropertyInfo = (~) Int32
        type AttrBaseTypeConstraint FileMonitorRateLimitPropertyInfo = IsFileMonitor
        type AttrGetType FileMonitorRateLimitPropertyInfo = Int32
        type AttrLabel FileMonitorRateLimitPropertyInfo = "rate-limit"
        type AttrOrigin FileMonitorRateLimitPropertyInfo = FileMonitor
        attrGet _ = getFileMonitorRateLimit
        attrSet _ = setFileMonitorRateLimit
        attrConstruct _ = constructFileMonitorRateLimit
        attrClear _ = undefined
    #endif

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList FileMonitor
    type instance O.AttributeList FileMonitor = FileMonitorAttributeList
    type FileMonitorAttributeList = ('[ '("cancelled", FileMonitorCancelledPropertyInfo), '("rateLimit", FileMonitorRateLimitPropertyInfo)] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    fileMonitorCancelled :: AttrLabelProxy "cancelled"
    fileMonitorCancelled = AttrLabelProxy

    fileMonitorRateLimit :: AttrLabelProxy "rateLimit"
    fileMonitorRateLimit = AttrLabelProxy

    #endif

    #if ENABLE_OVERLOADING
    data FileMonitorChangedSignalInfo
    instance SignalInfo FileMonitorChangedSignalInfo where
        type HaskellCallbackType FileMonitorChangedSignalInfo = FileMonitorChangedCallback
        connectSignal _ obj cb connectMode = do
            let cb' = wrap_FileMonitorChangedCallback cb
            cb'' <- mk_FileMonitorChangedCallback cb'
            connectSignalFunPtr obj "changed" cb'' connectMode

    type instance O.SignalList FileMonitor = FileMonitorSignalList
    type FileMonitorSignalList = ('[ '("changed", FileMonitorChangedSignalInfo), '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

    #endif

    -- method FileMonitor::cancel
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "monitor", argType = TInterface (Name {namespace = "Gio", name = "FileMonitor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileMonitor.", 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_file_monitor_cancel" g_file_monitor_cancel ::
        Ptr FileMonitor ->                      -- monitor : TInterface (Name {namespace = "Gio", name = "FileMonitor"})
        IO CInt

    {- |
    Cancels a file monitor.
    -}
    fileMonitorCancel ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileMonitor a) =>
        a
        {- ^ /@monitor@/: a 'GI.Gio.Objects.FileMonitor.FileMonitor'. -}
        -> m Bool
        {- ^ __Returns:__ always 'True' -}
    fileMonitorCancel monitor = liftIO $ do
        monitor' <- unsafeManagedPtrCastPtr monitor
        result <- g_file_monitor_cancel monitor'
        let result' = (/= 0) result
        touchManagedPtr monitor
        return result'

    #if ENABLE_OVERLOADING
    data FileMonitorCancelMethodInfo
    instance (signature ~ (m Bool), MonadIO m, IsFileMonitor a) => O.MethodInfo FileMonitorCancelMethodInfo a signature where
        overloadedMethod _ = fileMonitorCancel

    #endif

    -- method FileMonitor::emit_event
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "monitor", argType = TInterface (Name {namespace = "Gio", name = "FileMonitor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileMonitor.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "child", argType = TInterface (Name {namespace = "Gio", name = "File"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFile.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "other_file", argType = TInterface (Name {namespace = "Gio", name = "File"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFile.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "event_type", argType = TInterface (Name {namespace = "Gio", name = "FileMonitorEvent"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a set of #GFileMonitorEvent flags.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_file_monitor_emit_event" g_file_monitor_emit_event ::
        Ptr FileMonitor ->                      -- monitor : TInterface (Name {namespace = "Gio", name = "FileMonitor"})
        Ptr Gio.File.File ->                    -- child : TInterface (Name {namespace = "Gio", name = "File"})
        Ptr Gio.File.File ->                    -- other_file : TInterface (Name {namespace = "Gio", name = "File"})
        CUInt ->                                -- event_type : TInterface (Name {namespace = "Gio", name = "FileMonitorEvent"})
        IO ()

    {- |
    Emits the 'GI.Gio.Objects.FileMonitor.FileMonitor'::@/changed/@ signal if a change
    has taken place. Should be called from file monitor
    implementations only.

    Implementations are responsible to call this method from the
    [thread-default main context][g-main-context-push-thread-default] of the
    thread that the monitor was created in.
    -}
    fileMonitorEmitEvent ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileMonitor a, Gio.File.IsFile b, Gio.File.IsFile c) =>
        a
        {- ^ /@monitor@/: a 'GI.Gio.Objects.FileMonitor.FileMonitor'. -}
        -> b
        {- ^ /@child@/: a 'GI.Gio.Interfaces.File.File'. -}
        -> c
        {- ^ /@otherFile@/: a 'GI.Gio.Interfaces.File.File'. -}
        -> Gio.Enums.FileMonitorEvent
        {- ^ /@eventType@/: a set of 'GI.Gio.Enums.FileMonitorEvent' flags. -}
        -> m ()
    fileMonitorEmitEvent monitor child otherFile eventType = liftIO $ do
        monitor' <- unsafeManagedPtrCastPtr monitor
        child' <- unsafeManagedPtrCastPtr child
        otherFile' <- unsafeManagedPtrCastPtr otherFile
        let eventType' = (fromIntegral . fromEnum) eventType
        g_file_monitor_emit_event monitor' child' otherFile' eventType'
        touchManagedPtr monitor
        touchManagedPtr child
        touchManagedPtr otherFile
        return ()

    #if ENABLE_OVERLOADING
    data FileMonitorEmitEventMethodInfo
    instance (signature ~ (b -> c -> Gio.Enums.FileMonitorEvent -> m ()), MonadIO m, IsFileMonitor a, Gio.File.IsFile b, Gio.File.IsFile c) => O.MethodInfo FileMonitorEmitEventMethodInfo a signature where
        overloadedMethod _ = fileMonitorEmitEvent

    #endif

    -- method FileMonitor::is_cancelled
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "monitor", argType = TInterface (Name {namespace = "Gio", name = "FileMonitor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileMonitor", 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_file_monitor_is_cancelled" g_file_monitor_is_cancelled ::
        Ptr FileMonitor ->                      -- monitor : TInterface (Name {namespace = "Gio", name = "FileMonitor"})
        IO CInt

    {- |
    Returns whether the monitor is canceled.
    -}
    fileMonitorIsCancelled ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileMonitor a) =>
        a
        {- ^ /@monitor@/: a 'GI.Gio.Objects.FileMonitor.FileMonitor' -}
        -> m Bool
        {- ^ __Returns:__ 'True' if monitor is canceled. 'False' otherwise. -}
    fileMonitorIsCancelled monitor = liftIO $ do
        monitor' <- unsafeManagedPtrCastPtr monitor
        result <- g_file_monitor_is_cancelled monitor'
        let result' = (/= 0) result
        touchManagedPtr monitor
        return result'

    #if ENABLE_OVERLOADING
    data FileMonitorIsCancelledMethodInfo
    instance (signature ~ (m Bool), MonadIO m, IsFileMonitor a) => O.MethodInfo FileMonitorIsCancelledMethodInfo a signature where
        overloadedMethod _ = fileMonitorIsCancelled

    #endif

    -- method FileMonitor::set_rate_limit
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "monitor", argType = TInterface (Name {namespace = "Gio", name = "FileMonitor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GFileMonitor.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "limit_msecs", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a non-negative integer with the limit in milliseconds\n    to poll for changes", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "g_file_monitor_set_rate_limit" g_file_monitor_set_rate_limit ::
        Ptr FileMonitor ->                      -- monitor : TInterface (Name {namespace = "Gio", name = "FileMonitor"})
        Int32 ->                                -- limit_msecs : TBasicType TInt
        IO ()

    {- |
    Sets the rate limit to which the /@monitor@/ will report
    consecutive change events to the same file.
    -}
    fileMonitorSetRateLimit ::
        (B.CallStack.HasCallStack, MonadIO m, IsFileMonitor a) =>
        a
        {- ^ /@monitor@/: a 'GI.Gio.Objects.FileMonitor.FileMonitor'. -}
        -> Int32
        {- ^ /@limitMsecs@/: a non-negative integer with the limit in milliseconds
        to poll for changes -}
        -> m ()
    fileMonitorSetRateLimit monitor limitMsecs = liftIO $ do
        monitor' <- unsafeManagedPtrCastPtr monitor
        g_file_monitor_set_rate_limit monitor' limitMsecs
        touchManagedPtr monitor
        return ()

    #if ENABLE_OVERLOADING
    data FileMonitorSetRateLimitMethodInfo
    instance (signature ~ (Int32 -> m ()), MonadIO m, IsFileMonitor a) => O.MethodInfo FileMonitorSetRateLimitMethodInfo a signature where
        overloadedMethod _ = fileMonitorSetRateLimit

    #endif