* generator/StructBase.cs: create a Zero static member for

use when the IntPtr is NULL.

* generator/SignalHandler.cs, generator/CallbackGen.cs: removed
call to Initialize for structs

* gtk/Clipboard.custom, gtk/ClipboardClearFunc.cs,
gtk/ClipboardGetFunc.cs,
gtk/GtkSharp.GtkClipboardClearFuncNative.cs,
gtk/GtkSharp.ClipboardGetFuncNative.cs, SelectionData.custom:
Hand-wrapped selection handling stuff, along with relevant
signals and the like.

* gnome/voidObjectAffineSVPintSignal.cs: removed Initialize
for hand-wrapped signal

* sample/GnomeHelloWorld.cs, sample/Size.cs: compare against
.Zero instead of using IsNull

* api/gtk-api.xml, sources/Gtk.metadata: metadata updates for
hiding some manually-wrapped stuff

svn path=/trunk/gtk-sharp/; revision=8912
This commit is contained in:
Vladimir Vukicevic 2002-11-10 10:03:51 +00:00
parent aaf5594b36
commit 9ad6d1b6a4
18 changed files with 942 additions and 746 deletions

View file

@ -1,3 +1,27 @@
2002-11-10 Vladimir Vukicevic <vladimir@pobox.com>
* generator/StructBase.cs: create a Zero static member for
use when the IntPtr is NULL.
* generator/SignalHandler.cs, generator/CallbackGen.cs: removed
call to Initialize for structs
* gtk/Clipboard.custom, gtk/ClipboardClearFunc.cs,
gtk/ClipboardGetFunc.cs,
gtk/GtkSharp.GtkClipboardClearFuncNative.cs,
gtk/GtkSharp.ClipboardGetFuncNative.cs, SelectionData.custom:
Hand-wrapped selection handling stuff, along with relevant
signals and the like.
* gnome/voidObjectAffineSVPintSignal.cs: removed Initialize
for hand-wrapped signal
* sample/GnomeHelloWorld.cs, sample/Size.cs: compare against
.Zero instead of using IsNull
* api/gtk-api.xml, sources/Gtk.metadata: metadata updates for
hiding some manually-wrapped stuff
2002-11-10 Alejandro S<>nchez Acosta <raciel@es.gnu.org>
* sample/tutorial: added some examples for the gtk# tutorial

View file

@ -506,22 +506,6 @@
<parameter type="GtkArg*" name="args"/>
</parameters>
</callback>
<callback name="ClipboardClearFunc" cname="GtkClipboardClearFunc">
<return-type type="void"/>
<parameters>
<parameter type="GtkClipboard*" name="clipboard"/>
<parameter type="gpointer" name="user_data_or_owner"/>
</parameters>
</callback>
<callback name="ClipboardGetFunc" cname="GtkClipboardGetFunc">
<return-type type="void"/>
<parameters>
<parameter type="GtkClipboard*" name="clipboard"/>
<parameter type="GtkSelectionData*" name="selection_data"/>
<parameter type="guint" name="info"/>
<parameter type="gpointer" name="user_data_or_owner"/>
</parameters>
</callback>
<callback name="ClipboardReceivedFunc" cname="GtkClipboardReceivedFunc">
<return-type type="void"/>
<parameters>
@ -10487,26 +10471,6 @@
<parameter type="gint" name="len"/>
</parameters>
</method>
<method name="SetWithData" cname="gtk_clipboard_set_with_data">
<return-type type="gboolean"/>
<parameters>
<parameter type="const-GtkTargetEntry*" name="targets"/>
<parameter type="guint" name="n_targets"/>
<parameter type="GtkClipboardGetFunc" name="get_func"/>
<parameter type="GtkClipboardClearFunc" name="clear_func"/>
<parameter type="gpointer" name="user_data"/>
</parameters>
</method>
<method name="SetWithOwner" cname="gtk_clipboard_set_with_owner">
<return-type type="gboolean"/>
<parameters>
<parameter type="const-GtkTargetEntry*" name="targets"/>
<parameter type="guint" name="n_targets"/>
<parameter type="GtkClipboardGetFunc" name="get_func"/>
<parameter type="GtkClipboardClearFunc" name="clear_func"/>
<parameter type="GObject*" name="owner"/>
</parameters>
</method>
<method name="WaitForContents" cname="gtk_clipboard_wait_for_contents">
<return-type type="GtkSelectionData*"/>
<parameters>
@ -10809,28 +10773,9 @@
<parameter type="gint*" name="n_atoms"/>
</parameters>
</method>
<method name="GetText" cname="gtk_selection_data_get_text">
<return-type type="guchar*"/>
</method>
<method name="GetType" cname="gtk_selection_data_get_type" shared="true">
<return-type type="GType"/>
</method>
<method name="Set" cname="gtk_selection_data_set">
<return-type type="void"/>
<parameters>
<parameter type="GdkAtom" name="type"/>
<parameter type="gint" name="format"/>
<parameter type="const-guchar*" name="data"/>
<parameter type="gint" name="length"/>
</parameters>
</method>
<method name="SetText" cname="gtk_selection_data_set_text">
<return-type type="gboolean"/>
<parameters>
<parameter type="const-gchar*" name="str"/>
<parameter type="gint" name="len"/>
</parameters>
</method>
<method name="TargetsIncludeText" cname="gtk_selection_data_targets_include_text">
<return-type type="gboolean"/>
</method>

View file

@ -1,207 +1,204 @@
// GtkSharp.Generation.CallbackGen.cs - The Callback Generatable.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2002 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.IO;
using System.Xml;
public class CallbackGen : GenBase, IGeneratable {
private Parameters parms;
public CallbackGen (XmlElement ns, XmlElement elem) : base (ns, elem)
{
if (elem ["parameters"] != null)
parms = new Parameters (elem ["parameters"]);
}
public String MarshalType {
get
{
return NS + "Sharp." + Name + "Native";
}
}
public String MarshalReturnType {
get
{
return MarshalType;
}
}
public String CallByName (String var_name)
{
return var_name + ".NativeDelegate";
}
public String FromNative(String var)
{
return var;
}
public String FromNativeReturn(String var)
{
return FromNative (var);
}
private void GenWrapper (string s_ret, string sig)
{
char sep = Path.DirectorySeparatorChar;
string dir = ".." + sep + NS.ToLower() + sep + "generated";
if (!Directory.Exists (dir))
Directory.CreateDirectory (dir);
string wrapper = Name + "Native";
string filename = dir + sep + NS + "Sharp." + wrapper + ".cs";
FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter (stream);
sw.WriteLine ("// Generated File. Do not modify.");
sw.WriteLine ("// <c> 2001-2002 Mike Kestner");
sw.WriteLine ();
sw.WriteLine ("namespace " + NS + "Sharp {");
sw.WriteLine ();
sw.WriteLine ("\tusing System;");
sw.WriteLine ();
string import_sig;
if (parms != null)
{
parms.CreateSignature (false);
import_sig = parms.ImportSig;
} else
import_sig = "";
XmlElement ret_elem = Elem["return-type"];
string rettype = ret_elem.GetAttribute("type");
string m_ret = SymbolTable.GetMarshalReturnType (rettype);
sw.WriteLine ("\tpublic delegate " + m_ret + " " + wrapper + "(" + import_sig + ");");
sw.WriteLine ();
sw.WriteLine ("\tpublic class " + Name + "Wrapper : GLib.DelegateWrapper {");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + m_ret + " NativeCallback (" + import_sig + ")");
sw.WriteLine ("\t\t{");
int count = (parms != null) ? parms.Count : 0;
if (count > 0)
sw.WriteLine ("\t\t\tobject[] _args = new object[{0}];", count);
int idx = 0;
bool need_sep = false;
string call_str = "";
for (int i = 0; i < count; i++)
{
string parm_name = parms[i].Name;
string ctype = parms[i].CType;
if ((i == count - 1) && ctype == "gpointer" && (parm_name.EndsWith ("data") || parm_name.EndsWith ("data_or_owner")))
continue;
string cstype = parms[i].CSType;
// FIXME: Too much code copy/pasted here. Refactor?
ClassBase parm_wrapper = SymbolTable.GetClassGen (ctype);
if (parm_wrapper != null && (parm_wrapper is StructBase)) {
sw.WriteLine("\t\t\t{0}._Initialize ();", parm_name);
}
sw.WriteLine("\t\t\t_args[" + idx + "] = " + SymbolTable.FromNative (ctype, parm_name) + ";");
if ((parm_wrapper != null && ((parm_wrapper is OpaqueGen))) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\tif (_args[" + idx + "] == null)");
sw.WriteLine("\t\t\t\t_args[{0}] = new {1}({2});", idx, cstype, parm_name);
}
if (need_sep)
call_str += ", ";
else
need_sep = true;
call_str += String.Format ("({0}) _args[{1}]", cstype, idx);
idx++;
}
sw.Write ("\t\t\t");
string invoke = "_managed (" + call_str + ")";
if (m_ret != "void") {
ClassBase parm_wrapper = SymbolTable.GetClassGen (rettype);
if (parm_wrapper != null && (parm_wrapper is ObjectGen || parm_wrapper is OpaqueGen))
sw.WriteLine ("return (({0}) {1}).Handle;", s_ret, invoke);
else if (SymbolTable.IsStruct (rettype) || SymbolTable.IsBoxed (rettype)) {
// Shoot. I have no idea what to do here.
sw.WriteLine ("return IntPtr.Zero;");
}
else if (SymbolTable.IsEnum (rettype))
sw.WriteLine ("return (int) {0};", invoke);
else
sw.WriteLine ("return ({0}) {1};", s_ret, invoke);
}
else
sw.WriteLine (invoke + ";");
sw.WriteLine ("\t\t}");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic {0} NativeDelegate;", wrapper);
sw.WriteLine ("\t\tprotected {0} _managed;", NS + "." + Name);
sw.WriteLine ();
sw.WriteLine ("\t\tpublic {0} ({1} managed) : base ()", Name + "Wrapper", NS + "." + Name);
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\tNativeDelegate = new {0} (NativeCallback);", wrapper);
sw.WriteLine ("\t\t\t_managed = managed;");
sw.WriteLine ("\t\t}");
sw.WriteLine ("\t}");
CloseWriter (sw);
}
public void Generate ()
{
if (!DoGenerate)
return;
XmlElement ret_elem = Elem["return-type"];
if (ret_elem == null) {
Console.WriteLine("No return type in callback " + CName);
Statistics.ThrottledCount++;
return;
}
string rettype = ret_elem.GetAttribute("type");
string s_ret = SymbolTable.GetCSType (rettype);
if (s_ret == "") {
Console.WriteLine("rettype: " + rettype + " in callback " + CName);
Statistics.ThrottledCount++;
return;
}
if ((parms != null) && !parms.Validate ()) {
Console.WriteLine(" in callback " + CName + " **** Stubbing it out ****");
Statistics.ThrottledCount++;
parms = null;
}
StreamWriter sw = CreateWriter ();
string sig = "";
if (parms != null) {
parms.HideData = true;
parms.CreateSignature (false);
sig = parms.Signature;
}
sw.WriteLine ("\tpublic delegate " + s_ret + " " + Name + "(" + sig + ");");
CloseWriter (sw);
GenWrapper (s_ret, sig);
Statistics.CBCount++;
}
}
}
// GtkSharp.Generation.CallbackGen.cs - The Callback Generatable.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2002 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.IO;
using System.Xml;
public class CallbackGen : GenBase, IGeneratable {
private Parameters parms;
public CallbackGen (XmlElement ns, XmlElement elem) : base (ns, elem)
{
if (elem ["parameters"] != null)
parms = new Parameters (elem ["parameters"]);
}
public String MarshalType {
get
{
return NS + "Sharp." + Name + "Native";
}
}
public String MarshalReturnType {
get
{
return MarshalType;
}
}
public String CallByName (String var_name)
{
return var_name + ".NativeDelegate";
}
public String FromNative(String var)
{
return var;
}
public String FromNativeReturn(String var)
{
return FromNative (var);
}
private void GenWrapper (string s_ret, string sig)
{
char sep = Path.DirectorySeparatorChar;
string dir = ".." + sep + NS.ToLower() + sep + "generated";
if (!Directory.Exists (dir))
Directory.CreateDirectory (dir);
string wrapper = Name + "Native";
string filename = dir + sep + NS + "Sharp." + wrapper + ".cs";
FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter (stream);
sw.WriteLine ("// Generated File. Do not modify.");
sw.WriteLine ("// <c> 2001-2002 Mike Kestner");
sw.WriteLine ();
sw.WriteLine ("namespace " + NS + "Sharp {");
sw.WriteLine ();
sw.WriteLine ("\tusing System;");
sw.WriteLine ();
string import_sig;
if (parms != null)
{
parms.CreateSignature (false);
import_sig = parms.ImportSig;
} else
import_sig = "";
XmlElement ret_elem = Elem["return-type"];
string rettype = ret_elem.GetAttribute("type");
string m_ret = SymbolTable.GetMarshalReturnType (rettype);
sw.WriteLine ("\tpublic delegate " + m_ret + " " + wrapper + "(" + import_sig + ");");
sw.WriteLine ();
sw.WriteLine ("\tpublic class " + Name + "Wrapper : GLib.DelegateWrapper {");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + m_ret + " NativeCallback (" + import_sig + ")");
sw.WriteLine ("\t\t{");
int count = (parms != null) ? parms.Count : 0;
if (count > 0)
sw.WriteLine ("\t\t\tobject[] _args = new object[{0}];", count);
int idx = 0;
bool need_sep = false;
string call_str = "";
for (int i = 0; i < count; i++)
{
string parm_name = parms[i].Name;
string ctype = parms[i].CType;
if ((i == count - 1) && ctype == "gpointer" && (parm_name.EndsWith ("data") || parm_name.EndsWith ("data_or_owner")))
continue;
string cstype = parms[i].CSType;
// FIXME: Too much code copy/pasted here. Refactor?
ClassBase parm_wrapper = SymbolTable.GetClassGen (ctype);
sw.WriteLine("\t\t\t_args[" + idx + "] = " + SymbolTable.FromNative (ctype, parm_name) + ";");
if ((parm_wrapper != null && ((parm_wrapper is OpaqueGen))) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\tif (_args[" + idx + "] == null)");
sw.WriteLine("\t\t\t\t_args[{0}] = new {1}({2});", idx, cstype, parm_name);
}
if (need_sep)
call_str += ", ";
else
need_sep = true;
call_str += String.Format ("({0}) _args[{1}]", cstype, idx);
idx++;
}
sw.Write ("\t\t\t");
string invoke = "_managed (" + call_str + ")";
if (m_ret != "void") {
ClassBase parm_wrapper = SymbolTable.GetClassGen (rettype);
if (parm_wrapper != null && (parm_wrapper is ObjectGen || parm_wrapper is OpaqueGen))
sw.WriteLine ("return (({0}) {1}).Handle;", s_ret, invoke);
else if (SymbolTable.IsStruct (rettype) || SymbolTable.IsBoxed (rettype)) {
// Shoot. I have no idea what to do here.
sw.WriteLine ("return IntPtr.Zero;");
}
else if (SymbolTable.IsEnum (rettype))
sw.WriteLine ("return (int) {0};", invoke);
else
sw.WriteLine ("return ({0}) {1};", s_ret, invoke);
}
else
sw.WriteLine (invoke + ";");
sw.WriteLine ("\t\t}");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic {0} NativeDelegate;", wrapper);
sw.WriteLine ("\t\tprotected {0} _managed;", NS + "." + Name);
sw.WriteLine ();
sw.WriteLine ("\t\tpublic {0} ({1} managed) : base ()", Name + "Wrapper", NS + "." + Name);
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\tNativeDelegate = new {0} (NativeCallback);", wrapper);
sw.WriteLine ("\t\t\t_managed = managed;");
sw.WriteLine ("\t\t}");
sw.WriteLine ("\t}");
CloseWriter (sw);
}
public void Generate ()
{
if (!DoGenerate)
return;
XmlElement ret_elem = Elem["return-type"];
if (ret_elem == null) {
Console.WriteLine("No return type in callback " + CName);
Statistics.ThrottledCount++;
return;
}
string rettype = ret_elem.GetAttribute("type");
string s_ret = SymbolTable.GetCSType (rettype);
if (s_ret == "") {
Console.WriteLine("rettype: " + rettype + " in callback " + CName);
Statistics.ThrottledCount++;
return;
}
if ((parms != null) && !parms.Validate ()) {
Console.WriteLine(" in callback " + CName + " **** Stubbing it out ****");
Statistics.ThrottledCount++;
parms = null;
}
StreamWriter sw = CreateWriter ();
string sig = "";
if (parms != null) {
parms.HideData = true;
parms.CreateSignature (false);
sig = parms.Signature;
}
sw.WriteLine ("\tpublic delegate " + s_ret + " " + Name + "(" + sig + ");");
CloseWriter (sw);
GenWrapper (s_ret, sig);
Statistics.CBCount++;
}
}
}

View file

@ -1,197 +1,195 @@
// GtkSharp.Generation.SignalHandler.cs - The SignalHandler marshaling Class.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2002 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.Collections;
using System.IO;
using System.Xml;
public class SignalHandler {
public static String GetName(XmlElement sig, string ns, bool generate)
{
XmlElement ret_elem = sig["return-type"];
if (ret_elem == null) {
Console.Write("Missing return-type ");
return "";
}
string retval = ret_elem.GetAttribute("type");
if (retval == "") {
Console.Write("Invalid return-type ");
return "";
}
string s_ret = SymbolTable.GetCSType(retval);
string p_ret = SymbolTable.GetMarshalReturnType(retval);
if ((s_ret == "") || (p_ret == "")) {
Console.Write("Funky type: " + retval);
return "";
}
string key = retval;
string pinv = "";
string name = SymbolTable.GetName(retval);
int pcnt = 0;
ArrayList parms = new ArrayList();
XmlElement params_elem = sig["parameters"];
if (params_elem == null) {
Console.Write("Missing parameters ");
return "";
}
foreach (XmlNode parm in params_elem.ChildNodes) {
if (!(parm is XmlElement) || parm.Name != "parameter") continue;
XmlElement elem = (XmlElement) parm;
string type = elem.GetAttribute("type");
string ptype = SymbolTable.GetMarshalType(type);
if (ptype == "") {
Console.Write("Funky type: " + type);
return "";
}
if (pcnt > 0) {
pinv += ", ";
}
pinv += (ptype + " arg" + pcnt);
parms.Add(type);
if (SymbolTable.IsObject(type) || SymbolTable.IsInterface(type)) {
name += "Object";
key += "Object";
} else {
name += SymbolTable.GetName(type);
key += type;
}
pcnt++;
}
String sname = name + "Signal";
String dname = name + "Delegate";
String cbname = name + "Callback";
if (!generate)
return ns + "." + sname;
char sep = Path.DirectorySeparatorChar;
String dir = ".." + sep + ns.ToLower() + sep + "generated";
if (!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
String filename = dir + sep + ns + "Sharp." + sname + ".cs";
FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter (stream);
sw.WriteLine ("// Generated File. Do not modify.");
sw.WriteLine ("// <c> 2001-2002 Mike Kestner");
sw.WriteLine ();
sw.WriteLine("namespace " + ns + "Sharp {");
sw.WriteLine();
sw.WriteLine("\tusing System;");
sw.WriteLine("\tusing System.Runtime.InteropServices;");
sw.WriteLine("\tusing GtkSharp;");
sw.WriteLine();
sw.Write("\tpublic delegate " + p_ret + " ");
sw.WriteLine(dname + "(" + pinv + ", int key);");
sw.WriteLine();
sw.WriteLine("\tpublic class " + sname + " : SignalCallback {");
sw.WriteLine();
sw.WriteLine("\t\tprivate static " + dname + " _Delegate;");
sw.WriteLine();
sw.Write("\t\tprivate static " + s_ret + " ");
sw.WriteLine(cbname + "(" + pinv + ", int key)");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\tif (!_Instances.Contains(key))");
sw.WriteLine("\t\t\t\tthrow new Exception(\"Unexpected signal key \" + key);");
sw.WriteLine();
sw.WriteLine("\t\t\t" + sname + " inst = (" + sname + ") _Instances[key];");
if ((s_ret == "void") && (parms.Count == 1)) {
sw.WriteLine("\t\t\tEventHandler h = (EventHandler) inst._handler;");
sw.WriteLine("\t\t\th (inst._obj, new EventArgs ());");
sw.WriteLine("\t\t}");
sw.WriteLine();
} else {
sw.WriteLine("\t\t\tSignalArgs args = (SignalArgs) Activator.CreateInstance (inst._argstype);");
if (parms.Count > 1) {
sw.WriteLine("\t\t\targs.Args = new object[" + (parms.Count-1) + "];");
}
for (int idx=1; idx < parms.Count; idx++) {
string ctype = (string) parms[idx];
ClassBase wrapper = SymbolTable.GetClassGen (ctype);
if ((wrapper != null && !(wrapper is StructBase)) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\tif (arg{0} == IntPtr.Zero)", idx);
sw.WriteLine("\t\t\t\targs.Args[{0}] = null;", idx - 1);
sw.WriteLine("\t\t\telse {");
if (wrapper != null && wrapper is ObjectGen)
sw.WriteLine("\t\t\t\targs.Args[" + (idx-1) + "] = GLib.Object.GetObject(arg" + idx + ");");
else
sw.WriteLine("\t\t\t\targs.Args[" + (idx-1) + "] = " + SymbolTable.FromNative (ctype, "arg" + idx) + ";");
if ((wrapper != null && (wrapper is OpaqueGen)) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\t\tif (args.Args[" + (idx-1) + "] == null)");
sw.WriteLine("\t\t\t\t\targs.Args[{0}] = new {1}(arg{2});", idx-1, SymbolTable.GetCSType (ctype), idx);
}
sw.WriteLine("\t\t\t}");
} else {
if (wrapper != null && (wrapper is StructBase))
sw.WriteLine("\t\t\targ{0}._Initialize ();", idx);
sw.WriteLine("\t\t\targs.Args[" + (idx-1) + "] = " + SymbolTable.FromNative (ctype, "arg" + idx) + ";");
}
}
sw.WriteLine("\t\t\tobject[] argv = new object[2];");
sw.WriteLine("\t\t\targv[0] = inst._obj;");
sw.WriteLine("\t\t\targv[1] = args;");
sw.WriteLine("\t\t\tinst._handler.DynamicInvoke(argv);");
if (retval != "void") {
sw.WriteLine ("\t\t\tif (args.RetVal == null)");
if (s_ret == "bool")
sw.WriteLine ("\t\t\t\treturn false;");
else
sw.WriteLine ("\t\t\t\tthrow new Exception(\"args.RetVal unset in callback\");");
sw.WriteLine("\t\t\treturn (" + s_ret + ") args.RetVal;");
}
sw.WriteLine("\t\t}");
sw.WriteLine();
}
sw.Write("\t\t[DllImport(\"gobject-2.0\")]");
sw.Write("\t\tstatic extern void g_signal_connect_data(");
sw.Write("IntPtr obj, String name, " + dname + " cb, int key, IntPtr p,");
sw.WriteLine(" int flags);");
sw.WriteLine();
sw.Write("\t\tpublic " + sname + "(GLib.Object obj, IntPtr raw, ");
sw.WriteLine("String name, MulticastDelegate eh, Type argstype) : base(obj, eh, argstype)");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\tif (_Delegate == null) {");
sw.WriteLine("\t\t\t\t_Delegate = new " + dname + "(" + cbname + ");");
sw.WriteLine("\t\t\t}");
sw.Write("\t\t\tg_signal_connect_data(raw, name, ");
sw.WriteLine("_Delegate, _key, new IntPtr(0), 0);");
sw.WriteLine("\t\t}");
sw.WriteLine();
sw.WriteLine("\t\t~" + sname + "()");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\t_Instances.Remove(_key);");
sw.WriteLine("\t\t\tif(_Instances.Count == 0) {");
sw.WriteLine("\t\t\t\t_Delegate = null;");
sw.WriteLine("\t\t\t}");
sw.WriteLine("\t\t}");
sw.WriteLine("\t}");
sw.WriteLine("}");
sw.Close();
return ns + "Sharp." + sname;
}
}
}
// GtkSharp.Generation.SignalHandler.cs - The SignalHandler marshaling Class.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2002 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.Collections;
using System.IO;
using System.Xml;
public class SignalHandler {
public static String GetName(XmlElement sig, string ns, bool generate)
{
XmlElement ret_elem = sig["return-type"];
if (ret_elem == null) {
Console.Write("Missing return-type ");
return "";
}
string retval = ret_elem.GetAttribute("type");
if (retval == "") {
Console.Write("Invalid return-type ");
return "";
}
string s_ret = SymbolTable.GetCSType(retval);
string p_ret = SymbolTable.GetMarshalReturnType(retval);
if ((s_ret == "") || (p_ret == "")) {
Console.Write("Funky type: " + retval);
return "";
}
string key = retval;
string pinv = "";
string name = SymbolTable.GetName(retval);
int pcnt = 0;
ArrayList parms = new ArrayList();
XmlElement params_elem = sig["parameters"];
if (params_elem == null) {
Console.Write("Missing parameters ");
return "";
}
foreach (XmlNode parm in params_elem.ChildNodes) {
if (!(parm is XmlElement) || parm.Name != "parameter") continue;
XmlElement elem = (XmlElement) parm;
string type = elem.GetAttribute("type");
string ptype = SymbolTable.GetMarshalType(type);
if (ptype == "") {
Console.Write("Funky type: " + type);
return "";
}
if (pcnt > 0) {
pinv += ", ";
}
pinv += (ptype + " arg" + pcnt);
parms.Add(type);
if (SymbolTable.IsObject(type) || SymbolTable.IsInterface(type)) {
name += "Object";
key += "Object";
} else {
name += SymbolTable.GetName(type);
key += type;
}
pcnt++;
}
String sname = name + "Signal";
String dname = name + "Delegate";
String cbname = name + "Callback";
if (!generate)
return ns + "." + sname;
char sep = Path.DirectorySeparatorChar;
String dir = ".." + sep + ns.ToLower() + sep + "generated";
if (!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
String filename = dir + sep + ns + "Sharp." + sname + ".cs";
FileStream stream = new FileStream (filename, FileMode.Create, FileAccess.Write);
StreamWriter sw = new StreamWriter (stream);
sw.WriteLine ("// Generated File. Do not modify.");
sw.WriteLine ("// <c> 2001-2002 Mike Kestner");
sw.WriteLine ();
sw.WriteLine("namespace " + ns + "Sharp {");
sw.WriteLine();
sw.WriteLine("\tusing System;");
sw.WriteLine("\tusing System.Runtime.InteropServices;");
sw.WriteLine("\tusing GtkSharp;");
sw.WriteLine();
sw.Write("\tpublic delegate " + p_ret + " ");
sw.WriteLine(dname + "(" + pinv + ", int key);");
sw.WriteLine();
sw.WriteLine("\tpublic class " + sname + " : SignalCallback {");
sw.WriteLine();
sw.WriteLine("\t\tprivate static " + dname + " _Delegate;");
sw.WriteLine();
sw.Write("\t\tprivate static " + s_ret + " ");
sw.WriteLine(cbname + "(" + pinv + ", int key)");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\tif (!_Instances.Contains(key))");
sw.WriteLine("\t\t\t\tthrow new Exception(\"Unexpected signal key \" + key);");
sw.WriteLine();
sw.WriteLine("\t\t\t" + sname + " inst = (" + sname + ") _Instances[key];");
if ((s_ret == "void") && (parms.Count == 1)) {
sw.WriteLine("\t\t\tEventHandler h = (EventHandler) inst._handler;");
sw.WriteLine("\t\t\th (inst._obj, new EventArgs ());");
sw.WriteLine("\t\t}");
sw.WriteLine();
} else {
sw.WriteLine("\t\t\tSignalArgs args = (SignalArgs) Activator.CreateInstance (inst._argstype);");
if (parms.Count > 1) {
sw.WriteLine("\t\t\targs.Args = new object[" + (parms.Count-1) + "];");
}
for (int idx=1; idx < parms.Count; idx++) {
string ctype = (string) parms[idx];
ClassBase wrapper = SymbolTable.GetClassGen (ctype);
if ((wrapper != null && !(wrapper is StructBase)) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\tif (arg{0} == IntPtr.Zero)", idx);
sw.WriteLine("\t\t\t\targs.Args[{0}] = null;", idx - 1);
sw.WriteLine("\t\t\telse {");
if (wrapper != null && wrapper is ObjectGen)
sw.WriteLine("\t\t\t\targs.Args[" + (idx-1) + "] = GLib.Object.GetObject(arg" + idx + ");");
else
sw.WriteLine("\t\t\t\targs.Args[" + (idx-1) + "] = " + SymbolTable.FromNative (ctype, "arg" + idx) + ";");
if ((wrapper != null && (wrapper is OpaqueGen)) || SymbolTable.IsManuallyWrapped (ctype)) {
sw.WriteLine("\t\t\t\tif (args.Args[" + (idx-1) + "] == null)");
sw.WriteLine("\t\t\t\t\targs.Args[{0}] = new {1}(arg{2});", idx-1, SymbolTable.GetCSType (ctype), idx);
}
sw.WriteLine("\t\t\t}");
} else {
sw.WriteLine("\t\t\targs.Args[" + (idx-1) + "] = " + SymbolTable.FromNative (ctype, "arg" + idx) + ";");
}
}
sw.WriteLine("\t\t\tobject[] argv = new object[2];");
sw.WriteLine("\t\t\targv[0] = inst._obj;");
sw.WriteLine("\t\t\targv[1] = args;");
sw.WriteLine("\t\t\tinst._handler.DynamicInvoke(argv);");
if (retval != "void") {
sw.WriteLine ("\t\t\tif (args.RetVal == null)");
if (s_ret == "bool")
sw.WriteLine ("\t\t\t\treturn false;");
else
sw.WriteLine ("\t\t\t\tthrow new Exception(\"args.RetVal unset in callback\");");
sw.WriteLine("\t\t\treturn (" + s_ret + ") args.RetVal;");
}
sw.WriteLine("\t\t}");
sw.WriteLine();
}
sw.Write("\t\t[DllImport(\"gobject-2.0\")]");
sw.Write("\t\tstatic extern void g_signal_connect_data(");
sw.Write("IntPtr obj, String name, " + dname + " cb, int key, IntPtr p,");
sw.WriteLine(" int flags);");
sw.WriteLine();
sw.Write("\t\tpublic " + sname + "(GLib.Object obj, IntPtr raw, ");
sw.WriteLine("String name, MulticastDelegate eh, Type argstype) : base(obj, eh, argstype)");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\tif (_Delegate == null) {");
sw.WriteLine("\t\t\t\t_Delegate = new " + dname + "(" + cbname + ");");
sw.WriteLine("\t\t\t}");
sw.Write("\t\t\tg_signal_connect_data(raw, name, ");
sw.WriteLine("_Delegate, _key, new IntPtr(0), 0);");
sw.WriteLine("\t\t}");
sw.WriteLine();
sw.WriteLine("\t\t~" + sname + "()");
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\t_Instances.Remove(_key);");
sw.WriteLine("\t\t\tif(_Instances.Count == 0) {");
sw.WriteLine("\t\t\t\t_Delegate = null;");
sw.WriteLine("\t\t\t}");
sw.WriteLine("\t\t}");
sw.WriteLine("\t}");
sw.WriteLine("}");
sw.Close();
return ns + "Sharp." + sname;
}
}
}

View file

@ -1,266 +1,268 @@
// GtkSharp.Generation.StructBase.cs - The Structure/Object Base Class.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2001 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
public class StructBase : ClassBase {
ArrayList fields = new ArrayList ();
uint bitfields;
public StructBase (XmlElement ns, XmlElement elem) : base (ns, elem)
{
hasDefaultConstructor = false;
foreach (XmlNode node in elem.ChildNodes) {
if (!(node is XmlElement)) continue;
XmlElement member = (XmlElement) node;
switch (node.Name) {
case "field":
fields.Add (member);
break;
case "callback":
Statistics.IgnoreCount++;
break;
default:
if (!IsNodeNameHandled (node.Name))
Console.WriteLine ("Unexpected node " + node.Name + " in " + CName);
break;
}
}
}
public override String MarshalType {
get
{
return "ref " + QualifiedName;
}
}
public override String MarshalReturnType {
get
{
return "IntPtr";
}
}
public override String CallByName (String var_name)
{
return "ref " + var_name;
}
public override String CallByName ()
{
return "ref this";
}
public override String AssignToName {
get { return "raw"; }
}
public override String FromNative(String var)
{
return var;
}
public override String FromNativeReturn(String var)
{
return QualifiedName + ".New (" + var + ")";
}
bool IsBit (XmlElement field)
{
return (field.HasAttribute("bits") && (field.GetAttribute("bits") == "1"));
}
bool IsPointer (XmlElement field)
{
string c_type = field.GetAttribute("type");
return (c_type[c_type.Length - 1] == '*');
}
protected void GenFields (StreamWriter sw)
{
bitfields = 0;
bool need_field = true;
foreach (XmlElement field in fields) {
if (IsBit (field)) {
if (need_field)
need_field = false;
else
continue;
} else
need_field = true;
GenField (field, sw);
}
}
protected bool GetFieldInfo (XmlElement field, out string c_type, out string type, out string name)
{
name = "";
c_type = field.GetAttribute ("type");
type = SymbolTable.GetCSType (c_type);
if (IsBit (field)) {
type = "uint";
} else if ((IsPointer (field) || SymbolTable.IsOpaque (c_type)) && type != "string") {
type = "IntPtr";
name = "_";
} else if (SymbolTable.IsCallback (c_type)) {
type = "IntPtr";
} else {
if (type == "") {
Console.WriteLine ("Field has unknown Type {0}", c_type);
Statistics.ThrottledCount++;
return false;
}
}
// FIXME: marshalling not implemented here in mono
if (field.HasAttribute("array_len"))
type = "IntPtr";
if (IsBit (field))
name = String.Format ("_bitfield{0}", bitfields++);
else
name += MangleName (field.GetAttribute ("cname"));
return true;
}
protected bool GenField (XmlElement field, StreamWriter sw)
{
string c_type, type, name;
if (!GetFieldInfo (field, out c_type, out type, out name))
return false;
sw.WriteLine ("\t\tpublic {0} {1};", type, name);
if (field.HasAttribute("array_len"))
Console.WriteLine ("warning: array field {0}.{1} probably incorrectly generated", QualifiedName, name);
string wrapped = SymbolTable.GetCSType (c_type);
string wrapped_name = MangleName (field.GetAttribute ("cname"));
if (SymbolTable.IsObject (c_type)) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { ");
sw.WriteLine ("\t\t\t\t" + wrapped + " ret = " + SymbolTable.FromNativeReturn(c_type, name) + ";");
sw.WriteLine ("\t\t\t\tret.Ref ();");
sw.WriteLine ("\t\t\t\treturn ret;");
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\tset { " + name + " = " + SymbolTable.CallByName (c_type, "value") + "; }");
sw.WriteLine ("\t\t}");
} else if (SymbolTable.IsOpaque (c_type)) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { ");
sw.WriteLine ("\t\t\t\t" + wrapped + " ret = " + SymbolTable.FromNativeReturn(c_type, name) + ";");
sw.WriteLine ("\t\t\t\tif (ret == null) ret = new " + wrapped + "(" + name + ");");
sw.WriteLine ("\t\t\t\treturn ret;");
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\tset { " + name + " = " + SymbolTable.CallByName (c_type, "value") + "; }");
sw.WriteLine ("\t\t}");
} else if (IsPointer (field) && (SymbolTable.IsStruct (c_type) || SymbolTable.IsBoxed (c_type))) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { return " + SymbolTable.FromNativeReturn (c_type, name) + "; }");
sw.WriteLine ("\t\t}");
}
return true;
}
private String MangleName(String name)
{
if (name == "string") {
return "str1ng";
} else if (name == "event") {
return "evnt";
} else if (name == "null") {
return "is_null";
} else if (name == "object") {
return "objekt";
} else if (name == "ref") {
return "reference";
} else if (name == "params") {
return "parms";
} else if (name == "fixed") {
return "mfixed";
} else if (name == "in") {
return "inn";
} else {
return name;
}
}
public virtual void Generate ()
{
StreamWriter sw = CreateWriter ();
sw.WriteLine ("\tusing System;");
sw.WriteLine ("\tusing System.Collections;");
sw.WriteLine ("\tusing System.Runtime.InteropServices;");
sw.WriteLine ();
sw.WriteLine("\t\t/// <summary> " + Name + " Struct </summary>");
sw.WriteLine("\t\t/// <remarks>");
sw.WriteLine("\t\t/// </remarks>");
sw.WriteLine ("\t[StructLayout(LayoutKind.Sequential)]");
sw.WriteLine ("\tpublic struct " + Name + " {");
sw.WriteLine ();
GenFields (sw);
sw.WriteLine ();
GenCtors (sw);
GenMethods (sw, null, null, true);
AppendCustom(sw);
sw.WriteLine ("\t}");
CloseWriter (sw);
}
protected override void GenCtors (StreamWriter sw)
{
sw.WriteLine ("\t\tbool _is_null;");
sw.WriteLine ("\t\tpublic bool IsNull {");
sw.WriteLine ("\t\t\tget { return _is_null; }");
sw.WriteLine ("\t\t}");
sw.WriteLine ("\t\tpublic void _Initialize () {");
sw.WriteLine ("\t\t\t_is_null = false;");
sw.WriteLine ("\t\t}");
sw.WriteLine();
sw.WriteLine ("\t\tpublic static " + QualifiedName + " New(IntPtr raw) {");
sw.WriteLine ("\t\t\t{0} self = new {0}();", QualifiedName);
sw.WriteLine ("\t\t\tif (raw == IntPtr.Zero) {");
sw.WriteLine ("\t\t\t\tself._is_null = true;");
sw.WriteLine ("\t\t\t} else {");
sw.WriteLine ("\t\t\t\tself = ({0}) Marshal.PtrToStructure (raw, self.GetType ());", QualifiedName);
sw.WriteLine ("\t\t\t\tself._is_null = false;");
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\treturn self;");
sw.WriteLine ("\t\t}");
sw.WriteLine();
foreach (Ctor ctor in Ctors) {
ctor.ForceStatic = true;
}
base.GenCtors (sw);
}
}
}
// GtkSharp.Generation.StructBase.cs - The Structure/Object Base Class.
//
// Author: Mike Kestner <mkestner@speakeasy.net>
//
// (c) 2001 Mike Kestner
namespace GtkSharp.Generation {
using System;
using System.Collections;
using System.IO;
using System.Text.RegularExpressions;
using System.Xml;
public class StructBase : ClassBase {
ArrayList fields = new ArrayList ();
uint bitfields;
public StructBase (XmlElement ns, XmlElement elem) : base (ns, elem)
{
hasDefaultConstructor = false;
foreach (XmlNode node in elem.ChildNodes) {
if (!(node is XmlElement)) continue;
XmlElement member = (XmlElement) node;
switch (node.Name) {
case "field":
fields.Add (member);
break;
case "callback":
Statistics.IgnoreCount++;
break;
default:
if (!IsNodeNameHandled (node.Name))
Console.WriteLine ("Unexpected node " + node.Name + " in " + CName);
break;
}
}
}
public override String MarshalType {
get
{
return "ref " + QualifiedName;
}
}
public override String MarshalReturnType {
get
{
return "IntPtr";
}
}
public override String CallByName (String var_name)
{
return "ref " + var_name;
}
public override String CallByName ()
{
return "ref this";
}
public override String AssignToName {
get { return "raw"; }
}
public override String FromNative(String var)
{
return var;
}
public override String FromNativeReturn(String var)
{
return QualifiedName + ".New (" + var + ")";
}
bool IsBit (XmlElement field)
{
return (field.HasAttribute("bits") && (field.GetAttribute("bits") == "1"));
}
bool IsPointer (XmlElement field)
{
string c_type = field.GetAttribute("type");
return (c_type[c_type.Length - 1] == '*');
}
protected void GenFields (StreamWriter sw)
{
bitfields = 0;
bool need_field = true;
foreach (XmlElement field in fields) {
if (IsBit (field)) {
if (need_field)
need_field = false;
else
continue;
} else
need_field = true;
GenField (field, sw);
}
}
protected bool GetFieldInfo (XmlElement field, out string c_type, out string type, out string name)
{
name = "";
c_type = field.GetAttribute ("type");
type = SymbolTable.GetCSType (c_type);
if (IsBit (field)) {
type = "uint";
} else if ((IsPointer (field) || SymbolTable.IsOpaque (c_type)) && type != "string") {
type = "IntPtr";
name = "_";
} else if (SymbolTable.IsCallback (c_type)) {
type = "IntPtr";
} else {
if (type == "") {
Console.WriteLine ("Field has unknown Type {0}", c_type);
Statistics.ThrottledCount++;
return false;
}
}
// FIXME: marshalling not implemented here in mono
if (field.HasAttribute("array_len"))
type = "IntPtr";
if (IsBit (field))
name = String.Format ("_bitfield{0}", bitfields++);
else
name += MangleName (field.GetAttribute ("cname"));
return true;
}
protected bool GenField (XmlElement field, StreamWriter sw)
{
string c_type, type, name;
if (!GetFieldInfo (field, out c_type, out type, out name))
return false;
sw.WriteLine ("\t\tpublic {0} {1};", type, name);
if (field.HasAttribute("array_len"))
Console.WriteLine ("warning: array field {0}.{1} probably incorrectly generated", QualifiedName, name);
string wrapped = SymbolTable.GetCSType (c_type);
string wrapped_name = MangleName (field.GetAttribute ("cname"));
if (SymbolTable.IsObject (c_type)) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { ");
sw.WriteLine ("\t\t\t\t" + wrapped + " ret = " + SymbolTable.FromNativeReturn(c_type, name) + ";");
sw.WriteLine ("\t\t\t\tret.Ref ();");
sw.WriteLine ("\t\t\t\treturn ret;");
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\tset { " + name + " = " + SymbolTable.CallByName (c_type, "value") + "; }");
sw.WriteLine ("\t\t}");
} else if (SymbolTable.IsOpaque (c_type)) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { ");
sw.WriteLine ("\t\t\t\t" + wrapped + " ret = " + SymbolTable.FromNativeReturn(c_type, name) + ";");
sw.WriteLine ("\t\t\t\tif (ret == null) ret = new " + wrapped + "(" + name + ");");
sw.WriteLine ("\t\t\t\treturn ret;");
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\tset { " + name + " = " + SymbolTable.CallByName (c_type, "value") + "; }");
sw.WriteLine ("\t\t}");
} else if (IsPointer (field) && (SymbolTable.IsStruct (c_type) || SymbolTable.IsBoxed (c_type))) {
sw.WriteLine ();
sw.WriteLine ("\t\tpublic " + wrapped + " " + wrapped_name + " {");
sw.WriteLine ("\t\t\tget { return " + SymbolTable.FromNativeReturn (c_type, name) + "; }");
sw.WriteLine ("\t\t}");
}
return true;
}
private String MangleName(String name)
{
if (name == "string") {
return "str1ng";
} else if (name == "event") {
return "evnt";
} else if (name == "null") {
return "is_null";
} else if (name == "object") {
return "objekt";
} else if (name == "ref") {
return "reference";
} else if (name == "params") {
return "parms";
} else if (name == "fixed") {
return "mfixed";
} else if (name == "in") {
return "inn";
} else {
return name;
}
}
public virtual void Generate ()
{
StreamWriter sw = CreateWriter ();
sw.WriteLine ("\tusing System;");
sw.WriteLine ("\tusing System.Collections;");
sw.WriteLine ("\tusing System.Runtime.InteropServices;");
sw.WriteLine ();
sw.WriteLine("\t\t/// <summary> " + Name + " Struct </summary>");
sw.WriteLine("\t\t/// <remarks>");
sw.WriteLine("\t\t/// </remarks>");
sw.WriteLine ("\t[StructLayout(LayoutKind.Sequential)]");
sw.WriteLine ("\tpublic struct " + Name + " {");
sw.WriteLine ();
GenFields (sw);
sw.WriteLine ();
GenCtors (sw);
GenMethods (sw, null, null, true);
AppendCustom(sw);
sw.WriteLine ("\t}");
CloseWriter (sw);
}
protected override void GenCtors (StreamWriter sw)
{
sw.WriteLine ("\t\tpublic static {0} Zero = new {0} ();", QualifiedName);
sw.WriteLine();
sw.WriteLine ("\t\tpublic static " + QualifiedName + " New(IntPtr raw) {");
sw.WriteLine ("\t\t\tif (raw == IntPtr.Zero) {");
sw.WriteLine ("\t\t\t\treturn {0}.Zero;", QualifiedName);
sw.WriteLine ("\t\t\t}");
sw.WriteLine ("\t\t\t{0} self = new {0}();", QualifiedName);
sw.WriteLine ("\t\t\tself = ({0}) Marshal.PtrToStructure (raw, self.GetType ());", QualifiedName);
sw.WriteLine ("\t\t\treturn self;");
sw.WriteLine ("\t\t}");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic static bool operator == ({0} a, {0} b)", QualifiedName);
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\treturn a.Equals (b);");
sw.WriteLine ("\t\t}");
sw.WriteLine ();
sw.WriteLine ("\t\tpublic static bool operator != ({0} a, {0} b)", QualifiedName);
sw.WriteLine ("\t\t{");
sw.WriteLine ("\t\t\treturn ! a.Equals (b);");
sw.WriteLine ("\t\t}");
sw.WriteLine();
foreach (Ctor ctor in Ctors) {
ctor.ForceStatic = true;
}
base.GenCtors (sw);
}
}
}

View file

@ -16,6 +16,7 @@ BASESOURCES = \
type.c \
widget.c \
list.c \
clipboard.c \
#
GNOMESOURCES = \

56
glue/clipboard.c Normal file
View file

@ -0,0 +1,56 @@
/*
* clipboard.c
*/
#include <gtk/gtk.h>
GSList *
gtksharp_clipboard_target_list_add (GSList *list, char *target, guint flags, guint info)
{
GtkTargetEntry *entry = g_new0 (GtkTargetEntry, 1);
entry->target = g_strdup (target);
entry->flags = flags;
entry->info = info;
return g_slist_prepend (list, entry);
}
GtkTargetEntry *
gtksharp_clipboard_target_list_to_array (GSList *list)
{
GtkTargetEntry *targets;
GSList *iter;
int i;
targets = g_new0 (GtkTargetEntry, g_slist_length (list));
for (iter = list, i = 0; iter; iter = iter->next, i++) {
GtkTargetEntry *t = (GtkTargetEntry *) iter->data;
targets[i].target = t->target; /* NOT COPIED */
targets[i].flags = t->flags;
targets[i].info = t->info;
}
return targets;
}
void
gtksharp_clipboard_target_array_free (GtkTargetEntry *targets)
{
g_free (targets);
}
void
gtksharp_clipboard_target_list_free (GSList *list)
{
GSList *iter;
for (iter = list; iter; iter = iter->next) {
GtkTargetEntry *t = (GtkTargetEntry *) iter->data;
g_free (t->target);
g_free (t);
}
g_slist_free (list);
}

View file

@ -27,7 +27,7 @@ namespace Gnome {
} else {
args.Args[0] = null;
}
arg2._Initialize ();
args.Args[1] = arg2;
args.Args[2] = arg3;

54
gtk/Clipboard.custom Normal file
View file

@ -0,0 +1,54 @@
public static Hashtable clipboard_objects = new Hashtable ();
private static uint clipboard_object_next_id = 0;
[DllImport("gtk-x11-2.0")]
static extern bool gtk_clipboard_set_with_data(IntPtr raw, IntPtr targets, int n_targets, GtkSharp.GtkClipboardGetFuncNative get_func, GtkSharp.GtkClipboardClearFuncNative clear_func, uint id);
[DllImport("gtksharpglue")]
static extern IntPtr gtksharp_clipboard_target_list_add (IntPtr list, string name, uint flags, uint info);
[DllImport("gtksharpglue")]
static extern IntPtr gtksharp_clipboard_target_list_to_array (IntPtr list);
[DllImport("gtksharpglue")]
static extern void gtksharp_clipboard_target_array_free (IntPtr targets);
[DllImport("gtksharpglue")]
static extern void gtksharp_clipboard_target_list_free (IntPtr list);
GtkSharp.GtkClipboardGetFuncWrapper get_func_wrapper;
GtkSharp.GtkClipboardClearFuncWrapper clear_func_wrapper;
public bool Set (Gtk.TargetEntry[] targets,
Gtk.ClipboardGetFunc get_func,
Gtk.ClipboardClearFunc clear_func,
object data)
{
uint this_id;
lock (clipboard_objects) {
this_id = clipboard_object_next_id++;
clipboard_objects[this_id] = data;
}
get_func_wrapper = new GtkSharp.GtkClipboardGetFuncWrapper (get_func);
clear_func_wrapper = new GtkSharp.GtkClipboardClearFuncWrapper (clear_func);
IntPtr list = IntPtr.Zero;
foreach (Gtk.TargetEntry t in targets) {
list = gtksharp_clipboard_target_list_add (list, t.target, t.flags, t.info);
}
IntPtr array = gtksharp_clipboard_target_list_to_array (list);
bool ret = gtk_clipboard_set_with_data (Handle, array, targets.Length, get_func_wrapper.NativeDelegate, clear_func_wrapper.NativeDelegate, this_id);
gtksharp_clipboard_target_array_free (array);
gtksharp_clipboard_target_list_free (list);
return ret;
}

View file

@ -0,0 +1,8 @@
// Generated File. Do not modify.
// <c> 2001-2002 Mike Kestner
namespace Gtk {
public delegate void ClipboardClearFunc(Gtk.Clipboard clipboard, object o);
}

8
gtk/ClipboardGetFunc.cs Normal file
View file

@ -0,0 +1,8 @@
// Generated File. Do not modify.
// <c> 2001-2002 Mike Kestner
namespace Gtk {
public delegate void ClipboardGetFunc(Gtk.Clipboard clipboard, ref Gtk.SelectionData selection_data, uint info, object o);
}

View file

@ -0,0 +1,31 @@
namespace GtkSharp {
using System;
using System.Collections;
public delegate void GtkClipboardClearFuncNative(IntPtr clipboard, uint objid);
public class GtkClipboardClearFuncWrapper : GLib.DelegateWrapper {
public void NativeCallback (IntPtr clipboard, uint objid)
{
object[] _args = new object[2];
_args[0] = (Gtk.Clipboard) GLib.Opaque.GetOpaque(clipboard);
if (_args[0] == null)
_args[0] = new Gtk.Clipboard(clipboard);
_args[1] = Gtk.Clipboard.clipboard_objects[objid];
_managed ((Gtk.Clipboard) _args[0], _args[1]);
Gtk.Clipboard.clipboard_objects.Remove (objid);
}
public GtkClipboardClearFuncNative NativeDelegate;
protected Gtk.ClipboardClearFunc _managed;
public GtkClipboardClearFuncWrapper (Gtk.ClipboardClearFunc managed) : base ()
{
NativeDelegate = new GtkClipboardClearFuncNative (NativeCallback);
_managed = managed;
}
}
}

View file

@ -0,0 +1,33 @@
namespace GtkSharp {
using System;
using System.Collections;
public delegate void GtkClipboardGetFuncNative(IntPtr clipboard, ref Gtk.SelectionData selection_data, uint info, uint obj_id);
public class GtkClipboardGetFuncWrapper : GLib.DelegateWrapper {
public void NativeCallback (IntPtr clipboard, ref Gtk.SelectionData selection_data, uint info, uint obj_id)
{
object[] _args = new object[4];
_args[0] = (Gtk.Clipboard) GLib.Opaque.GetOpaque(clipboard);
if (_args[0] == null)
_args[0] = new Gtk.Clipboard(clipboard);
_args[1] = selection_data;
_args[2] = info;
_args[3] = Gtk.Clipboard.clipboard_objects[obj_id];
_managed ((Gtk.Clipboard) _args[0], ref selection_data, (uint) _args[2], _args[3]);
}
public GtkClipboardGetFuncNative NativeDelegate;
protected Gtk.ClipboardGetFunc _managed;
public GtkClipboardGetFuncWrapper (Gtk.ClipboardGetFunc managed) : base ()
{
NativeDelegate = new GtkClipboardGetFuncNative (NativeCallback);
_managed = managed;
}
}
}

View file

@ -6,23 +6,19 @@
//
// This code is inserted after the automatically generated code.
[DllImport("gtksharpglue")]
static extern void gtksharp_object_unref_if_floating (IntPtr raw);
private static extern bool gtksharp_object_is_floating (IntPtr raw);
protected override void DisposeNative ()
{
if (_needs_unref)
base.DisposeNative ();
else
gtksharp_object_unref_if_floating (Handle);
protected override IntPtr Raw {
get {
return base.Raw;
}
set {
base.Raw = value;
if (!needs_ref && gtksharp_object_is_floating (value)) {
Ref ();
Sink ();
}
// System.Diagnostics.Debug.WriteLine ("Gtk.Object:set_Raw: object type is: " + (this as GLib.Object).GType.Name + " refcount now: " + RefCount + " needs_ref: " + needs_ref);
}
}
private bool _needs_unref = false;
public override void Ref ()
{
_needs_unref = true;
base.Ref ();
}

29
gtk/SelectionData.custom Normal file
View file

@ -0,0 +1,29 @@
[DllImport("gtk-x11-2.0")]
private static extern string gtk_selection_data_get_text (ref Gtk.SelectionData selection_data);
[DllImport("gtk-x11-2.0")]
private static extern void gtk_selection_data_set_text (ref Gtk.SelectionData selection_data, string str, int len);
public string Text {
get {
return gtk_selection_data_get_text (ref this);
}
set {
gtk_selection_data_set_text (ref this, value, value.Length);
}
}
[DllImport("gtk-x11-2.0")]
static extern void gtk_selection_data_set (ref Gtk.SelectionData raw, IntPtr type, int format, byte[] data, int length);
public byte[] Data {
get {
byte[] ret = new byte[length];
Marshal.Copy (_data, ret, 0, length);
return ret;
}
set {
gtk_selection_data_set (ref this, _type, format, value, value.Length);
}
}

View file

@ -161,7 +161,7 @@ namespace GtkSamples {
if (type != Gdk.WindowType.Child)
Console.WriteLine ("Struct field accessors appear to be broken.");
if (!ev.IsNull && ev.type == EventType.TwoButtonPress && ev.button == 1) {
if ((ev != Gdk.EventButton.Zero) && ev.type == EventType.TwoButtonPress && ev.button == 1) {
g_spawn_command_line_async ("mono " + entries[idx].program, IntPtr.Zero);
}
}

View file

@ -34,7 +34,7 @@ namespace GtkSamples {
static void Size_Allocated (object obj, SizeAllocatedArgs args)
{
Gdk.Rectangle rect = args.Allocation;
if (rect.IsNull)
if (rect == Gdk.Rectangle.Zero)
Console.WriteLine ("ERROR: Allocation is null!");
Console.WriteLine ("Size: ({0}, {1})", rect.width, rect.height);
}

View file

@ -1286,6 +1286,19 @@
</attribute>
</data>
</rule>
<rule>
<class name="GtkSelectionData">
<method>GetText</method>
<method>SetText</method>
<method>Set</method>
</class>
<data>
<attribute target="method">
<name>hidden</name>
<value>1</value>
</attribute>
</data>
</rule>
<!-- overloads -->
<rule>
@ -1854,7 +1867,7 @@
<!-- reference rules -->
<rule>
<class name="GtkWidget">
<!-- <class name="GtkWidget">
<method>GetStyle</method>
<method>GetModifierStyle</method>
<method>GetDefaultStyle</method>
@ -1870,6 +1883,7 @@
<value>1</value>
</attribute>
</data>
-->
</rule>