packages feed

gi-gtk-0.3.18.14: GI/Gtk/Structs/TargetPair.hs


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

A #GtkTargetPair is used to represent the same
information as a table of #GtkTargetEntry, but in
an efficient form.
-}

module GI.Gtk.Structs.TargetPair
    ( 

-- * Exported types
    TargetPair(..)                          ,
    newZeroTargetPair                       ,
    noTargetPair                            ,


 -- * Properties
-- ** Flags
    targetPairFlags                         ,
    targetPairReadFlags                     ,
    targetPairWriteFlags                    ,


-- ** Info
    targetPairInfo                          ,
    targetPairReadInfo                      ,
    targetPairWriteInfo                     ,


-- ** Target
    targetPairClearTarget                   ,
    targetPairReadTarget                    ,
    targetPairTarget                        ,
    targetPairWriteTarget                   ,




    ) where

import Data.GI.Base.ShortPrelude

import qualified Data.GI.Base.Attributes as GI.Attributes
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.Gdk as Gdk

newtype TargetPair = TargetPair (ForeignPtr TargetPair)
-- | Construct a `TargetPair` struct initialized to zero.
newZeroTargetPair :: MonadIO m => m TargetPair
newZeroTargetPair = liftIO $ callocBytes 16 >>= wrapPtr TargetPair

instance tag ~ 'AttrSet => Constructible TargetPair tag where
    new _ attrs = do
        o <- newZeroTargetPair
        GI.Attributes.set o attrs
        return o


noTargetPair :: Maybe TargetPair
noTargetPair = Nothing

targetPairReadTarget :: MonadIO m => TargetPair -> m (Maybe Gdk.Atom)
targetPairReadTarget s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 0) :: IO (Ptr Gdk.Atom)
    result <- convertIfNonNull val $ \val' -> do
        -- XXX Wrapping a foreign struct/union with no known destructor, leak?
        val'' <- (\x -> Gdk.Atom <$> newForeignPtr_ x) val'
        return val''
    return result

targetPairWriteTarget :: MonadIO m => TargetPair -> Ptr Gdk.Atom -> m ()
targetPairWriteTarget s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (val :: Ptr Gdk.Atom)

targetPairClearTarget :: MonadIO m => TargetPair -> m ()
targetPairClearTarget s = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 0) (nullPtr :: Ptr Gdk.Atom)

data TargetPairTargetFieldInfo
instance AttrInfo TargetPairTargetFieldInfo where
    type AttrAllowedOps TargetPairTargetFieldInfo = '[ 'AttrSet, 'AttrGet, 'AttrClear]
    type AttrSetTypeConstraint TargetPairTargetFieldInfo = (~) (Ptr Gdk.Atom)
    type AttrBaseTypeConstraint TargetPairTargetFieldInfo = (~) TargetPair
    type AttrGetType TargetPairTargetFieldInfo = Maybe Gdk.Atom
    type AttrLabel TargetPairTargetFieldInfo = "target"
    attrGet _ = targetPairReadTarget
    attrSet _ = targetPairWriteTarget
    attrConstruct = undefined
    attrClear _ = targetPairClearTarget

targetPairTarget :: AttrLabelProxy "target"
targetPairTarget = AttrLabelProxy


targetPairReadFlags :: MonadIO m => TargetPair -> m Word32
targetPairReadFlags s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 8) :: IO Word32
    return val

targetPairWriteFlags :: MonadIO m => TargetPair -> Word32 -> m ()
targetPairWriteFlags s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 8) (val :: Word32)

data TargetPairFlagsFieldInfo
instance AttrInfo TargetPairFlagsFieldInfo where
    type AttrAllowedOps TargetPairFlagsFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint TargetPairFlagsFieldInfo = (~) Word32
    type AttrBaseTypeConstraint TargetPairFlagsFieldInfo = (~) TargetPair
    type AttrGetType TargetPairFlagsFieldInfo = Word32
    type AttrLabel TargetPairFlagsFieldInfo = "flags"
    attrGet _ = targetPairReadFlags
    attrSet _ = targetPairWriteFlags
    attrConstruct = undefined
    attrClear _ = undefined

targetPairFlags :: AttrLabelProxy "flags"
targetPairFlags = AttrLabelProxy


targetPairReadInfo :: MonadIO m => TargetPair -> m Word32
targetPairReadInfo s = liftIO $ withManagedPtr s $ \ptr -> do
    val <- peek (ptr `plusPtr` 12) :: IO Word32
    return val

targetPairWriteInfo :: MonadIO m => TargetPair -> Word32 -> m ()
targetPairWriteInfo s val = liftIO $ withManagedPtr s $ \ptr -> do
    poke (ptr `plusPtr` 12) (val :: Word32)

data TargetPairInfoFieldInfo
instance AttrInfo TargetPairInfoFieldInfo where
    type AttrAllowedOps TargetPairInfoFieldInfo = '[ 'AttrSet, 'AttrGet]
    type AttrSetTypeConstraint TargetPairInfoFieldInfo = (~) Word32
    type AttrBaseTypeConstraint TargetPairInfoFieldInfo = (~) TargetPair
    type AttrGetType TargetPairInfoFieldInfo = Word32
    type AttrLabel TargetPairInfoFieldInfo = "info"
    attrGet _ = targetPairReadInfo
    attrSet _ = targetPairWriteInfo
    attrConstruct = undefined
    attrClear _ = undefined

targetPairInfo :: AttrLabelProxy "info"
targetPairInfo = AttrLabelProxy



type instance AttributeList TargetPair = TargetPairAttributeList
type TargetPairAttributeList = ('[ '("target", TargetPairTargetFieldInfo), '("flags", TargetPairFlagsFieldInfo), '("info", TargetPairInfoFieldInfo)] :: [(Symbol, *)])

type family ResolveTargetPairMethod (t :: Symbol) (o :: *) :: * where
    ResolveTargetPairMethod l o = MethodResolutionFailed l o

instance (info ~ ResolveTargetPairMethod t TargetPair, MethodInfo info TargetPair p) => IsLabelProxy t (TargetPair -> p) where
    fromLabelProxy _ = overloadedMethod (MethodProxy :: MethodProxy info)

#if MIN_VERSION_base(4,9,0)
instance (info ~ ResolveTargetPairMethod t TargetPair, MethodInfo info TargetPair p) => IsLabel t (TargetPair -> p) where
    fromLabel _ = overloadedMethod (MethodProxy :: MethodProxy info)
#endif