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

The `GSource` struct is an opaque data type
representing an event source.
-}

module GI.GLib.Structs.Source
    ( 

-- * Exported types
    Source(..)                              ,
    noSource                                ,


 -- * Methods
-- ** sourceAddChildSource
    sourceAddChildSource                    ,


-- ** sourceAddPoll
    sourceAddPoll                           ,


-- ** sourceAttach
    sourceAttach                            ,


-- ** sourceDestroy
    sourceDestroy                           ,


-- ** sourceGetCanRecurse
    sourceGetCanRecurse                     ,


-- ** sourceGetContext
    sourceGetContext                        ,


-- ** sourceGetCurrentTime
    sourceGetCurrentTime                    ,


-- ** sourceGetId
    sourceGetId                             ,


-- ** sourceGetName
    sourceGetName                           ,


-- ** sourceGetPriority
    sourceGetPriority                       ,


-- ** sourceGetReadyTime
    sourceGetReadyTime                      ,


-- ** sourceGetTime
    sourceGetTime                           ,


-- ** sourceIsDestroyed
    sourceIsDestroyed                       ,


-- ** sourceModifyUnixFd
    sourceModifyUnixFd                      ,


-- ** sourceNew
    sourceNew                               ,


-- ** sourceQueryUnixFd
    sourceQueryUnixFd                       ,


-- ** sourceRef
    sourceRef                               ,


-- ** sourceRemoveChildSource
    sourceRemoveChildSource                 ,


-- ** sourceRemovePoll
    sourceRemovePoll                        ,


-- ** sourceRemoveUnixFd
    sourceRemoveUnixFd                      ,


-- ** sourceSetCallback
    sourceSetCallback                       ,


-- ** sourceSetCallbackIndirect
    sourceSetCallbackIndirect               ,


-- ** sourceSetCanRecurse
    sourceSetCanRecurse                     ,


-- ** sourceSetFuncs
    sourceSetFuncs                          ,


-- ** sourceSetName
    sourceSetName                           ,


-- ** sourceSetPriority
    sourceSetPriority                       ,


-- ** sourceSetReadyTime
    sourceSetReadyTime                      ,


-- ** sourceUnref
    sourceUnref                             ,




    ) 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.GLib.Types
import GI.GLib.Callbacks

newtype Source = Source (ForeignPtr Source)
foreign import ccall "g_source_get_type" c_g_source_get_type :: 
    IO GType

instance BoxedObject Source where
    boxedType _ = c_g_source_get_type

noSource :: Maybe Source
noSource = Nothing

-- method Source::new
-- method type : Constructor
-- Args : [Arg {argName = "source_funcs", argType = TInterface "GLib" "SourceFuncs", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "struct_size", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "source_funcs", argType = TInterface "GLib" "SourceFuncs", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "struct_size", argType = TBasicType TUInt32, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TInterface "GLib" "Source"
-- throws : False
-- Skip return : False

foreign import ccall "g_source_new" g_source_new :: 
    Ptr SourceFuncs ->                      -- source_funcs : TInterface "GLib" "SourceFuncs"
    Word32 ->                               -- struct_size : TBasicType TUInt32
    IO (Ptr Source)


sourceNew ::
    (MonadIO m) =>
    SourceFuncs ->                          -- source_funcs
    Word32 ->                               -- struct_size
    m Source
sourceNew source_funcs struct_size = liftIO $ do
    let source_funcs' = unsafeManagedPtrGetPtr source_funcs
    result <- g_source_new source_funcs' struct_size
    checkUnexpectedReturnNULL "g_source_new" result
    result' <- (wrapBoxed Source) result
    touchManagedPtr source_funcs
    return result'

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

foreign import ccall "g_source_add_child_source" g_source_add_child_source :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr Source ->                           -- child_source : TInterface "GLib" "Source"
    IO ()


sourceAddChildSource ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Source ->                               -- child_source
    m ()
sourceAddChildSource _obj child_source = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let child_source' = unsafeManagedPtrGetPtr child_source
    g_source_add_child_source _obj' child_source'
    touchManagedPtr _obj
    touchManagedPtr child_source
    return ()

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

foreign import ccall "g_source_add_poll" g_source_add_poll :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr PollFD ->                           -- fd : TInterface "GLib" "PollFD"
    IO ()


sourceAddPoll ::
    (MonadIO m) =>
    Source ->                               -- _obj
    PollFD ->                               -- fd
    m ()
sourceAddPoll _obj fd = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let fd' = unsafeManagedPtrGetPtr fd
    g_source_add_poll _obj' fd'
    touchManagedPtr _obj
    touchManagedPtr fd
    return ()

-- method Source::attach
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Source", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "context", argType = TInterface "GLib" "MainContext", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Source", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "context", argType = TInterface "GLib" "MainContext", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- returnType : TBasicType TUInt32
-- throws : False
-- Skip return : False

foreign import ccall "g_source_attach" g_source_attach :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr MainContext ->                      -- context : TInterface "GLib" "MainContext"
    IO Word32


sourceAttach ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Maybe (MainContext) ->                  -- context
    m Word32
sourceAttach _obj context = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    maybeContext <- case context of
        Nothing -> return nullPtr
        Just jContext -> do
            let jContext' = unsafeManagedPtrGetPtr jContext
            return jContext'
    result <- g_source_attach _obj' maybeContext
    touchManagedPtr _obj
    whenJust context touchManagedPtr
    return result

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

foreign import ccall "g_source_destroy" g_source_destroy :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO ()


sourceDestroy ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m ()
sourceDestroy _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_source_destroy _obj'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_get_can_recurse" g_source_get_can_recurse :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO CInt


sourceGetCanRecurse ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Bool
sourceGetCanRecurse _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_can_recurse _obj'
    let result' = (/= 0) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_get_context" g_source_get_context :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO (Ptr MainContext)


sourceGetContext ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m MainContext
sourceGetContext _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_context _obj'
    checkUnexpectedReturnNULL "g_source_get_context" result
    result' <- (newBoxed MainContext) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_get_current_time" g_source_get_current_time :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr TimeVal ->                          -- timeval : TInterface "GLib" "TimeVal"
    IO ()

{-# DEPRECATED sourceGetCurrentTime ["(Since version 2.28)","use g_source_get_time() instead"]#-}
sourceGetCurrentTime ::
    (MonadIO m) =>
    Source ->                               -- _obj
    TimeVal ->                              -- timeval
    m ()
sourceGetCurrentTime _obj timeval = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let timeval' = unsafeManagedPtrGetPtr timeval
    g_source_get_current_time _obj' timeval'
    touchManagedPtr _obj
    touchManagedPtr timeval
    return ()

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

foreign import ccall "g_source_get_id" g_source_get_id :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO Word32


sourceGetId ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Word32
sourceGetId _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_id _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_source_get_name" g_source_get_name :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO CString


sourceGetName ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m T.Text
sourceGetName _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_name _obj'
    checkUnexpectedReturnNULL "g_source_get_name" result
    result' <- cstringToText result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_get_priority" g_source_get_priority :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO Int32


sourceGetPriority ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Int32
sourceGetPriority _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_priority _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_source_get_ready_time" g_source_get_ready_time :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO Int64


sourceGetReadyTime ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Int64
sourceGetReadyTime _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_ready_time _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_source_get_time" g_source_get_time :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO Int64


sourceGetTime ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Int64
sourceGetTime _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_get_time _obj'
    touchManagedPtr _obj
    return result

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

foreign import ccall "g_source_is_destroyed" g_source_is_destroyed :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO CInt


sourceIsDestroyed ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Bool
sourceIsDestroyed _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_is_destroyed _obj'
    let result' = (/= 0) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_modify_unix_fd" g_source_modify_unix_fd :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr () ->                               -- tag : TBasicType TVoid
    CUInt ->                                -- new_events : TInterface "GLib" "IOCondition"
    IO ()


sourceModifyUnixFd ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Ptr () ->                               -- tag
    [IOCondition] ->                        -- new_events
    m ()
sourceModifyUnixFd _obj tag new_events = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let new_events' = gflagsToWord new_events
    g_source_modify_unix_fd _obj' tag new_events'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_query_unix_fd" g_source_query_unix_fd :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr () ->                               -- tag : TBasicType TVoid
    IO CUInt


sourceQueryUnixFd ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Ptr () ->                               -- tag
    m [IOCondition]
sourceQueryUnixFd _obj tag = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_query_unix_fd _obj' tag
    let result' = wordToGFlags result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_ref" g_source_ref :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO (Ptr Source)


sourceRef ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m Source
sourceRef _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    result <- g_source_ref _obj'
    checkUnexpectedReturnNULL "g_source_ref" result
    result' <- (wrapBoxed Source) result
    touchManagedPtr _obj
    return result'

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

foreign import ccall "g_source_remove_child_source" g_source_remove_child_source :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr Source ->                           -- child_source : TInterface "GLib" "Source"
    IO ()


sourceRemoveChildSource ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Source ->                               -- child_source
    m ()
sourceRemoveChildSource _obj child_source = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let child_source' = unsafeManagedPtrGetPtr child_source
    g_source_remove_child_source _obj' child_source'
    touchManagedPtr _obj
    touchManagedPtr child_source
    return ()

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

foreign import ccall "g_source_remove_poll" g_source_remove_poll :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr PollFD ->                           -- fd : TInterface "GLib" "PollFD"
    IO ()


sourceRemovePoll ::
    (MonadIO m) =>
    Source ->                               -- _obj
    PollFD ->                               -- fd
    m ()
sourceRemovePoll _obj fd = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let fd' = unsafeManagedPtrGetPtr fd
    g_source_remove_poll _obj' fd'
    touchManagedPtr _obj
    touchManagedPtr fd
    return ()

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

foreign import ccall "g_source_remove_unix_fd" g_source_remove_unix_fd :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr () ->                               -- tag : TBasicType TVoid
    IO ()


sourceRemoveUnixFd ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Ptr () ->                               -- tag
    m ()
sourceRemoveUnixFd _obj tag = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_source_remove_unix_fd _obj' tag
    touchManagedPtr _obj
    return ()

-- method Source::set_callback
-- method type : OrdinaryMethod
-- Args : [Arg {argName = "_obj", argType = TInterface "GLib" "Source", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "func", argType = TInterface "GLib" "SourceFunc", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeNotified, argClosure = 2, argDestroy = 3, transfer = TransferNothing},Arg {argName = "data", argType = TBasicType TVoid, direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "notify", argType = TInterface "GLib" "DestroyNotify", direction = DirectionIn, mayBeNull = True, argScope = ScopeTypeAsync, argClosure = -1, argDestroy = -1, transfer = TransferNothing}]
-- Lengths : []
-- hInArgs : [Arg {argName = "_obj", argType = TInterface "GLib" "Source", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, transfer = TransferNothing},Arg {argName = "func", argType = TInterface "GLib" "SourceFunc", direction = DirectionIn, mayBeNull = False, argScope = ScopeTypeNotified, argClosure = 2, argDestroy = 3, transfer = TransferNothing}]
-- returnType : TBasicType TVoid
-- throws : False
-- Skip return : False

foreign import ccall "g_source_set_callback" g_source_set_callback :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    FunPtr SourceFuncC ->                   -- func : TInterface "GLib" "SourceFunc"
    Ptr () ->                               -- data : TBasicType TVoid
    FunPtr DestroyNotifyC ->                -- notify : TInterface "GLib" "DestroyNotify"
    IO ()


sourceSetCallback ::
    (MonadIO m) =>
    Source ->                               -- _obj
    SourceFunc ->                           -- func
    m ()
sourceSetCallback _obj func = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    func' <- mkSourceFunc (sourceFuncWrapper Nothing func)
    let data_ = castFunPtrToPtr func'
    let notify = safeFreeFunPtrPtr
    g_source_set_callback _obj' func' data_ notify
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_set_callback_indirect" g_source_set_callback_indirect :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr () ->                               -- callback_data : TBasicType TVoid
    Ptr SourceCallbackFuncs ->              -- callback_funcs : TInterface "GLib" "SourceCallbackFuncs"
    IO ()


sourceSetCallbackIndirect ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Ptr () ->                               -- callback_data
    SourceCallbackFuncs ->                  -- callback_funcs
    m ()
sourceSetCallbackIndirect _obj callback_data callback_funcs = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let callback_funcs' = unsafeManagedPtrGetPtr callback_funcs
    g_source_set_callback_indirect _obj' callback_data callback_funcs'
    touchManagedPtr _obj
    touchManagedPtr callback_funcs
    return ()

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

foreign import ccall "g_source_set_can_recurse" g_source_set_can_recurse :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    CInt ->                                 -- can_recurse : TBasicType TBoolean
    IO ()


sourceSetCanRecurse ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Bool ->                                 -- can_recurse
    m ()
sourceSetCanRecurse _obj can_recurse = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let can_recurse' = (fromIntegral . fromEnum) can_recurse
    g_source_set_can_recurse _obj' can_recurse'
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_set_funcs" g_source_set_funcs :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Ptr SourceFuncs ->                      -- funcs : TInterface "GLib" "SourceFuncs"
    IO ()


sourceSetFuncs ::
    (MonadIO m) =>
    Source ->                               -- _obj
    SourceFuncs ->                          -- funcs
    m ()
sourceSetFuncs _obj funcs = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    let funcs' = unsafeManagedPtrGetPtr funcs
    g_source_set_funcs _obj' funcs'
    touchManagedPtr _obj
    touchManagedPtr funcs
    return ()

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

foreign import ccall "g_source_set_name" g_source_set_name :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    CString ->                              -- name : TBasicType TUTF8
    IO ()


sourceSetName ::
    (MonadIO m) =>
    Source ->                               -- _obj
    T.Text ->                               -- name
    m ()
sourceSetName _obj name = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    name' <- textToCString name
    g_source_set_name _obj' name'
    touchManagedPtr _obj
    freeMem name'
    return ()

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

foreign import ccall "g_source_set_priority" g_source_set_priority :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Int32 ->                                -- priority : TBasicType TInt32
    IO ()


sourceSetPriority ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Int32 ->                                -- priority
    m ()
sourceSetPriority _obj priority = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_source_set_priority _obj' priority
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_set_ready_time" g_source_set_ready_time :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    Int64 ->                                -- ready_time : TBasicType TInt64
    IO ()


sourceSetReadyTime ::
    (MonadIO m) =>
    Source ->                               -- _obj
    Int64 ->                                -- ready_time
    m ()
sourceSetReadyTime _obj ready_time = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_source_set_ready_time _obj' ready_time
    touchManagedPtr _obj
    return ()

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

foreign import ccall "g_source_unref" g_source_unref :: 
    Ptr Source ->                           -- _obj : TInterface "GLib" "Source"
    IO ()


sourceUnref ::
    (MonadIO m) =>
    Source ->                               -- _obj
    m ()
sourceUnref _obj = liftIO $ do
    let _obj' = unsafeManagedPtrGetPtr _obj
    g_source_unref _obj'
    touchManagedPtr _obj
    return ()