2004-04-12 Mike Kestner <mkestner@ximian.com>

[Rework of a patch from Ben Maurer to turn GLib.Value
	into a valuetype.]
	* generator/BoxedGen.cs : fix operators for new valuetype GValues.
	* generator/ByRefGen.cs : new generatable for byref value types.
	* generator/Makefile.am : add ByRefGen.cs.
	* generator/MethodBody.cs : remove GValue special casing.
	* generator/Property.cs : rework value handling.
	* generator/Signal.cs : fix base virtual method value passing.
	* generator/SymbolTable.cs : map GValue to ByRefGen.
	* glib/Object.cs : rework GetProperty and SetProperty.
	* glib/Value.cs : make it a value type.
	* glib/ValueArray.cs : fix GValue passing.
	* glib/glue/value.c : rework for valuetype GValues.
	* gnome/Program.custom : fix GValue passing
	* gtk/Gtk.metadata : make TreeModel.GetValue value param pass_as=ref.
	* gtk/ListStore.custom : fix GValue passing
	* gtk/NodeStore.cs : fix GValue passing
	* gtk/TextTag.custom : fix GValue passing
	* gtk/TreeModelSort.custom : fix GValue passing
	* gtk/TreeStore.custom : fix GValue passing

svn path=/trunk/gtk-sharp/; revision=25368
This commit is contained in:
Mike Kestner 2004-04-12 15:54:57 +00:00
parent fb74f1f04d
commit 1ac00ff205
19 changed files with 327 additions and 575 deletions

View file

@ -1,3 +1,26 @@
2004-04-12 Mike Kestner <mkestner@ximian.com>
[Rework of a patch from Ben Maurer to turn GLib.Value
into a valuetype.]
* generator/BoxedGen.cs : fix operators for new valuetype GValues.
* generator/ByRefGen.cs : new generatable for byref value types.
* generator/Makefile.am : add ByRefGen.cs.
* generator/MethodBody.cs : remove GValue special casing.
* generator/Property.cs : rework value handling.
* generator/Signal.cs : fix base virtual method value passing.
* generator/SymbolTable.cs : map GValue to ByRefGen.
* glib/Object.cs : rework GetProperty and SetProperty.
* glib/Value.cs : make it a value type.
* glib/ValueArray.cs : fix GValue passing.
* glib/glue/value.c : rework for valuetype GValues.
* gnome/Program.custom : fix GValue passing
* gtk/Gtk.metadata : make TreeModel.GetValue value param pass_as=ref.
* gtk/ListStore.custom : fix GValue passing
* gtk/NodeStore.cs : fix GValue passing
* gtk/TextTag.custom : fix GValue passing
* gtk/TreeModelSort.custom : fix GValue passing
* gtk/TreeStore.custom : fix GValue passing
2004-04-05 Larry Ewing <lewing@ximian.com>
* gnome/Gnome.metadata: Make data an array type so that the image

View file

@ -24,27 +24,28 @@ namespace GtkSharp.Generation {
{
StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name);
base.Generate (gen_info);
sw.WriteLine ("\t\t[DllImport(\"glibsharpglue\")]");
sw.WriteLine ("\t\tstatic extern IntPtr gtksharp_value_create (GLib.GType gtype);");
sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]");
sw.WriteLine ("\t\tstatic extern IntPtr g_value_init (ref GLib.Value val, GLib.GType gtype);");
sw.WriteLine ();
sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]");
sw.WriteLine ("\t\tstatic extern IntPtr g_value_get_boxed (IntPtr handle);");
sw.WriteLine ("\t\tstatic extern IntPtr g_value_get_boxed (ref GLib.Value val);");
sw.WriteLine ();
sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]");
sw.WriteLine ("\t\tstatic extern void g_value_set_boxed (IntPtr handle, ref " + QualifiedName + " boxed);");
sw.WriteLine ("\t\tstatic extern void g_value_set_boxed (ref GLib.Value val, ref " + QualifiedName + " boxed);");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic static explicit operator GLib.Value (" + QualifiedName + " boxed)");
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\tIntPtr handle = gtksharp_value_create (" + QualifiedName + ".GType);");
sw.WriteLine ("\t\t\tg_value_set_boxed (handle, ref boxed);");
sw.WriteLine ("\t\t\treturn new GLib.Value (handle, IntPtr.Zero);");
sw.WriteLine ("\t\t\tGLib.Value val = GLib.Value.Empty;");
sw.WriteLine ("\t\t\tg_value_init (ref val, " + QualifiedName + ".GType);");
sw.WriteLine ("\t\t\tg_value_set_boxed (ref val, ref boxed);");
sw.WriteLine ("\t\t\treturn val;");
sw.WriteLine ("\t\t}");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic static explicit operator " + QualifiedName + " (GLib.Value val)");
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\tIntPtr boxed_ptr = g_value_get_boxed (val.Handle);");
sw.WriteLine ("\t\t\tIntPtr boxed_ptr = g_value_get_boxed (ref val);");
sw.WriteLine ("\t\t\treturn New (boxed_ptr);");
sw.WriteLine ("\t\t}");

91
generator/ByRefGen.cs Normal file
View file

@ -0,0 +1,91 @@
// GtkSharp.Generation.ByRefGen.cs - The ByRef type Generatable.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2003 Mike Kestner
namespace GtkSharp.Generation {
using System;
public class ByRefGen : IGeneratable {
string type;
string ctype;
string ns = "";
public ByRefGen (string ctype, string type)
{
string[] toks = type.Split('.');
this.ctype = ctype;
this.type = toks[toks.Length - 1];
if (toks.Length > 2)
this.ns = String.Join (".", toks, 0, toks.Length - 2);
else if (toks.Length == 2)
this.ns = toks[0];
}
public string CName {
get
{
return ctype;
}
}
public string Name {
get
{
return type;
}
}
public string QualifiedName {
get
{
return ns + "." + type;
}
}
public string MarshalType {
get
{
return "ref " + QualifiedName;
}
}
public virtual string MarshalReturnType {
get
{
return QualifiedName;
}
}
public string CallByName (string var_name)
{
return "ref " + var_name;
}
public string FromNative(string var)
{
return var;
}
public virtual string FromNativeReturn(string var)
{
return var;
}
public virtual string ToNativeReturn(string var)
{
return var;
}
public void Generate ()
{
}
public void Generate (GenerationInfo gen_info)
{
}
}
}

View file

@ -9,6 +9,7 @@ references =
sources = \
AliasGen.cs \
BoxedGen.cs \
ByRefGen.cs \
CallbackGen.cs \
ClassBase.cs \
ClassGen.cs \

View file

@ -75,7 +75,7 @@ namespace GtkSharp.Generation {
if (igen is EnumGen)
call_parm = p.Name + "_as_int";
else if (UsesHandle (igen) || p.CSType == "GLib.Value") {
else if (UsesHandle (igen)) {
call_parm = p.PassAs + " " + call_parm.Replace (".Handle", "_handle");
}
}
@ -91,6 +91,7 @@ namespace GtkSharp.Generation {
string call_string = String.Join (", ", result);
call_string = call_string.Replace ("out ref", "out");
call_string = call_string.Replace ("out out ", "out ");
call_string = call_string.Replace ("ref ref", "ref");
return call_string;
}
@ -111,11 +112,11 @@ namespace GtkSharp.Generation {
if (is_get) {
sw.WriteLine (indent + "\t\t\t" + p.CSType + " " + name + ";");
if (p.PassAs != "out" && (UsesHandle (gen) || p.CSType == "GLib.Value"))
if (p.PassAs != "out" && UsesHandle (gen))
sw.WriteLine(indent + "\t\t\t" + name + " = new " + p.CSType + "();");
}
if ((is_get || p.PassAs == "out") && (UsesHandle (gen) || p.CSType == "GLib.Value"))
if ((is_get || p.PassAs == "out") && UsesHandle (gen))
sw.WriteLine(indent + "\t\t\tIntPtr " + name + "_handle;");
if (p.PassAs == "out" && gen is EnumGen)
@ -161,7 +162,7 @@ namespace GtkSharp.Generation {
IGeneratable gen = p.Generatable;
if (p.PassAs == "out" && (UsesHandle (gen) || p.CSType == "GLib.Value"))
if (p.PassAs == "out" && UsesHandle (gen))
sw.WriteLine(indent + "\t\t\t" + p.Name + " = " + gen.FromNativeReturn (p.Name + "_handle") + ";");
}
}

View file

@ -132,8 +132,7 @@ namespace GtkSharp.Generation {
sw.WriteLine();
} else if (elem.HasAttribute("readable")) {
sw.WriteLine("\t\t\tget {");
sw.WriteLine("\t\t\t\tGLib.Value val = new GLib.Value (Handle, " + cname + ");");
sw.WriteLine("\t\t\t\tGetProperty(" + cname + ", val);");
sw.WriteLine("\t\t\t\tGLib.Value val = GetProperty (" + cname + ");");
if (table.IsObject (c_type)) {
sw.WriteLine("\t\t\t\tSystem.IntPtr raw_ret = (System.IntPtr) {0} val;", v_type);
sw.WriteLine("\t\t\t\t" + cs_type + " ret = " + table.FromNativeReturn(c_type, "raw_ret") + ";");
@ -150,6 +149,7 @@ namespace GtkSharp.Generation {
sw.WriteLine("val;");
}
sw.WriteLine("\t\t\t\tval.Dispose ();");
sw.WriteLine("\t\t\t\treturn ret;");
sw.WriteLine("\t\t\t}");
}
@ -160,20 +160,22 @@ namespace GtkSharp.Generation {
sw.WriteLine();
} else if (elem.HasAttribute("writeable") && !elem.HasAttribute("construct-only")) {
sw.WriteLine("\t\t\tset {");
sw.Write("\t\t\t\tSetProperty(" + cname + ", ");
sw.Write("\t\t\t\tGLib.Value val = ");
if (table.IsEnum(c_type)) {
sw.WriteLine("new GLib.Value(Handle, " + cname + ", new GLib.EnumWrapper ((int) value, {0})));", table.IsEnumFlags (c_type) ? "true" : "false");
sw.WriteLine("new GLib.Value(Handle, " + cname + ", new GLib.EnumWrapper ((int) value, {0}));", table.IsEnumFlags (c_type) ? "true" : "false");
} else if (table.IsBoxed (c_type)) {
sw.WriteLine("(GLib.Value) (value));");
sw.WriteLine("(GLib.Value) value;");
} else if (table.IsOpaque (c_type)) {
sw.WriteLine("new GLib.Value(Handle, " + cname + ", value));");
sw.WriteLine("new GLib.Value(Handle, " + cname + ", value);");
} else {
sw.Write("new GLib.Value(");
if (v_type != "" && !(table.IsObject (c_type) || table.IsOpaque (c_type))) {
sw.Write(v_type + " ");
}
sw.WriteLine("value));");
sw.WriteLine("value);");
}
sw.WriteLine("\t\t\t\tSetProperty(" + cname + ", val);");
sw.WriteLine("\t\t\t\tval.Dispose ();");
sw.WriteLine("\t\t\t}");
}

View file

@ -177,7 +177,9 @@ namespace GtkSharp.Generation {
sw.WriteLine ("\t\t[GLib.DefaultSignalHandler(Type=typeof(" + (implementor != null ? implementor.QualifiedName : container_type.QualifiedName) + "), ConnectionMethod=\"Override" + Name +"\")]");
sw.WriteLine ("\t\tprotected virtual {0} {1} ({2})", ReturnType, "On" + Name, vmsig.ToString ());
sw.WriteLine ("\t\t{");
if (!IsVoid)
if (IsVoid)
sw.WriteLine ("\t\t\tGLib.Value ret = GLib.Value.Empty;");
else
sw.WriteLine ("\t\t\tGLib.Value ret = new GLib.Value (" + ReturnGType + ");");
sw.WriteLine ("\t\t\tGLib.ValueArray inst_and_params = new GLib.ValueArray (" + parms.Count + ");");
@ -187,7 +189,7 @@ namespace GtkSharp.Generation {
string cleanup = "";
for (int i = 1; i < parms.Count; i++) {
if (parms [i].PassAs == "out") {
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value ();");
sw.WriteLine ("\t\t\tvals [" + i + "] = GLib.Value.Empty;");
cleanup += "\t\t\t" + parms [i].Name + " = (" + parms [i].CSType + ") vals [" + i + "];\n";
} else if (parms [i].IsLength && parms [i - 1].IsString)
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + parms [i-1].Name + ".Length);");
@ -197,7 +199,7 @@ namespace GtkSharp.Generation {
sw.WriteLine ("\t\t\tinst_and_params.Append (vals [" + i + "]);");
}
sw.WriteLine ("\t\t\tg_signal_chain_from_overridden (inst_and_params.ArrayPtr, " + (IsVoid ? "IntPtr.Zero" : "ret.Handle") + ");");
sw.WriteLine ("\t\t\tg_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);");
if (cleanup != "")
sw.WriteLine (cleanup);
if (!IsVoid)

View file

@ -93,7 +93,7 @@ namespace GtkSharp.Generation {
AddType (new CustomMarshalerGen ("time_t", "System.DateTime", "GLib.time_t_CustomMarshaler"));
AddType (new ManualGen ("GSList", "GLib.SList"));
AddType (new ManualGen ("GList", "GLib.List"));
AddType (new ManualGen ("GValue", "GLib.Value"));
AddType (new ByRefGen ("GValue", "GLib.Value"));
AddType (new ManualGen ("GObject", "GLib.Object"));
}

View file

@ -197,11 +197,13 @@ namespace GLib {
}
}
public GLib.GType GetGType () {
if (_obj == IntPtr.Zero)
return GType.Invalid;
public GLib.GType NativeType {
get {
if (_obj == IntPtr.Zero)
return GType.Invalid;
return new GLib.GType (gtksharp_get_type_id (_obj));
return new GLib.GType (gtksharp_get_type_id (_obj));
}
}
public IntPtr Handle {
@ -261,19 +263,21 @@ namespace GLib {
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_object_get_property (IntPtr obj, string name, IntPtr val);
static extern void g_object_get_property (IntPtr obj, string name, ref GLib.Value val);
protected void GetProperty (String name, GLib.Value val)
protected GLib.Value GetProperty (string name)
{
g_object_get_property (Raw, name, val.Handle);
Value val = new Value (this, name);
g_object_get_property (Raw, name, ref val);
return val;
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_object_set_property (IntPtr obj, string name, IntPtr val);
static extern void g_object_set_property (IntPtr obj, string name, ref GLib.Value val);
protected void SetProperty (String name, GLib.Value val)
protected void SetProperty (string name, GLib.Value val)
{
g_object_set_property (Raw, name, val.Handle);
g_object_set_property (Raw, name, ref val);
}
[DllImport("glibsharpglue")]
@ -285,7 +289,7 @@ namespace GLib {
}
[DllImport("libgobject-2.0-0.dll")]
protected static extern void g_signal_chain_from_overridden (IntPtr args, IntPtr retval);
protected static extern void g_signal_chain_from_overridden (IntPtr args, ref GLib.Value retval);
[DllImport("glibsharpglue")]
static extern bool gtksharp_is_object (IntPtr obj);

View file

@ -2,7 +2,8 @@
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2001 Mike Kestner, (c) 2003 Novell, Inc.
// Copyright (c) 2001 Mike Kestner
// Copyright (c) 2003-2004 Novell, Inc.
namespace GLib {
@ -11,168 +12,55 @@ namespace GLib {
using System.Runtime.InteropServices;
using GLibSharp;
/// <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>
[StructLayout (LayoutKind.Sequential)]
public class Value : IDisposable {
public struct Value : IDisposable {
IntPtr _val;
bool needs_dispose = true;
GType type;
long pad_1;
long pad_2;
// Destructor is required since we are allocating unmanaged
// heap resources.
[DllImport("libglib-2.0-0.dll")]
static extern void g_free (IntPtr mem);
public static Value Empty;
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_unset (IntPtr mem);
static extern void g_value_init (ref GLib.Value val, IntPtr gtype);
~Value ()
{
Dispose ();
}
static bool idle_queued;
static Queue idle_queue = new Queue ();
static bool DoDispose ()
{
IntPtr [] vals;
lock (idle_queue){
vals = new IntPtr [idle_queue.Count];
idle_queue.CopyTo (vals, 0);
idle_queue.Clear ();
}
lock (typeof (Value))
idle_queued = false;
foreach (IntPtr v in vals) {
if (v == IntPtr.Zero)
continue;
g_value_unset (v);
g_free (v);
}
return false;
}
public void Dispose () {
if (_val != IntPtr.Zero && needs_dispose) {
lock (idle_queue) {
idle_queue.Enqueue (_val);
lock (typeof (Value)){
if (!idle_queued) {
Idle.Add (new IdleHandler (DoDispose));
idle_queued = true;
}
}
}
_val = IntPtr.Zero;
}
if (buf != IntPtr.Zero) {
Marshal.FreeHGlobal (buf);
buf = IntPtr.Zero;
}
}
// import the glue function to allocate values on heap
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_unset (ref GLib.Value val);
[DllImport("glibsharpglue")]
static extern IntPtr gtksharp_value_create(IntPtr type);
static extern IntPtr gtksharp_value_create_from_property(ref GLib.Value val, IntPtr obj, string name);
[DllImport("glibsharpglue")]
static extern IntPtr gtksharp_value_create_from_property(IntPtr obj, string name);
// Constructor to wrap a raw GValue ref. We need the dummy param
// to distinguish this ctor from the TypePointer ctor.
public Value (IntPtr val, IntPtr dummy)
public void Dispose ()
{
_val = val;
needs_dispose = false;
g_value_unset (ref this);
}
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a new empty value that can be used
/// to receive "out" GValue parameters.
/// </remarks>
public Value () {
_val = gtksharp_value_create (GType.Invalid.Val);
}
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a new empty initialized value that can be used
/// to receive "out" GValue parameters.
/// </remarks>
public Value (GLib.GType gtype) {
_val = gtksharp_value_create (gtype.Val);
}
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value corresponding to the type of the
/// specified property.
/// </remarks>
public Value (IntPtr obj, string prop_name)
public Value (GLib.GType gtype)
{
_val = gtksharp_value_create_from_property (obj, prop_name);
type = GType.Invalid;
pad_1 = pad_2 = 0;
g_value_init (ref this, gtype.Val);
}
public Value (GLib.Object obj, string prop_name)
{
type = GType.Invalid;
pad_1 = pad_2 = 0;
gtksharp_value_create_from_property (ref this, obj.Handle, prop_name);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_boolean (IntPtr val, bool data);
static extern void g_value_set_boolean (ref Value val, bool data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified boolean.
/// </remarks>
public Value (bool val)
public Value (bool val) : this (GType.Boolean)
{
_val = gtksharp_value_create(GType.Boolean.Val);
g_value_set_boolean (_val, val);
g_value_set_boolean (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_boxed (IntPtr val, IntPtr data);
static extern void g_value_set_boxed (ref Value val, IntPtr data);
/*
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified boxed type.
/// </remarks>
public Value (GLib.Boxed val)
{
_val = gtksharp_value_create(GType.Boxed);
@ -188,481 +76,222 @@ namespace GLib {
public Value (IntPtr obj, string prop_name, Opaque val)
{
_val = gtksharp_value_create_from_property (obj, prop_name);
g_value_set_boxed (_val, val.Handle);
type = GType.Invalid;
pad_1 = pad_2 = 0;
gtksharp_value_create_from_property (ref this, obj, prop_name);
g_value_set_boxed (ref this, val.Handle);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_double (IntPtr val, double data);
static extern void g_value_set_double (ref Value val, double data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified double.
/// </remarks>
public Value (double val)
public Value (double val) : this (GType.Double)
{
_val = gtksharp_value_create (GType.Double.Val);
g_value_set_double (_val, val);
g_value_set_double (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_float (IntPtr val, float data);
static extern void g_value_set_float (ref Value val, float data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified float.
/// </remarks>
public Value (float val)
public Value (float val) : this (GType.Float)
{
_val = gtksharp_value_create (GType.Float.Val);
g_value_set_float (_val, val);
g_value_set_float (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_int (IntPtr val, int data);
static extern void g_value_set_int (ref Value val, int data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified integer.
/// </remarks>
public Value (int val)
public Value (int val) : this (GType.Int)
{
_val = gtksharp_value_create (GType.Int.Val);
g_value_set_int (_val, val);
g_value_set_int (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_object (IntPtr val, IntPtr data);
static extern void g_value_set_object (ref Value val, IntPtr data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified object.
/// </remarks>
public Value (GLib.Object val)
public Value (GLib.Object val) : this (val.NativeType)
{
_val = gtksharp_value_create (val.GetGType ().Val);
g_value_set_object (_val, val.Handle);
g_value_set_object (ref this, val.Handle);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_pointer (IntPtr val, IntPtr data);
static extern void g_value_set_pointer (ref Value val, IntPtr data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified pointer.
/// </remarks>
public Value (IntPtr val)
public Value (IntPtr val) : this (GType.Pointer)
{
_val = gtksharp_value_create (GType.Pointer.Val);
g_value_set_pointer (_val, val);
g_value_set_pointer (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_string (IntPtr val, string data);
static extern void g_value_set_string (ref Value val, string data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified string.
/// </remarks>
public Value (string val)
public Value (string val) : this (GType.String)
{
_val = gtksharp_value_create (GType.String.Val);
g_value_set_string (_val, val);
g_value_set_string (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_uint (IntPtr val, uint data);
static extern void g_value_set_uint (ref Value val, uint data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified uint.
/// </remarks>
public Value (uint val)
public Value (uint val) : this (GType.UInt)
{
_val = gtksharp_value_create (GType.UInt.Val);
g_value_set_uint (_val, val);
g_value_set_uint (ref this, val);
}
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified ushort.
/// </remarks>
public Value (ushort val)
public Value (ushort val) : this (GType.UInt)
{
_val = gtksharp_value_create (GType.UInt.Val);
g_value_set_uint (_val, val);
g_value_set_uint (ref this, val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_enum (IntPtr val, int data);
static extern void g_value_set_enum (ref Value val, int data);
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_flags (IntPtr val, uint data);
static extern void g_value_set_flags (ref Value val, uint data);
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_set_char (IntPtr val, char data);
static extern void g_value_set_char (ref Value val, char data);
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified enum wrapper.
/// </remarks>
public Value (IntPtr obj, string prop_name, EnumWrapper wrap)
{
_val = gtksharp_value_create_from_property (obj, prop_name);
type = GType.Invalid;
pad_1 = pad_2 = 0;
gtksharp_value_create_from_property (ref this, obj, prop_name);
if (wrap.flags)
g_value_set_flags (_val, (uint) (int) wrap);
g_value_set_flags (ref this, (uint) (int) wrap);
else
g_value_set_enum (_val, (int) wrap);
g_value_set_enum (ref this, (int) wrap);
}
[DllImport("libgobject-2.0-0.dll")]
static extern bool g_type_is_a (IntPtr type, IntPtr is_a_type);
IntPtr buf = IntPtr.Zero;
/// <summary>
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from any object, including a managed
/// type.
/// </remarks>
public Value (object obj)
{
type = GType.Invalid;
pad_1 = pad_2 = 0;
GType type = TypeConverter.LookupType (obj.GetType ());
if (type == GType.None) {
_val = gtksharp_value_create (ManagedValue.GType.Val);
g_value_init (ref this, ManagedValue.GType.Val);
} else if (type == GType.Object) {
_val = gtksharp_value_create (((GLib.Object) obj).GetGType ().Val);
g_value_init (ref this, ((GLib.Object) obj).NativeType.Val);
} else {
_val = gtksharp_value_create (type.Val);
g_value_init (ref this, type.Val);
}
if (type == GType.None)
g_value_set_boxed (_val, ManagedValue.WrapObject (obj));
else if (type == GType.String)
g_value_set_string (_val, (string) obj);
else if (type == GType.Boolean)
g_value_set_boolean (_val, (bool) obj);
else if (type == GType.Int)
g_value_set_int (_val, (int) obj);
else if (type == GType.Double)
g_value_set_double (_val, (double) obj);
else if (type == GType.Float)
g_value_set_float (_val, (float) obj);
else if (type == GType.Char)
g_value_set_char (_val, (char) obj);
else if (type == GType.UInt)
g_value_set_uint (_val, (uint) obj);
else if (type == GType.Object)
g_value_set_object (_val, ((GLib.Object) obj).Handle);
else if (type == GType.Pointer) {
if (obj is IWrapper) {
g_value_set_pointer (_val, ((IWrapper)obj).Handle);
return;
}
buf = Marshal.AllocHGlobal (Marshal.SizeOf (obj.GetType()));
Marshal.StructureToPtr (obj, buf, false);
g_value_set_pointer (_val, buf);
} else if (g_type_is_a (type.Val, GLib.GType.Boxed.Val)) {
if (obj is IWrapper) {
g_value_set_boxed (_val, ((IWrapper)obj).Handle);
return;
}
buf = Marshal.AllocHGlobal (Marshal.SizeOf (obj.GetType()));
Marshal.StructureToPtr (obj, buf, false);
g_value_set_boxed (_val, buf);
} else
throw new Exception ("Unknown type");
Val = obj;
}
[DllImport("libgobject-2.0-0.dll")]
static extern bool g_value_get_boolean (IntPtr val);
/// <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>
static extern bool g_value_get_boolean (ref Value 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);
return g_value_get_boolean (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_boxed (IntPtr val);
static extern IntPtr g_value_get_boxed (ref Value val);
public static explicit operator GLib.Opaque (Value val)
{
return GLib.Opaque.GetOpaque (g_value_get_boxed (val._val));
return GLib.Opaque.GetOpaque (g_value_get_boxed (ref val));
}
/// <summary>
/// Value to Boxed Conversion
/// </summary>
///
/// <remarks>
/// Extracts a boxed type from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// boxed type value.
/// </remarks>
public static explicit operator GLib.Boxed (Value val)
{
return new GLib.Boxed (g_value_get_boxed (val._val));
return new GLib.Boxed (g_value_get_boxed (ref val));
}
[DllImport("libgobject-2.0-0.dll")]
static extern double g_value_get_double (IntPtr val);
/// <summary>
/// Value to Double Conversion
/// </summary>
///
/// <remarks>
/// Extracts a double from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// double value.
/// </remarks>
static extern double g_value_get_double (ref Value val);
public static explicit operator double (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return g_value_get_double (val._val);
return g_value_get_double (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern float g_value_get_float (IntPtr val);
/// <summary>
/// Value to Float Conversion
/// </summary>
///
/// <remarks>
/// Extracts a float from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// float value.
/// </remarks>
static extern float g_value_get_float (ref Value val);
public static explicit operator float (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return g_value_get_float (val._val);
return g_value_get_float (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern int g_value_get_int (IntPtr 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>
static extern int g_value_get_int (ref Value 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);
return g_value_get_int (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_object (IntPtr val);
/// <summary>
/// Value to Object Conversion
/// </summary>
///
/// <remarks>
/// Extracts an object from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// object value.
/// </remarks>
static extern IntPtr g_value_get_object (ref Value val);
public static explicit operator GLib.Object (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return GLib.Object.GetObject(g_value_get_object (val._val), true);
return GLib.Object.GetObject(g_value_get_object (ref val), true);
}
/// <summary>
/// Value to Unresolved Object Conversion
/// </summary>
///
/// <remarks>
/// Extracts an object from a Value without looking up its wrapping
/// class.
/// Note, this method will produce an exception if the Value does
/// not hold a object value.
/// </remarks>
public static explicit operator GLib.UnwrappedObject (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return new UnwrappedObject(g_value_get_object (val._val));
return new UnwrappedObject(g_value_get_object (ref val));
}
[DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_pointer (IntPtr val);
/// <summary>
/// Value to Pointer Conversion
/// </summary>
///
/// <remarks>
/// Extracts a pointer from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// pointer value.
/// </remarks>
static extern IntPtr g_value_get_pointer (ref Value val);
public static explicit operator IntPtr (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return g_value_get_pointer (val._val);
return g_value_get_pointer (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_string (IntPtr 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>
static extern IntPtr g_value_get_string (ref Value val);
public static explicit operator String (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
IntPtr str = g_value_get_string (val._val);
IntPtr str = g_value_get_string (ref val);
return str == IntPtr.Zero ? null : Marshal.PtrToStringAnsi (str);
}
[DllImport("libgobject-2.0-0.dll")]
static extern uint g_value_get_uint (IntPtr val);
/// <summary>
/// Value to Unsigned Integer Conversion
/// </summary>
///
/// <remarks>
/// Extracts an uint from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// unsigned integer value.
/// </remarks>
static extern uint g_value_get_uint (ref Value val);
public static explicit operator uint (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return g_value_get_uint (val._val);
return g_value_get_uint (ref val);
}
/// <summary>
/// Value to Unsigned Short Conversion
/// </summary>
///
/// <remarks>
/// Extracts a ushort from a Value. Note, this method
/// will produce an exception if the Value does not hold a
/// unsigned integer value.
/// </remarks>
public static explicit operator ushort (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
return (ushort) g_value_get_uint (val._val);
return (ushort) g_value_get_uint (ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern int g_value_get_enum (IntPtr val);
static extern int g_value_get_enum (ref Value val);
[DllImport("libgobject-2.0-0.dll")]
static extern uint g_value_get_flags (IntPtr val);
/// <summary>
/// Value to Enum Conversion
/// </summary>
///
/// <remarks>
/// Extracts an enum from a Value. Note, this method
/// will produce an exception if the Value does not hold an
/// enum value.
/// </remarks>
static extern uint g_value_get_flags (ref Value val);
public static explicit operator EnumWrapper (Value val)
{
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
// FIXME: handle flags
return new EnumWrapper (g_value_get_enum (val._val), false);
return new EnumWrapper (g_value_get_enum (ref val), false);
}
[DllImport("glibsharpglue")]
static extern IntPtr gtksharp_value_get_value_type (IntPtr val);
static extern IntPtr gtksharp_value_get_value_type (ref Value val);
[DllImport("libgobject-2.0-0.dll")]
static extern bool g_type_is_a (IntPtr type, IntPtr is_a_type);
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_take_boxed (ref Value val, IntPtr data);
public object Val
{
get {
GLib.GType type = new GLib.GType (gtksharp_value_get_value_type (_val));
GLib.GType type = new GLib.GType (gtksharp_value_get_value_type (ref this));
if (type == ManagedValue.GType) {
return ManagedValue.ObjectForWrapper (g_value_get_boxed (_val));
return ManagedValue.ObjectForWrapper (g_value_get_boxed (ref this));
}
if (type == GType.String)
@ -685,42 +314,45 @@ namespace GLib {
throw new Exception ("Unknown type");
}
set {
IntPtr buf;
GType type = GLibSharp.TypeConverter.LookupType (value.GetType());
if (type == GType.None)
g_value_set_boxed (_val, ManagedValue.WrapObject (value));
g_value_set_boxed (ref this, ManagedValue.WrapObject (value));
else if (type == GType.String)
g_value_set_string (_val, (string) value);
g_value_set_string (ref this, (string) value);
else if (type == GType.Boolean)
g_value_set_boolean (_val, (bool) value);
g_value_set_boolean (ref this, (bool) value);
else if (type == GType.Int)
g_value_set_int (_val, (int) value);
g_value_set_int (ref this, (int) value);
else if (type == GType.Double)
g_value_set_double (_val, (double) value);
g_value_set_double (ref this, (double) value);
else if (type == GType.Float)
g_value_set_float (_val, (float) value);
g_value_set_float (ref this, (float) value);
else if (type == GType.Char)
g_value_set_char (_val, (char) value);
g_value_set_char (ref this, (char) value);
else if (type == GType.UInt)
g_value_set_uint (_val, (uint) value);
g_value_set_uint (ref this, (uint) value);
else if (type == GType.Object)
g_value_set_object (_val, ((GLib.Object) value).Handle);
else
g_value_set_object (ref this, ((GLib.Object) value).Handle);
else if (type == GType.Pointer) {
if (value is IWrapper) {
g_value_set_pointer (ref this, ((IWrapper)value).Handle);
return;
}
buf = Marshal.AllocHGlobal (Marshal.SizeOf (value.GetType()));
Marshal.StructureToPtr (value, buf, false);
g_value_set_pointer (ref this, buf);
} else if (g_type_is_a (type.Val, GLib.GType.Boxed.Val)) {
if (value is IWrapper) {
g_value_set_boxed (ref this, ((IWrapper)value).Handle);
return;
}
buf = Marshal.AllocHGlobal (Marshal.SizeOf (value.GetType()));
Marshal.StructureToPtr (value, buf, false);
g_value_take_boxed (ref this, buf);
} else
throw new Exception ("Unknown type");
}
}
/// <summary>
/// Handle Property
/// </summary>
///
/// <remarks>
/// Read only. Accesses a pointer to the raw GValue.
/// </remarks>
public IntPtr Handle {
get {
return _val;
}
}
}
}

View file

@ -67,27 +67,27 @@ namespace GLib {
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_array_append (IntPtr raw, IntPtr val);
static extern void g_value_array_append (IntPtr raw, ref GLib.Value val);
public void Append (GLib.Value val)
{
g_value_array_append (Handle, val.Handle);
g_value_array_append (Handle, ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_array_insert (IntPtr raw, uint idx, IntPtr val);
static extern void g_value_array_insert (IntPtr raw, uint idx, ref GLib.Value val);
public void Insert (uint idx, GLib.Value val)
{
g_value_array_insert (Handle, idx, val.Handle);
g_value_array_insert (Handle, idx, ref val);
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_array_prepend (IntPtr raw, IntPtr val);
static extern void g_value_array_prepend (IntPtr raw, ref GLib.Value val);
public void Prepend (GLib.Value val)
{
g_value_array_prepend (Handle, val.Handle);
g_value_array_prepend (Handle, ref val);
}
[DllImport("libgobject-2.0-0.dll")]
@ -113,7 +113,9 @@ namespace GLib {
public object this [int index] {
get {
return new GLib.Value (g_value_array_get_nth (Handle, (uint) index), IntPtr.Zero);
GLib.Value val = Value.Empty;
Marshal.PtrToStructure (g_value_array_get_nth (Handle, (uint) index), val);
return val;
}
}

View file

@ -8,29 +8,20 @@
#include <glib-object.h>
/* Forward declarations */
GValue *gtksharp_value_create (GType g_type);
GValue *gtksharp_value_create_from_property (GObject *obj, const gchar* name);
void gtksharp_value_create_from_property (GValue *value, GObject *obj, const gchar* name);
GType gtksharp_value_get_value_type (GValue *value);
/* */
GValue *
gtksharp_value_create (GType g_type)
void
gtksharp_value_create_from_property (GValue *value, GObject *obj, const gchar* name)
{
GValue *val = g_new0 (GValue, 1);
if (g_type != G_TYPE_INVALID)
val = g_value_init (val, g_type);
return val;
}
GValue *
gtksharp_value_create_from_property (GObject *obj, const gchar* name)
{
GParamSpec *spec = g_object_class_find_property (
G_OBJECT_GET_CLASS (obj), name);
return gtksharp_value_create (spec->value_type);
GParamSpec *spec = g_object_class_find_property (G_OBJECT_GET_CLASS (obj), name);
g_value_init (value, spec->value_type);
}
GType
gtksharp_value_get_value_type (GValue *value) {
gtksharp_value_get_value_type (GValue *value)
{
g_return_val_if_fail (value != NULL, G_TYPE_INVALID);
g_return_val_if_fail (G_IS_VALUE (value), G_TYPE_INVALID);
return G_VALUE_TYPE (value);

View file

@ -14,7 +14,7 @@ static extern void g_type_init ();
[StructLayout(LayoutKind.Sequential)]
struct PropertyArg {
public string name;
public IntPtr value;
public GLib.Value value;
}
[DllImport("gnomesharpglue")]
@ -42,9 +42,9 @@ public Program (string app_id, string app_version, ModuleInfo module, string[] a
else if (type == true.GetType ())
value = new GLib.Value ((bool) prop);
else
value = null;
value = GLib.Value.Empty;
vals[i] = value;
args[i].value = value.Handle;
args[i].value = value;
}
/* FIXME: Is there a way to access this in .NET? */

View file

@ -49,6 +49,7 @@
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='GetIterFirst']/*/*[@name='iter']" name="pass_as">out</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='GetIterFromString']/*/*[@name='iter']" name="pass_as">out</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='GetIter']/*/*[@name='iter']" name="pass_as">out</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='GetValue']/*/*[@name='value']" name="pass_as">ref</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='IterChildren']/*/*[@name='iter']" name="pass_as">out</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='IterNext']/*/*[@name='iter']" name="pass_as">out</attr>
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='IterNthChild']/*/*[@name='iter']" name="pass_as">out</attr>

View file

@ -102,8 +102,8 @@
}
public object GetValue(Gtk.TreeIter iter, int column) {
GLib.Value val = new GLib.Value ();
GetValue (iter, column, val);
GLib.Value val = GLib.Value.Empty;
GetValue (iter, column, ref val);
object ret = val.Val;
val.Dispose ();
return ret;

View file

@ -39,7 +39,7 @@ namespace Gtk {
delegate IntPtr GetColumnTypeDelegate (int col);
delegate bool GetNodeDelegate (out int node_idx, IntPtr path);
delegate IntPtr GetPathDelegate (int node_idx);
delegate void GetValueDelegate (int node_idx, int col, IntPtr val);
delegate void GetValueDelegate (int node_idx, int col, ref GLib.Value val);
delegate bool NextDelegate (ref int node_idx);
delegate bool ChildrenDelegate (out int child, int parent);
delegate bool HasChildDelegate (int node_idx);
@ -124,17 +124,16 @@ namespace Gtk {
}
[DllImport("libgobject-2.0-0.dll")]
static extern void g_value_init (IntPtr handle, IntPtr type);
static extern void g_value_init (ref GLib.Value val, IntPtr type);
void get_value_cb (int node_idx, int col, IntPtr val)
void get_value_cb (int node_idx, int col, ref GLib.Value val)
{
GLib.Value gval = new GLib.Value (val, IntPtr.Zero);
ITreeNode node = node_hash [node_idx] as ITreeNode;
if (node == null)
return;
g_value_init (gval.Handle, ctypes [col].Val);
g_value_init (ref val, ctypes [col].Val);
object col_val = getters[col].GetValue (node, null);
gval.Val = col_val;
val.Val = col_val;
}
bool next_cb (ref int node_idx)

View file

@ -10,12 +10,14 @@
public Pango.Weight Weight {
get {
GLib.Value val = new GLib.Value ();
GetProperty ("weight", val);
GLib.Value val = GetProperty ("weight");
Pango.Weight ret = (Pango.Weight) (int) val;
val.Dispose ();
return ret;
}
set {
SetProperty ("weight", new GLib.Value ((int) value));
GLib.Value val = new GLib.Value ((int) value);
SetProperty ("weight", val);
val.Dispose ();
}
}
}

View file

@ -63,8 +63,8 @@
}
public object GetValue (Gtk.TreeIter iter, int column) {
GLib.Value val = new GLib.Value ();
GetValue (iter, column, val);
GLib.Value val = GLib.Value.Empty;
GetValue (iter, column, ref val);
object ret = val.Val;
val.Dispose ();
return ret;

View file

@ -148,8 +148,8 @@
}
public object GetValue (Gtk.TreeIter iter, int column) {
GLib.Value val = new GLib.Value ();
GetValue (iter, column, val);
GLib.Value val = GLib.Value.Empty;
GetValue (iter, column, ref val);
object ret = val.Val;
val.Dispose ();
return ret;