{- |
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.Vte.Callbacks
    ( 

 -- * Signals
-- ** SelectionFunc
    SelectionFunc                           ,
    SelectionFuncC                          ,
    mkSelectionFunc                         ,
    noSelectionFunc                         ,
    selectionFuncClosure                    ,
    selectionFuncWrapper                    ,




    ) 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.Vte.Types


-- callback SelectionFunc
selectionFuncClosure :: SelectionFunc -> IO Closure
selectionFuncClosure cb = newCClosure =<< mkSelectionFunc wrapped
    where wrapped = selectionFuncWrapper Nothing cb

type SelectionFuncC =
    Ptr Terminal ->
    Int64 ->
    Int64 ->
    Ptr () ->
    IO CInt

foreign import ccall "wrapper"
    mkSelectionFunc :: SelectionFuncC -> IO (FunPtr SelectionFuncC)

type SelectionFunc =
    Terminal ->
    Int64 ->
    Int64 ->
    IO Bool

noSelectionFunc :: Maybe SelectionFunc
noSelectionFunc = Nothing

selectionFuncWrapper ::
    Maybe (Ptr (FunPtr (SelectionFuncC))) ->
    SelectionFunc ->
    Ptr Terminal ->
    Int64 ->
    Int64 ->
    Ptr () ->
    IO CInt
selectionFuncWrapper funptrptr _cb terminal column row _ = do
    terminal' <- (newObject Terminal) terminal
    result <- _cb  terminal' column row
    maybeReleaseFunPtr funptrptr
    let result' = (fromIntegral . fromEnum) result
    return result'