-- GENERATED by C->Haskell Compiler, version 0.13.4 (gtk2hs branch) "Bin IO", 13 Nov 2004 (Haskell)
-- Edit the ORIGNAL .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 gv gt = do
  -- The g_type field of the value must be zero or g_value_init will fail.
  (\(GValue arg1) arg2 -> g_value_init arg1 arg2) gv gt
  return ()

-- | Get the type of the value stored in the GValue
--
valueGetType :: GValue -> IO GType
valueGetType (GValue gvPtr) = (\ptr -> do {peekByteOff ptr 0 ::IO CUInt}) gvPtr

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

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

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