------------------------------------------------------------------------------
-- GtkAda - Ada95 binding for Gtk+/Gnome --
-- --
-- Copyright (C) 2001-2015, AdaCore --
-- --
-- This library is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the Free --
-- Software Foundation; either version 3, 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 MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- . --
-- --
------------------------------------------------------------------------------
--
-- This package provides an interface to generic values as used in the
-- Glib object model.
--
-- The main type in this package is GValues, which is the
-- equivalent of the C's (GValue*) array, i.e an array of unions. This
-- package provides functions to extract the values from this type.
--
-- 1.3.15
-- Glib, the general-purpose library
with System;
with Interfaces.C.Strings;
with Glib.Object;
package Glib.Values is
-- Do not create automatic documentation for this package
type GValue is private;
-- A generic value that can hold any of the types as provided in the
-- Set and Get functions below.
type GValues is private;
-- This type represents a table of values. Each argument of the
-- table can be of any type.
-- The index of the first element is always 1.
type C_GValues is new System.Address;
-- An array of GValues
type GValue_Array is array (Gint range <>) of GValue;
function Make_Values (Nb : Guint) return GValues;
-- Create a new GValues structure from scratch. This procedure
-- causes the allocation of an underlying C array, and this memory
-- should be deallocated after use using procedure Free (see below).
function Make_Values (Nb : Guint; Val : C_GValues) return GValues;
-- Build a GValues structure from the given C array. Nb should be the
-- number of elements in the Values array.
procedure Free (Val : in out GValues);
-- Deallocate the memory associated with the given Values array.
function Nth (Val : GValues; Num : Guint) return GValue;
-- Return the Num-th element from Values.
-- In general, the returned value does not need to be unset, since it is
-- still handled by C (in particular when processing the parameters for a
-- callback).
--
procedure Unsafe_Nth (Values : C_GValues; Num : Guint; V : in out GValue);
pragma Import (C, Unsafe_Nth, "ada_gvalue_nth");
-- This returns the Num-th element, starting at 0. This procedure does
-- not check that Values contains at least Num elements, so is potentially
-- dangerous.
-- In general, the returned value does not need to be unset, since it is
-- still handled by C (in particular when processing the parameters for a
-- callback).
generic
type T is private;
function Unsafe_Proxy_Nth (Values : C_GValues; Num : Guint) return T;
pragma Inline (Unsafe_Proxy_Nth);
-- Extract a point from Values (at index Num, 0-based), and convert it to
-- T. This is unsafe because no check is made that Num is a valid index,
-- and no check is made that casting to T makes sense.
generic
type T is (<>);
function Unsafe_Enum_Nth
(Values : C_GValues; Num : Guint) return T;
pragma Inline (Unsafe_Enum_Nth);
-- Used for enumeration types
--
-------------------------------------------------
-- Conversion functions, interfacing to GValue --
-------------------------------------------------
procedure Init (Value : in out GValue; G_Type : Glib.GType);
-- Set the type of Value to G_Type. This limits the operations you can then
-- apply to Value. For instance, Value must have been initialized with
-- a GType_Int before you can use Set_Int (see below).
-- Note that for enumeration types, you shouldn't use GType_Enum, but
-- rather the exact GType corresponding to the enumeration.
-- If you need to store a reference-counted type in a GValue, it is
-- recommanded that you use a type derived from Boxed (see Set_Boxed below)
procedure Unset (Value : in out GValue);
-- Frees the memory allocate for Value (like strings contents) in the call
-- to Init. You only need to call this function in cases where you have
-- called Init yourself.
function Type_Of (Value : GValue) return Glib.GType;
pragma Inline (Type_Of);
-- Return the type of data that Value contains.
-- It returns GType_Invalid if Value was not initialized
procedure Set_Char (Value : in out GValue; V_Char : Gchar);
function Get_Char (Value : GValue) return Gchar;
procedure Set_Uchar (Value : in out GValue; V_Uchar : Guchar);
function Get_Uchar (Value : GValue) return Guchar;
procedure Init_Set_Boolean (Value : in out GValue; V : Boolean);
procedure Set_Boolean (Value : in out GValue; V_Boolean : Boolean);
function Get_Boolean (Value : GValue) return Boolean;
-- Set_Boolean must only be called when Init has already been used.
-- Otherwise use Init_Set_Boolean.
procedure Init_Set_Int (Value : in out GValue; V : Gint);
procedure Set_Int (Value : in out GValue; V_Int : Gint);
function Get_Int (Value : GValue) return Gint;
-- Set_Int must only be called when Init has already been used.
-- Otherwise use Init_Set_Int.
procedure Init_Set_Uint (Value : in out GValue; V : Guint);
procedure Set_Uint (Value : in out GValue; V_Uint : Guint);
function Get_Uint (Value : GValue) return Guint;
procedure Set_Long (Value : in out GValue; V_Long : Glong);
function Get_Long (Value : GValue) return Glong;
procedure Set_Ulong (Value : in out GValue; V_Ulong : Gulong);
function Get_Ulong (Value : GValue) return Gulong;
procedure Set_Float (Value : in out GValue; V_Float : Gfloat);
function Get_Float (Value : GValue) return Gfloat;
procedure Set_Double (Value : in out GValue; V_Double : Gdouble);
function Get_Double (Value : GValue) return Gdouble;
procedure Init_Set_String (Value : in out GValue; V : String);
procedure Set_String (Value : in out GValue; V_String : String);
function Get_String (Value : GValue) return String;
function Get_String (Value : GValue; Length : Gint) return String;
function Get_Chars (Value : GValue) return Interfaces.C.Strings.chars_ptr;
procedure Set_Proxy (Value : in out GValue; V_Proxy : C_Proxy);
function Get_Proxy (Value : GValue) return C_Proxy;
procedure Set_Address (Value : in out GValue; V_Address : System.Address);
function Get_Address (Value : GValue) return System.Address;
procedure Set_Boxed (Value : in out GValue; V_Address : System.Address);
function Get_Boxed (Value : GValue) return System.Address;
-- This is similar to Set_Address and Get_Address, except that the boxed
-- type might have been associated with some specific initialization and
-- finalization functions through Glib.Boxed_Type_Register_Static
-- For instance:
-- declare
-- Typ : Glib.GType;
-- Value : GValue;
-- function To_Ref_Counted_Value is new Ada.Unchecked_Conversion
-- (System.Address, My_Ref_Counted_Type);
-- begin
-- Typ := Boxed_Typed_Register_Static
-- ("FOO", Copy'Access, Free'Access);
-- Init (Value, Typ);
-- Set_Boxed (Value, my_ref_counted_value.all'address);
--
-- Val := To_Ref_Counted_Value (Get_Boxed (Value));
-- Unset (Value);
-- end;
--
-- See also Glib.Generic_Properties.Generic_Internal_Boxed_Property.
procedure Set_Enum (Value : in out GValue; V_Enum : Gint);
function Get_Enum (Value : GValue) return Glib.Gint;
-- These are used to manipulate the standard GtkAda enumeration types.
-- For types that you have redefined yourself, you have access to more
-- suitable functions directly in the package Generic_Enumeration_Property.
procedure Set_Flags (Value : in out GValue; V_Enum : Guint);
function Get_Flags (Value : GValue) return Glib.Guint;
-- ??? Should really manipulate Glib.Properties.Creation.Flags_Int_Value
procedure Set_Object
(Value : in out GValue; To : access Glib.Object.GObject_Record'Class);
function Get_Object (Value : GValue) return Glib.Object.GObject;
-- These are used to manipulate GObject instances.
-- Convenience function to Get and Set a Gtk_Text_Iter are
-- also provided inside Gtk.Text_Iter.
private
type GValue_Data is array (1 .. 2) of Guint64;
type GValue is record
g_type : GType := GType_Invalid;
data : GValue_Data;
end record;
pragma Convention (C, GValue);
type GValues is record
Nb : Guint;
Arr : C_GValues;
end record;
pragma Import (C, Set_Char, "g_value_set_char");
pragma Import (C, Get_Char, "g_value_get_char");
pragma Import (C, Set_Uchar, "g_value_set_uchar");
pragma Import (C, Get_Uchar, "g_value_get_uchar");
pragma Import (C, Set_Int, "g_value_set_int");
pragma Import (C, Get_Int, "g_value_get_int");
pragma Import (C, Set_Uint, "g_value_set_uint");
pragma Import (C, Get_Uint, "g_value_get_uint");
pragma Import (C, Set_Long, "g_value_set_long");
pragma Import (C, Get_Long, "g_value_get_long");
pragma Import (C, Set_Ulong, "g_value_set_ulong");
pragma Import (C, Get_Ulong, "g_value_get_ulong");
pragma Import (C, Set_Float, "g_value_set_float");
pragma Import (C, Get_Float, "g_value_get_float");
pragma Import (C, Set_Double, "g_value_set_double");
pragma Import (C, Get_Double, "g_value_get_double");
pragma Import (C, Set_Proxy, "g_value_set_pointer");
pragma Import (C, Set_Address, "g_value_set_pointer");
pragma Import (C, Set_Enum, "g_value_set_enum");
pragma Import (C, Get_Enum, "g_value_get_enum");
pragma Import (C, Get_Chars, "g_value_get_string");
pragma Import (C, Set_Flags, "g_value_set_flags");
pragma Import (C, Get_Flags, "g_value_get_flags");
pragma Import (C, Set_Boxed, "g_value_set_boxed");
pragma Import (C, Get_Boxed, "g_value_get_boxed");
pragma Import (C, Unset, "g_value_unset");
-- ??? We use our own version here, that doesn't check the type of
-- GValue. This is used for signals (Gtk.Handlers), but should be
-- cleaned up.
pragma Import (C, Get_Address, "ada_gvalue_get_pointer");
pragma Import (C, Get_Proxy, "ada_gvalue_get_pointer");
pragma Inline (Make_Values);
pragma Inline (Set_Boolean);
pragma Inline (Get_Boolean);
pragma Inline (Set_String);
pragma Inline (Get_String);
--
end Glib.Values;