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

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

module GI.Handy.Callbacks
    (

 -- * Signals
-- ** ComboRowGetEnumValueNameFunc #signal:ComboRowGetEnumValueNameFunc#

    C_ComboRowGetEnumValueNameFunc          ,
    ComboRowGetEnumValueNameFunc            ,
    ComboRowGetEnumValueNameFunc_WithClosures,
    drop_closures_ComboRowGetEnumValueNameFunc,
    dynamic_ComboRowGetEnumValueNameFunc    ,
    genClosure_ComboRowGetEnumValueNameFunc ,
    mk_ComboRowGetEnumValueNameFunc         ,
    noComboRowGetEnumValueNameFunc          ,
    noComboRowGetEnumValueNameFunc_WithClosures,
    wrap_ComboRowGetEnumValueNameFunc       ,


-- ** ComboRowGetNameFunc #signal:ComboRowGetNameFunc#

    C_ComboRowGetNameFunc                   ,
    ComboRowGetNameFunc                     ,
    ComboRowGetNameFunc_WithClosures        ,
    drop_closures_ComboRowGetNameFunc       ,
    dynamic_ComboRowGetNameFunc             ,
    genClosure_ComboRowGetNameFunc          ,
    mk_ComboRowGetNameFunc                  ,
    noComboRowGetNameFunc                   ,
    noComboRowGetNameFunc_WithClosures      ,
    wrap_ComboRowGetNameFunc                ,




    ) 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.Handy.Objects.EnumValueObject as Handy.EnumValueObject

-- callback ComboRowGetNameFunc
--          -> Callable {returnType = Just (TBasicType TUTF8), returnMayBeNull = False, returnTransfer = TransferEverything, returnDocumentation = Documentation {rawDocText = Just "a newly allocated displayable name that represents @item", sinceVersion = Nothing}, args = [Arg {argCName = "item", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the item from the model from which to get a name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "user data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = 1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}], skipReturn = False, callableThrows = False, callableDeprecated = Nothing, callableDocumentation = Documentation {rawDocText = Just "Called for combo rows that are bound to a #GListModel with\nhdy_combo_row_bind_name_model() for each item that gets added to the model.", sinceVersion = Nothing}}
-- | Type for the callback on the (unwrapped) C side.
type C_ComboRowGetNameFunc =
    Ptr GObject.Object.Object ->
    Ptr () ->
    IO CString

-- Args : [Arg {argCName = "item", argType = TInterface (Name {namespace = "GObject", name = "Object"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the item from the model from which to get a name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "user data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = 1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "dynamic" __dynamic_C_ComboRowGetNameFunc :: FunPtr C_ComboRowGetNameFunc -> C_ComboRowGetNameFunc

-- | Given a pointer to a foreign C function, wrap it into a function callable from Haskell.
dynamic_ComboRowGetNameFunc ::
    (B.CallStack.HasCallStack, MonadIO m, GObject.Object.IsObject a) =>
    FunPtr C_ComboRowGetNameFunc
    -> a
    {- ^ /@item@/: the item from the model from which to get a name -}
    -> Ptr ()
    {- ^ /@userData@/: user data -}
    -> m T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@item@/ -}
dynamic_ComboRowGetNameFunc __funPtr item userData = liftIO $ do
    item' <- unsafeManagedPtrCastPtr item
    result <- (__dynamic_C_ComboRowGetNameFunc __funPtr) item' userData
    checkUnexpectedReturnNULL "comboRowGetNameFunc" result
    result' <- cstringToText result
    freeMem result
    touchManagedPtr item
    return result'

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

{- |
Called for combo rows that are bound to a 'GI.Gio.Interfaces.ListModel.ListModel' with
'GI.Handy.Objects.ComboRow.comboRowBindNameModel' for each item that gets added to the model.
-}
type ComboRowGetNameFunc =
    GObject.Object.Object
    {- ^ /@item@/: the item from the model from which to get a name -}
    -> IO T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@item@/ -}

-- | A convenience synonym for @`Nothing` :: `Maybe` `ComboRowGetNameFunc`@.
noComboRowGetNameFunc :: Maybe ComboRowGetNameFunc
noComboRowGetNameFunc = Nothing

{- |
Called for combo rows that are bound to a 'GI.Gio.Interfaces.ListModel.ListModel' with
'GI.Handy.Objects.ComboRow.comboRowBindNameModel' for each item that gets added to the model.
-}
type ComboRowGetNameFunc_WithClosures =
    GObject.Object.Object
    {- ^ /@item@/: the item from the model from which to get a name -}
    -> Ptr ()
    {- ^ /@userData@/: user data -}
    -> IO T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@item@/ -}

-- | A convenience synonym for @`Nothing` :: `Maybe` `ComboRowGetNameFunc_WithClosures`@.
noComboRowGetNameFunc_WithClosures :: Maybe ComboRowGetNameFunc_WithClosures
noComboRowGetNameFunc_WithClosures = Nothing

-- | A simple wrapper that ignores the closure arguments.
drop_closures_ComboRowGetNameFunc :: ComboRowGetNameFunc -> ComboRowGetNameFunc_WithClosures
drop_closures_ComboRowGetNameFunc _f item _ = _f item

-- | Wrap the callback into a `GClosure`.
genClosure_ComboRowGetNameFunc :: MonadIO m => ComboRowGetNameFunc -> m (GClosure C_ComboRowGetNameFunc)
genClosure_ComboRowGetNameFunc cb = liftIO $ do
    let cb' = drop_closures_ComboRowGetNameFunc cb
    let cb'' = wrap_ComboRowGetNameFunc Nothing cb'
    mk_ComboRowGetNameFunc cb'' >>= B.GClosure.newGClosure


-- | Wrap a `ComboRowGetNameFunc` into a `C_ComboRowGetNameFunc`.
wrap_ComboRowGetNameFunc ::
    Maybe (Ptr (FunPtr C_ComboRowGetNameFunc)) ->
    ComboRowGetNameFunc_WithClosures ->
    C_ComboRowGetNameFunc
wrap_ComboRowGetNameFunc funptrptr _cb item userData = do
    item' <- (newObject GObject.Object.Object) item
    result <- _cb  item' userData
    maybeReleaseFunPtr funptrptr
    result' <- textToCString result
    return result'


-- callback ComboRowGetEnumValueNameFunc
--          -> Callable {returnType = Just (TBasicType TUTF8), returnMayBeNull = False, returnTransfer = TransferEverything, returnDocumentation = Documentation {rawDocText = Just "a newly allocated displayable name that represents @value", sinceVersion = Nothing}, args = [Arg {argCName = "value", argType = TInterface (Name {namespace = "Handy", name = "EnumValueObject"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the value from the enum from which to get a name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "user data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = 1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}], skipReturn = False, callableThrows = False, callableDeprecated = Nothing, callableDocumentation = Documentation {rawDocText = Just "Called for combo rows that are bound to an enumeration with\nhdy_combo_row_set_for_enum() for each value from that enumeration.", sinceVersion = Nothing}}
-- | Type for the callback on the (unwrapped) C side.
type C_ComboRowGetEnumValueNameFunc =
    Ptr Handy.EnumValueObject.EnumValueObject ->
    Ptr () ->
    IO CString

-- Args : [Arg {argCName = "value", argType = TInterface (Name {namespace = "Handy", name = "EnumValueObject"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the value from the enum from which to get a name", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "user_data", argType = TBasicType TPtr, direction = DirectionIn, mayBeNull = True, argDoc = Documentation {rawDocText = Just "user data", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = 1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TUTF8)
-- throws : False
-- Skip return : False

foreign import ccall "dynamic" __dynamic_C_ComboRowGetEnumValueNameFunc :: FunPtr C_ComboRowGetEnumValueNameFunc -> C_ComboRowGetEnumValueNameFunc

-- | Given a pointer to a foreign C function, wrap it into a function callable from Haskell.
dynamic_ComboRowGetEnumValueNameFunc ::
    (B.CallStack.HasCallStack, MonadIO m, Handy.EnumValueObject.IsEnumValueObject a) =>
    FunPtr C_ComboRowGetEnumValueNameFunc
    -> a
    {- ^ /@value@/: the value from the enum from which to get a name -}
    -> Ptr ()
    {- ^ /@userData@/: user data -}
    -> m T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@value@/ -}
dynamic_ComboRowGetEnumValueNameFunc __funPtr value userData = liftIO $ do
    value' <- unsafeManagedPtrCastPtr value
    result <- (__dynamic_C_ComboRowGetEnumValueNameFunc __funPtr) value' userData
    checkUnexpectedReturnNULL "comboRowGetEnumValueNameFunc" result
    result' <- cstringToText result
    freeMem result
    touchManagedPtr value
    return result'

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

{- |
Called for combo rows that are bound to an enumeration with
'GI.Handy.Objects.ComboRow.comboRowSetForEnum' for each value from that enumeration.
-}
type ComboRowGetEnumValueNameFunc =
    Handy.EnumValueObject.EnumValueObject
    {- ^ /@value@/: the value from the enum from which to get a name -}
    -> IO T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@value@/ -}

-- | A convenience synonym for @`Nothing` :: `Maybe` `ComboRowGetEnumValueNameFunc`@.
noComboRowGetEnumValueNameFunc :: Maybe ComboRowGetEnumValueNameFunc
noComboRowGetEnumValueNameFunc = Nothing

{- |
Called for combo rows that are bound to an enumeration with
'GI.Handy.Objects.ComboRow.comboRowSetForEnum' for each value from that enumeration.
-}
type ComboRowGetEnumValueNameFunc_WithClosures =
    Handy.EnumValueObject.EnumValueObject
    {- ^ /@value@/: the value from the enum from which to get a name -}
    -> Ptr ()
    {- ^ /@userData@/: user data -}
    -> IO T.Text
    {- ^ __Returns:__ a newly allocated displayable name that represents /@value@/ -}

-- | A convenience synonym for @`Nothing` :: `Maybe` `ComboRowGetEnumValueNameFunc_WithClosures`@.
noComboRowGetEnumValueNameFunc_WithClosures :: Maybe ComboRowGetEnumValueNameFunc_WithClosures
noComboRowGetEnumValueNameFunc_WithClosures = Nothing

-- | A simple wrapper that ignores the closure arguments.
drop_closures_ComboRowGetEnumValueNameFunc :: ComboRowGetEnumValueNameFunc -> ComboRowGetEnumValueNameFunc_WithClosures
drop_closures_ComboRowGetEnumValueNameFunc _f value _ = _f value

-- | Wrap the callback into a `GClosure`.
genClosure_ComboRowGetEnumValueNameFunc :: MonadIO m => ComboRowGetEnumValueNameFunc -> m (GClosure C_ComboRowGetEnumValueNameFunc)
genClosure_ComboRowGetEnumValueNameFunc cb = liftIO $ do
    let cb' = drop_closures_ComboRowGetEnumValueNameFunc cb
    let cb'' = wrap_ComboRowGetEnumValueNameFunc Nothing cb'
    mk_ComboRowGetEnumValueNameFunc cb'' >>= B.GClosure.newGClosure


-- | Wrap a `ComboRowGetEnumValueNameFunc` into a `C_ComboRowGetEnumValueNameFunc`.
wrap_ComboRowGetEnumValueNameFunc ::
    Maybe (Ptr (FunPtr C_ComboRowGetEnumValueNameFunc)) ->
    ComboRowGetEnumValueNameFunc_WithClosures ->
    C_ComboRowGetEnumValueNameFunc
wrap_ComboRowGetEnumValueNameFunc funptrptr _cb value userData = do
    value' <- (newObject Handy.EnumValueObject.EnumValueObject) value
    result <- _cb  value' userData
    maybeReleaseFunPtr funptrptr
    result' <- textToCString result
    return result'