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> 2004-04-05 Larry Ewing <lewing@ximian.com>
* gnome/Gnome.metadata: Make data an array type so that the image * 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); StreamWriter sw = gen_info.Writer = gen_info.OpenStream (Name);
base.Generate (gen_info); base.Generate (gen_info);
sw.WriteLine ("\t\t[DllImport(\"glibsharpglue\")]"); sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]");
sw.WriteLine ("\t\tstatic extern IntPtr gtksharp_value_create (GLib.GType gtype);"); sw.WriteLine ("\t\tstatic extern IntPtr g_value_init (ref GLib.Value val, GLib.GType gtype);");
sw.WriteLine (); sw.WriteLine ();
sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]"); 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 ();
sw.WriteLine ("\t\t[DllImport(\"libgobject-2.0-0.dll\")]"); 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 ();
sw.WriteLine ("\t\tpublic static explicit operator GLib.Value (" + QualifiedName + " boxed)"); sw.WriteLine ("\t\tpublic static explicit operator GLib.Value (" + QualifiedName + " boxed)");
sw.WriteLine ("\t\t{"); sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\tIntPtr handle = gtksharp_value_create (" + QualifiedName + ".GType);"); sw.WriteLine ("\t\t\tGLib.Value val = GLib.Value.Empty;");
sw.WriteLine ("\t\t\tg_value_set_boxed (handle, ref boxed);"); sw.WriteLine ("\t\t\tg_value_init (ref val, " + QualifiedName + ".GType);");
sw.WriteLine ("\t\t\treturn new GLib.Value (handle, IntPtr.Zero);"); sw.WriteLine ("\t\t\tg_value_set_boxed (ref val, ref boxed);");
sw.WriteLine ("\t\t\treturn val;");
sw.WriteLine ("\t\t}"); sw.WriteLine ("\t\t}");
sw.WriteLine (); sw.WriteLine ();
sw.WriteLine ("\t\tpublic static explicit operator " + QualifiedName + " (GLib.Value val)"); sw.WriteLine ("\t\tpublic static explicit operator " + QualifiedName + " (GLib.Value val)");
sw.WriteLine ("\t\t{"); 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\treturn New (boxed_ptr);");
sw.WriteLine ("\t\t}"); 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 = \ sources = \
AliasGen.cs \ AliasGen.cs \
BoxedGen.cs \ BoxedGen.cs \
ByRefGen.cs \
CallbackGen.cs \ CallbackGen.cs \
ClassBase.cs \ ClassBase.cs \
ClassGen.cs \ ClassGen.cs \

View file

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

View file

@ -132,8 +132,7 @@ namespace GtkSharp.Generation {
sw.WriteLine(); sw.WriteLine();
} else if (elem.HasAttribute("readable")) { } else if (elem.HasAttribute("readable")) {
sw.WriteLine("\t\t\tget {"); sw.WriteLine("\t\t\tget {");
sw.WriteLine("\t\t\t\tGLib.Value val = new GLib.Value (Handle, " + cname + ");"); sw.WriteLine("\t\t\t\tGLib.Value val = GetProperty (" + cname + ");");
sw.WriteLine("\t\t\t\tGetProperty(" + cname + ", val);");
if (table.IsObject (c_type)) { 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\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") + ";"); 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("val;");
} }
sw.WriteLine("\t\t\t\tval.Dispose ();");
sw.WriteLine("\t\t\t\treturn ret;"); sw.WriteLine("\t\t\t\treturn ret;");
sw.WriteLine("\t\t\t}"); sw.WriteLine("\t\t\t}");
} }
@ -160,20 +160,22 @@ namespace GtkSharp.Generation {
sw.WriteLine(); sw.WriteLine();
} else if (elem.HasAttribute("writeable") && !elem.HasAttribute("construct-only")) { } else if (elem.HasAttribute("writeable") && !elem.HasAttribute("construct-only")) {
sw.WriteLine("\t\t\tset {"); 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)) { 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)) { } else if (table.IsBoxed (c_type)) {
sw.WriteLine("(GLib.Value) (value));"); sw.WriteLine("(GLib.Value) value;");
} else if (table.IsOpaque (c_type)) { } else if (table.IsOpaque (c_type)) {
sw.WriteLine("new GLib.Value(Handle, " + cname + ", value));"); sw.WriteLine("new GLib.Value(Handle, " + cname + ", value);");
} else { } else {
sw.Write("new GLib.Value("); sw.Write("new GLib.Value(");
if (v_type != "" && !(table.IsObject (c_type) || table.IsOpaque (c_type))) { if (v_type != "" && !(table.IsObject (c_type) || table.IsOpaque (c_type))) {
sw.Write(v_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}"); 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\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\tprotected virtual {0} {1} ({2})", ReturnType, "On" + Name, vmsig.ToString ());
sw.WriteLine ("\t\t{"); 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.Value ret = new GLib.Value (" + ReturnGType + ");");
sw.WriteLine ("\t\t\tGLib.ValueArray inst_and_params = new GLib.ValueArray (" + parms.Count + ");"); sw.WriteLine ("\t\t\tGLib.ValueArray inst_and_params = new GLib.ValueArray (" + parms.Count + ");");
@ -187,7 +189,7 @@ namespace GtkSharp.Generation {
string cleanup = ""; string cleanup = "";
for (int i = 1; i < parms.Count; i++) { for (int i = 1; i < parms.Count; i++) {
if (parms [i].PassAs == "out") { 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"; cleanup += "\t\t\t" + parms [i].Name + " = (" + parms [i].CSType + ") vals [" + i + "];\n";
} else if (parms [i].IsLength && parms [i - 1].IsString) } else if (parms [i].IsLength && parms [i - 1].IsString)
sw.WriteLine ("\t\t\tvals [" + i + "] = new GLib.Value (" + parms [i-1].Name + ".Length);"); 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\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 != "") if (cleanup != "")
sw.WriteLine (cleanup); sw.WriteLine (cleanup);
if (!IsVoid) if (!IsVoid)

View file

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

View file

@ -197,11 +197,13 @@ namespace GLib {
} }
} }
public GLib.GType GetGType () { public GLib.GType NativeType {
if (_obj == IntPtr.Zero) get {
return GType.Invalid; 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 { public IntPtr Handle {
@ -261,19 +263,21 @@ namespace GLib {
} }
[DllImport("libgobject-2.0-0.dll")] [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")] [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")] [DllImport("glibsharpglue")]
@ -285,7 +289,7 @@ namespace GLib {
} }
[DllImport("libgobject-2.0-0.dll")] [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")] [DllImport("glibsharpglue")]
static extern bool gtksharp_is_object (IntPtr obj); static extern bool gtksharp_is_object (IntPtr obj);

View file

@ -2,7 +2,8 @@
// //
// Author: Mike Kestner <mkestner@speakeasy.net> // 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 { namespace GLib {
@ -11,168 +12,55 @@ namespace GLib {
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using GLibSharp; 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)] [StructLayout (LayoutKind.Sequential)]
public class Value : IDisposable { public struct Value : IDisposable {
IntPtr _val; GType type;
bool needs_dispose = true; long pad_1;
long pad_2;
public static Value Empty;
// Destructor is required since we are allocating unmanaged
// heap resources.
[DllImport("libglib-2.0-0.dll")]
static extern void g_free (IntPtr mem);
[DllImport("libgobject-2.0-0.dll")] [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 () [DllImport("libgobject-2.0-0.dll")]
{ static extern void g_value_unset (ref GLib.Value val);
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("glibsharpglue")] [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")] public void Dispose ()
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)
{ {
_val = val; g_value_unset (ref this);
needs_dispose = false;
} }
/// <summary> public Value (GLib.GType gtype)
/// 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)
{ {
_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")] [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> public Value (bool val) : this (GType.Boolean)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified boolean.
/// </remarks>
public Value (bool val)
{ {
_val = gtksharp_value_create(GType.Boolean.Val); g_value_set_boolean (ref this, val);
g_value_set_boolean (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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) public Value (GLib.Boxed val)
{ {
_val = gtksharp_value_create(GType.Boxed); _val = gtksharp_value_create(GType.Boxed);
@ -188,481 +76,222 @@ namespace GLib {
public Value (IntPtr obj, string prop_name, Opaque val) public Value (IntPtr obj, string prop_name, Opaque val)
{ {
_val = gtksharp_value_create_from_property (obj, prop_name); type = GType.Invalid;
g_value_set_boxed (_val, val.Handle); 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")] [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> public Value (double val) : this (GType.Double)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified double.
/// </remarks>
public Value (double val)
{ {
_val = gtksharp_value_create (GType.Double.Val); g_value_set_double (ref this, val);
g_value_set_double (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (float val) : this (GType.Float)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified float.
/// </remarks>
public Value (float val)
{ {
_val = gtksharp_value_create (GType.Float.Val); g_value_set_float (ref this, val);
g_value_set_float (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (int val) : this (GType.Int)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified integer.
/// </remarks>
public Value (int val)
{ {
_val = gtksharp_value_create (GType.Int.Val); g_value_set_int (ref this, val);
g_value_set_int (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (GLib.Object val) : this (val.NativeType)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified object.
/// </remarks>
public Value (GLib.Object val)
{ {
_val = gtksharp_value_create (val.GetGType ().Val); g_value_set_object (ref this, val.Handle);
g_value_set_object (_val, val.Handle);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (IntPtr val) : this (GType.Pointer)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified pointer.
/// </remarks>
public Value (IntPtr val)
{ {
_val = gtksharp_value_create (GType.Pointer.Val); g_value_set_pointer (ref this, val);
g_value_set_pointer (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (string val) : this (GType.String)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified string.
/// </remarks>
public Value (string val)
{ {
_val = gtksharp_value_create (GType.String.Val); g_value_set_string (ref this, val);
g_value_set_string (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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> public Value (uint val) : this (GType.UInt)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified uint.
/// </remarks>
public Value (uint val)
{ {
_val = gtksharp_value_create (GType.UInt.Val); g_value_set_uint (ref this, val);
g_value_set_uint (_val, val);
} }
/// <summary> public Value (ushort val) : this (GType.UInt)
/// Value Constructor
/// </summary>
///
/// <remarks>
/// Constructs a Value from a specified ushort.
/// </remarks>
public Value (ushort val)
{ {
_val = gtksharp_value_create (GType.UInt.Val); g_value_set_uint (ref this, val);
g_value_set_uint (_val, val);
} }
[DllImport("libgobject-2.0-0.dll")] [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")] [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")] [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) 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) if (wrap.flags)
g_value_set_flags (_val, (uint) (int) wrap); g_value_set_flags (ref this, (uint) (int) wrap);
else 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) public Value (object obj)
{ {
type = GType.Invalid;
pad_1 = pad_2 = 0;
GType type = TypeConverter.LookupType (obj.GetType ()); GType type = TypeConverter.LookupType (obj.GetType ());
if (type == GType.None) { if (type == GType.None) {
_val = gtksharp_value_create (ManagedValue.GType.Val); g_value_init (ref this, ManagedValue.GType.Val);
} else if (type == GType.Object) { } 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 { } else {
_val = gtksharp_value_create (type.Val); g_value_init (ref this, type.Val);
} }
if (type == GType.None) Val = obj;
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");
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern bool g_value_get_boolean (IntPtr val); static extern bool g_value_get_boolean (ref Value 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>
public static explicit operator bool (Value val) public static explicit operator bool (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_boolean (ref val);
// _val.type indicates an error.
return g_value_get_boolean (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [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) 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) 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")] [DllImport("libgobject-2.0-0.dll")]
static extern double g_value_get_double (IntPtr val); static extern double g_value_get_double (ref Value 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>
public static explicit operator double (Value val) public static explicit operator double (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_double (ref val);
// _val.type indicates an error.
return g_value_get_double (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern float g_value_get_float (IntPtr val); static extern float g_value_get_float (ref Value 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>
public static explicit operator float (Value val) public static explicit operator float (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_float (ref val);
// _val.type indicates an error.
return g_value_get_float (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern int g_value_get_int (IntPtr val); static extern int g_value_get_int (ref Value 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>
public static explicit operator int (Value val) public static explicit operator int (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_int (ref val);
// _val.type indicates an error.
return g_value_get_int (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_object (IntPtr val); static extern IntPtr g_value_get_object (ref Value 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>
public static explicit operator GLib.Object (Value val) public static explicit operator GLib.Object (Value val)
{ {
// FIXME: Insert an appropriate exception here if return GLib.Object.GetObject(g_value_get_object (ref val), true);
// _val.type indicates an error.
return GLib.Object.GetObject(g_value_get_object (val._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) public static explicit operator GLib.UnwrappedObject (Value val)
{ {
// FIXME: Insert an appropriate exception here if return new UnwrappedObject(g_value_get_object (ref val));
// _val.type indicates an error.
return new UnwrappedObject(g_value_get_object (val._val));
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_pointer (IntPtr val); static extern IntPtr g_value_get_pointer (ref Value 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>
public static explicit operator IntPtr (Value val) public static explicit operator IntPtr (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_pointer (ref val);
// _val.type indicates an error.
return g_value_get_pointer (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern IntPtr g_value_get_string (IntPtr val); static extern IntPtr g_value_get_string (ref Value 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>
public static explicit operator String (Value val) public static explicit operator String (Value val)
{ {
// FIXME: Insert an appropriate exception here if IntPtr str = g_value_get_string (ref val);
// _val.type indicates an error.
IntPtr str = g_value_get_string (val._val);
return str == IntPtr.Zero ? null : Marshal.PtrToStringAnsi (str); return str == IntPtr.Zero ? null : Marshal.PtrToStringAnsi (str);
} }
[DllImport("libgobject-2.0-0.dll")] [DllImport("libgobject-2.0-0.dll")]
static extern uint g_value_get_uint (IntPtr val); static extern uint g_value_get_uint (ref Value 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>
public static explicit operator uint (Value val) public static explicit operator uint (Value val)
{ {
// FIXME: Insert an appropriate exception here if return g_value_get_uint (ref val);
// _val.type indicates an error.
return g_value_get_uint (val._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) public static explicit operator ushort (Value val)
{ {
// FIXME: Insert an appropriate exception here if return (ushort) g_value_get_uint (ref val);
// _val.type indicates an error.
return (ushort) g_value_get_uint (val._val);
} }
[DllImport("libgobject-2.0-0.dll")] [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")] [DllImport("libgobject-2.0-0.dll")]
static extern uint g_value_get_flags (IntPtr val); static extern uint g_value_get_flags (ref Value 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>
public static explicit operator EnumWrapper (Value val) public static explicit operator EnumWrapper (Value val)
{ {
// FIXME: Insert an appropriate exception here if
// _val.type indicates an error.
// FIXME: handle flags // 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")] [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 public object Val
{ {
get { 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) { 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) if (type == GType.String)
@ -685,42 +314,45 @@ namespace GLib {
throw new Exception ("Unknown type"); throw new Exception ("Unknown type");
} }
set { set {
IntPtr buf;
GType type = GLibSharp.TypeConverter.LookupType (value.GetType()); GType type = GLibSharp.TypeConverter.LookupType (value.GetType());
if (type == GType.None) 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) 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) 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) 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) 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) 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) 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) 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) else if (type == GType.Object)
g_value_set_object (_val, ((GLib.Object) value).Handle); g_value_set_object (ref this, ((GLib.Object) value).Handle);
else 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"); 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")] [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) 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")] [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) 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")] [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) 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")] [DllImport("libgobject-2.0-0.dll")]
@ -113,7 +113,9 @@ namespace GLib {
public object this [int index] { public object this [int index] {
get { 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> #include <glib-object.h>
/* Forward declarations */ /* Forward declarations */
GValue *gtksharp_value_create (GType g_type); void gtksharp_value_create_from_property (GValue *value, GObject *obj, const gchar* name);
GValue *gtksharp_value_create_from_property (GObject *obj, const gchar* name); GType gtksharp_value_get_value_type (GValue *value);
/* */ /* */
GValue * void
gtksharp_value_create (GType g_type) gtksharp_value_create_from_property (GValue *value, GObject *obj, const gchar* name)
{ {
GValue *val = g_new0 (GValue, 1); GParamSpec *spec = g_object_class_find_property (G_OBJECT_GET_CLASS (obj), name);
if (g_type != G_TYPE_INVALID) g_value_init (value, spec->value_type);
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);
} }
GType 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 (value != NULL, G_TYPE_INVALID);
g_return_val_if_fail (G_IS_VALUE (value), G_TYPE_INVALID); g_return_val_if_fail (G_IS_VALUE (value), G_TYPE_INVALID);
return G_VALUE_TYPE (value); return G_VALUE_TYPE (value);

View file

@ -14,7 +14,7 @@ static extern void g_type_init ();
[StructLayout(LayoutKind.Sequential)] [StructLayout(LayoutKind.Sequential)]
struct PropertyArg { struct PropertyArg {
public string name; public string name;
public IntPtr value; public GLib.Value value;
} }
[DllImport("gnomesharpglue")] [DllImport("gnomesharpglue")]
@ -42,9 +42,9 @@ public Program (string app_id, string app_version, ModuleInfo module, string[] a
else if (type == true.GetType ()) else if (type == true.GetType ())
value = new GLib.Value ((bool) prop); value = new GLib.Value ((bool) prop);
else else
value = null; value = GLib.Value.Empty;
vals[i] = value; vals[i] = value;
args[i].value = value.Handle; args[i].value = value;
} }
/* FIXME: Is there a way to access this in .NET? */ /* 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='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='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='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='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='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> <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) { public object GetValue(Gtk.TreeIter iter, int column) {
GLib.Value val = new GLib.Value (); GLib.Value val = GLib.Value.Empty;
GetValue (iter, column, val); GetValue (iter, column, ref val);
object ret = val.Val; object ret = val.Val;
val.Dispose (); val.Dispose ();
return ret; return ret;

View file

@ -39,7 +39,7 @@ namespace Gtk {
delegate IntPtr GetColumnTypeDelegate (int col); delegate IntPtr GetColumnTypeDelegate (int col);
delegate bool GetNodeDelegate (out int node_idx, IntPtr path); delegate bool GetNodeDelegate (out int node_idx, IntPtr path);
delegate IntPtr GetPathDelegate (int node_idx); 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 NextDelegate (ref int node_idx);
delegate bool ChildrenDelegate (out int child, int parent); delegate bool ChildrenDelegate (out int child, int parent);
delegate bool HasChildDelegate (int node_idx); delegate bool HasChildDelegate (int node_idx);
@ -124,17 +124,16 @@ namespace Gtk {
} }
[DllImport("libgobject-2.0-0.dll")] [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; ITreeNode node = node_hash [node_idx] as ITreeNode;
if (node == null) if (node == null)
return; 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); object col_val = getters[col].GetValue (node, null);
gval.Val = col_val; val.Val = col_val;
} }
bool next_cb (ref int node_idx) bool next_cb (ref int node_idx)

View file

@ -10,12 +10,14 @@
public Pango.Weight Weight { public Pango.Weight Weight {
get { get {
GLib.Value val = new GLib.Value (); GLib.Value val = GetProperty ("weight");
GetProperty ("weight", val);
Pango.Weight ret = (Pango.Weight) (int) val; Pango.Weight ret = (Pango.Weight) (int) val;
val.Dispose ();
return ret; return ret;
} }
set { 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) { public object GetValue (Gtk.TreeIter iter, int column) {
GLib.Value val = new GLib.Value (); GLib.Value val = GLib.Value.Empty;
GetValue (iter, column, val); GetValue (iter, column, ref val);
object ret = val.Val; object ret = val.Val;
val.Dispose (); val.Dispose ();
return ret; return ret;

View file

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