-- GENERATED by C->Haskell Compiler, version 0.13.13 (gtk2hs branch) "Bin IO", 27 May 2012 (Haskell)
-- Edit the ORIGINAL .chs file instead!


{-# LINE 1 "./System/Glib/GValue.chs" #-}
-- -*-haskell-*-
--  GIMP Toolkit (GTK) GValue
--
--  Author : Axel Simon
--
--  Created: 1 June 2001
--
--  Copyright (c) 1999..2002 Axel Simon
--
--  This library is free software; you can redistribute it and/or
--  modify it under the terms of the GNU Lesser General Public
--  License as published by the Free Software Foundation; either
--  version 2.1 of the License, or (at your option) any later version.
--
--  This library is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
--  Lesser General Public License for more details.
--
-- |
-- Maintainer  : gtk2hs-users@lists.sourceforge.net
-- Stability   : provisional
-- Portability : portable (depends on GHC)
--
-- This module implements only the necessities for the GTK binding.
--
-- * Everything here is only used by "Graphics.UI.Gtk.TreeList.TreeModel" and
-- friends.
--
module System.Glib.GValue (
  GValue(GValue),
  valueInit,
  valueGetType,
  allocaGValue
  ) where

import System.Glib.FFI
import System.Glib.GType        (GType)


{-# LINE 40 "./System/Glib/GValue.chs" #-}

newtype GValue = GValue (Ptr (GValue))
{-# LINE 42 "./System/Glib/GValue.chs" #-}

-- | Clear a GValue.
--
valueInit :: GValue -> GType -> IO ()
valueInit :: GValue -> CULong -> IO ()
valueInit GValue
gv CULong
gt = do
  -- The g_type field of the value must be zero or g_value_init will fail.
  (\(GValue Ptr GValue
arg1) CULong
arg2 -> Ptr GValue -> CULong -> IO (Ptr GValue)
g_value_init Ptr GValue
arg1 CULong
arg2) GValue
gv CULong
gt
  () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

-- | Get the type of the value stored in the GValue
--
valueGetType :: GValue -> IO GType
valueGetType :: GValue -> IO CULong
valueGetType (GValue Ptr GValue
gvPtr) = (\Ptr GValue
ptr -> do {Ptr GValue -> Int -> IO CULong
forall b. Ptr b -> Int -> IO CULong
forall a b. Storable a => Ptr b -> Int -> IO a
peekByteOff Ptr GValue
ptr Int
0 ::IO CULong}) Ptr GValue
gvPtr

-- | Temporarily allocate a GValue.
--
allocaGValue :: (GValue -> IO b) -> IO b
allocaGValue :: forall b. (GValue -> IO b) -> IO b
allocaGValue GValue -> IO b
body =
  -- c2hs is broken in that it can't handle arrays of compound arrays in the
  -- sizeof hook
  Int -> (Ptr GValue -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes (Int
8Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
8) ((Ptr GValue -> IO b) -> IO b) -> (Ptr GValue -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr GValue
gvPtr -> do
  -- The g_type field of the value must be zero or g_value_init will fail.
  (\Ptr GValue
ptr CULong
val -> do {Ptr GValue -> Int -> CULong -> IO ()
forall b. Ptr b -> Int -> CULong -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr GValue
ptr Int
0 (CULong
val::CULong)}) Ptr GValue
gvPtr (CULong
0 :: GType)
  b
result <- GValue -> IO b
body (Ptr GValue -> GValue
GValue Ptr GValue
gvPtr)
  (\(GValue Ptr GValue
arg1) -> Ptr GValue -> IO ()
g_value_unset Ptr GValue
arg1) (Ptr GValue -> GValue
GValue Ptr GValue
gvPtr)
  b -> IO b
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return b
result

foreign import ccall unsafe "g_value_init"
  g_value_init :: ((Ptr GValue) -> (CULong -> (IO (Ptr GValue))))

foreign import ccall unsafe "g_value_unset"
  g_value_unset :: ((Ptr GValue) -> (IO ()))