bda62ac3b7
* glib/Value.cs : Tried adding CallingConvention.Cdecl to all the DllImports, but still couldn't get reliable Propery setting without periodic NullReference exceptions. When all else fails, drop back and punt. * glib/Object.cs : Rewrote Set|GetProperty methods. Now they use g_object_get|set and don't rely on GValues. The int, bool, and string prop types are now working reliably. * gtk/Window.cs : Update all Properties to use new GLib.Object signatures. * sample/HelloWorld.cs : added some more property usage for testing purposes. svn path=/trunk/gtk-sharp/; revision=1048
220 lines
4.9 KiB
C#
Executable file
220 lines
4.9 KiB
C#
Executable file
// GLib.Value.cs - GLib Value class implementation
|
|
//
|
|
// Author: Mike Kestner <mkestner@speakeasy.net>
|
|
//
|
|
// (c) 2001 Mike Kestner
|
|
|
|
namespace GLib {
|
|
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
/// <summary>
|
|
/// Value Class
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// An arbitrary data type similar to a CORBA Any which is used
|
|
/// to get and set properties on Objects.
|
|
/// </remarks>
|
|
|
|
public class Value {
|
|
|
|
IntPtr _val;
|
|
|
|
|
|
// Destructor is required since we are allocating unmananged
|
|
// heap resources.
|
|
|
|
[DllImport("glib-1.3.dll")]
|
|
static extern void g_free (IntPtr mem);
|
|
|
|
~Value ()
|
|
{
|
|
g_free (_val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value Constructor
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Creates an uninitialized Value on the unmanaged heap.
|
|
/// Use the Init method prior to attempting to assign a
|
|
/// value to it.
|
|
/// </remarks>
|
|
|
|
[DllImport("glib-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern IntPtr g_malloc0 (long n_bytes);
|
|
|
|
public Value ()
|
|
{
|
|
_val = g_malloc0 (5 * IntPtr.Size);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value Constructor
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Creates an initialized Value of the specified type.
|
|
/// </remarks>
|
|
|
|
public Value (TypeFundamentals type) : this ()
|
|
{
|
|
Init (type);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value Constructor
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Constructs a Value from a specified boolean.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern void g_value_set_boolean (IntPtr val,
|
|
bool data);
|
|
public Value (bool val) : this ()
|
|
{
|
|
g_value_init (_val, TypeFundamentals.TypeBoolean);
|
|
g_value_set_boolean (_val, val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value Constructor
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Constructs a Value from a specified integer.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern void g_value_set_int (IntPtr val, int data);
|
|
|
|
public Value (int val) : this ()
|
|
{
|
|
g_value_init (_val, TypeFundamentals.TypeInt);
|
|
g_value_set_int (_val, val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value Constructor
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Constructs a Value from a specified string.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern void g_value_set_string (IntPtr val,
|
|
IntPtr data);
|
|
public Value (String val) : this ()
|
|
{
|
|
g_value_init (_val, TypeFundamentals.TypeString);
|
|
g_value_set_string (_val,
|
|
Marshal.StringToHGlobalAnsi (val));
|
|
}
|
|
|
|
/// <summary>
|
|
/// Init Method
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Prepares a raw value to hold a specified type.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern void g_value_init (IntPtr val,
|
|
TypeFundamentals type);
|
|
|
|
public void Init (TypeFundamentals type)
|
|
{
|
|
g_value_init (_val, type);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value to Boolean Conversion
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Extracts a bool from a Value. Note, this method
|
|
/// will produce an exception if the Value does not hold a
|
|
/// boolean value.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern bool g_value_get_boolean (IntPtr val);
|
|
|
|
public static explicit operator bool (Value val)
|
|
{
|
|
// FIXME: Insert an appropriate exception here if
|
|
// _val.type indicates an error.
|
|
return g_value_get_boolean (val._val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value to Integer Conversion
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Extracts an int from a Value. Note, this method
|
|
/// will produce an exception if the Value does not hold a
|
|
/// integer value.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern int g_value_get_int (IntPtr val);
|
|
|
|
public static explicit operator int (Value val)
|
|
{
|
|
// FIXME: Insert an appropriate exception here if
|
|
// _val.type indicates an error.
|
|
return g_value_get_int (val._val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Value to String Conversion
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Extracts a string from a Value. Note, this method
|
|
/// will produce an exception if the Value does not hold a
|
|
/// string value.
|
|
/// </remarks>
|
|
|
|
[DllImport("gobject-1.3.dll",
|
|
CallingConvention=CallingConvention.Cdecl)]
|
|
static extern IntPtr g_value_get_string (IntPtr val);
|
|
|
|
public static explicit operator String (Value val)
|
|
{
|
|
// FIXME: Insert an appropriate exception here if
|
|
// _val.type indicates an error.
|
|
return Marshal.PtrToStringAnsi (
|
|
g_value_get_string (val._val));
|
|
}
|
|
|
|
/// <summary>
|
|
/// MarshalAs Property
|
|
/// </summary>
|
|
///
|
|
/// <remarks>
|
|
/// Read only. Accesses a pointer to the raw GValue.
|
|
/// </remarks>
|
|
|
|
public IntPtr MarshalAs {
|
|
get {
|
|
return _val;
|
|
}
|
|
}
|
|
}
|
|
}
|