From 4966896f1e3d8549ebbe22f0d0efa80d075fda2a Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Fri, 8 Feb 2002 23:56:27 +0000 Subject: [PATCH] This should be the last enormo-diff on mono-patches. I have removed the api.xml file from CVS with this commit. It can be downloaded from http://sf.net/projects/gtk-sharp. I will be uploading new versions of the file, now named gtkapi.xml, to the project download area from now on. 2002-02-08 Mike Kestner * README : Some updates. * generator/BoxedGen.cs : Add FromNative method. * generator/CallbackGen.cs : Add FromNative method. * generator/EnumGen.cs : Add FromNative method. * generator/IGeneratable.cs : Add FromNative method. * generator/InterfaceGen.cs : Add FromNative method. * generator/ObjectGen.cs : Add FromNative method. Hook in GenMethod. * generator/StructBase.cs : Revamp param handling. Add GenMethod. * generator/StructGen.cs : Add FromNative method. * generator/SymbolTable.cs : Add FromNative method. * parser/gapi2xml.pl : Detect ctors before methods. Fix method names. * sample/HelloWorld.cs : uncomment the Show call. svn path=/trunk/gtk-sharp/; revision=2277 --- ChangeLog | 15 ++++++++ README | 27 ++++++++++--- generator/.cvsignore | 1 - generator/BoxedGen.cs | 7 +++- generator/CallbackGen.cs | 5 +++ generator/EnumGen.cs | 5 +++ generator/IGeneratable.cs | 2 + generator/InterfaceGen.cs | 7 +++- generator/ObjectGen.cs | 8 ++++ generator/StructBase.cs | 80 ++++++++++++++++++++++++++++++++------- generator/StructGen.cs | 5 +++ generator/SymbolTable.cs | 14 +++++++ generator/api.xml | 2 - generator/makefile | 2 +- parser/gapi2xml.pl | 10 ++--- sample/HelloWorld.cs | 2 +- 16 files changed, 162 insertions(+), 30 deletions(-) delete mode 100644 generator/api.xml diff --git a/ChangeLog b/ChangeLog index 92c24e40f..7a38aa6a4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2002-02-08 Mike Kestner + + * README : Some updates. + * generator/BoxedGen.cs : Add FromNative method. + * generator/CallbackGen.cs : Add FromNative method. + * generator/EnumGen.cs : Add FromNative method. + * generator/IGeneratable.cs : Add FromNative method. + * generator/InterfaceGen.cs : Add FromNative method. + * generator/ObjectGen.cs : Add FromNative method. Hook in GenMethod. + * generator/StructBase.cs : Revamp param handling. Add GenMethod. + * generator/StructGen.cs : Add FromNative method. + * generator/SymbolTable.cs : Add FromNative method. + * parser/gapi2xml.pl : Detect ctors before methods. Fix method names. + * sample/HelloWorld.cs : uncomment the Show call. + 2002-02-06 Mike Kestner * generator/BoxedGen.cs : Marshal as IntPtr using Raw prop. diff --git a/README b/README index ee1eb082a..b18a2a36b 100644 --- a/README +++ b/README @@ -1,13 +1,30 @@ -The Gtk# hompage can be found at gtk-sharp.sourceforge.net. +The Gtk# homepage can be found at gtk-sharp.sourceforge.net. -Gtk# is a C# binding for the Gtk toolkit (www.gtk.org). The target is the +Gtk# is a C# binding for the Gtk+ toolkit (www.gtk.org). The target is the 2.0 platform, and no plans are currently in place to backport to 1.2. The effort essentially boils down to an exercise in PInvoke against the C dynamic libraries. It may end up being slow as hell, but we'll see when we get there and adjust accordingly. -The "Hello World" application in the sample directory has been executed -on Win32, but a recent version of Gtk is required. The binaries from the Gimp -Win32 porting project were not compatible at last check. +Building Gtk#: +-------------- +Currently, it is only possible to compile Gtk# on Win32 using the .Net +framework compiler and libraries. Miguel and company will be changing that +shortly. The win32 compilation utilizes the cygwin environment for a GNU +build environment. + +You will also need a a recent copy of the gtkapi.xml file. Tarballs containing +this file can be downloaded from the Sourceforge gtk-sharp project page. Extract +the tar.gz file into the generator directory and then type: + +make windows + +in the top level directory. + +Discussion: +----------- +A mailing list for Gtk# discussion (gtk-sharp-list@ximian.com) is available. +Subscription and archives are available at lists.ximian.com. The list +requires subscription in order to post. diff --git a/generator/.cvsignore b/generator/.cvsignore index 7851f6209..4e8ac1c1b 100644 --- a/generator/.cvsignore +++ b/generator/.cvsignore @@ -1,4 +1,3 @@ *.dll *.exe -generated diff --git a/generator/BoxedGen.cs b/generator/BoxedGen.cs index 7193912e7..a39057ebe 100644 --- a/generator/BoxedGen.cs +++ b/generator/BoxedGen.cs @@ -25,7 +25,12 @@ namespace GtkSharp.Generation { { return var_name + ".Raw"; } - + + public String FromNative(String var) + { + return "GLib.Boxed.GetBoxed(" + var + ")"; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { diff --git a/generator/CallbackGen.cs b/generator/CallbackGen.cs index 2dea17840..75fb1560a 100644 --- a/generator/CallbackGen.cs +++ b/generator/CallbackGen.cs @@ -54,6 +54,11 @@ namespace GtkSharp.Generation { return ""; } + public String FromNative(String var) + { + return ""; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { diff --git a/generator/EnumGen.cs b/generator/EnumGen.cs index bec15d474..b8380c95a 100644 --- a/generator/EnumGen.cs +++ b/generator/EnumGen.cs @@ -54,6 +54,11 @@ namespace GtkSharp.Generation { return "(int) " + var_name; } + public String FromNative(String var) + { + return "(" + QualifiedName + ")" + var; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { diff --git a/generator/IGeneratable.cs b/generator/IGeneratable.cs index 42c1555df..1a583ba41 100644 --- a/generator/IGeneratable.cs +++ b/generator/IGeneratable.cs @@ -19,6 +19,8 @@ namespace GtkSharp.Generation { String QualifiedName {get;} String CallByName (String var_name); + + String FromNative (String var); void Generate (SymbolTable table); } diff --git a/generator/InterfaceGen.cs b/generator/InterfaceGen.cs index 43ee49627..b61fb057d 100644 --- a/generator/InterfaceGen.cs +++ b/generator/InterfaceGen.cs @@ -53,7 +53,12 @@ namespace GtkSharp.Generation { { return ""; } - + + public String FromNative(String var) + { + return ""; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index 1c71ed630..b69f5accd 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -27,6 +27,11 @@ namespace GtkSharp.Generation { return var_name + ".Handle"; } + public String FromNative(String var) + { + return "GLib.Object.GetObject(" + var + ")"; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { @@ -86,6 +91,9 @@ namespace GtkSharp.Generation { break; case "method": + if (!GenMethod(member, table, sw)) { + Console.WriteLine("in object " + CName); + } break; case "property": diff --git a/generator/StructBase.cs b/generator/StructBase.cs index 36539fbe5..3a6fd67ac 100644 --- a/generator/StructBase.cs +++ b/generator/StructBase.cs @@ -51,12 +51,16 @@ namespace GtkSharp.Generation { XmlElement parms = ctor["parameters"]; if (parms == null) { - sig = "()"; - isig = call = "();"; + call = sig = "()"; + isig = "();"; sigtypes = ""; - } else if (!GetSignature(parms, table, out sig, out sigtypes) || - !GetImportSig(parms, table, out isig) || - !GetCallString(parms, table, out call)) { + } else if (GetSignature(parms, table, out sig, out sigtypes) && + GetImportSig(parms, table, out isig) && + GetCallString(parms, table, out call)) { + sig = "(" + sig + ")"; + isig = "(" + isig + ");"; + call = "(" + call + ")"; + } else { Console.Write("ctor "); return false; } @@ -119,9 +123,64 @@ namespace GtkSharp.Generation { return true; } + protected bool GenMethod(XmlElement method, SymbolTable table, StreamWriter sw) + { + String sig, isig, call, sigtypes; + XmlElement parms = method["parameters"]; + + if (parms == null) { + call = sig = "()"; + isig = "();"; + sigtypes = ""; + } else if (GetSignature(parms, table, out sig, out sigtypes) && + GetImportSig(parms, table, out isig) && + GetCallString(parms, table, out call)) { + sig = "(" + sig + ")"; + isig = "(IntPtr raw, " + isig + ");"; + call = "(Handle, " + call + ")"; + } else { + Console.Write("method "); + return false; + } + + String rettype = "void"; + if (method.HasAttribute("return-type")) { + rettype = method.GetAttribute("return-type"); + } + + String m_ret = table.GetMarshalType(rettype); + String s_ret = table.GetCSType(rettype); + if (m_ret == "" || s_ret == "") { + Console.Write("rettype: " + rettype + " method "); + return false; + } + + String cname = method.GetAttribute("cname"); + String name = method.GetAttribute("name"); + + sw.WriteLine("\t\t[DllImport(\"" + table.GetDllName(ns) + + "\", CallingConvention=CallingConvention.Cdecl)]"); + sw.Write("\t\tstatic extern " + m_ret + " " + cname + isig); + sw.WriteLine(); + + sw.WriteLine("\t\tpublic " + s_ret + " " + name + sig); + sw.WriteLine("\t\t{"); + sw.Write("\t\t\t"); + if (m_ret == "void") { + sw.WriteLine(cname + call + ";"); + } else { + sw.WriteLine("return " + table.FromNative(rettype, cname + call) + ";"); + } + + sw.WriteLine("\t\t}"); + sw.WriteLine(); + + return true; + } + private bool GetCallString(XmlElement parms, SymbolTable table, out String call) { - call = "("; + call = ""; bool need_comma = false; @@ -149,13 +208,12 @@ namespace GtkSharp.Generation { call += call_parm; } - call += ")"; return true; } private bool GetImportSig(XmlElement parms, SymbolTable table, out String isig) { - isig = "("; + isig = ""; bool need_comma = false; @@ -187,16 +245,13 @@ namespace GtkSharp.Generation { isig += (m_type + " " + name); } - isig += ");"; return true; } private bool GetSignature(XmlElement parms, SymbolTable table, out String sig, out String sigtypes) { - sig = "("; - + sigtypes = sig = ""; bool need_comma = false; - sigtypes = ""; foreach (XmlNode parm in parms.ChildNodes) { if (parm.Name != "parameter") { @@ -228,7 +283,6 @@ namespace GtkSharp.Generation { sigtypes += cs_type; } - sig += ")"; return true; } diff --git a/generator/StructGen.cs b/generator/StructGen.cs index 888917d9f..142b372c4 100644 --- a/generator/StructGen.cs +++ b/generator/StructGen.cs @@ -26,6 +26,11 @@ namespace GtkSharp.Generation { return var_name; } + public String FromNative(String var) + { + return var; + } + public void Generate (SymbolTable table) { if (!Directory.Exists("..\\" + ns.ToLower() + "\\generated")) { diff --git a/generator/SymbolTable.cs b/generator/SymbolTable.cs index 28e52423a..899408c8e 100644 --- a/generator/SymbolTable.cs +++ b/generator/SymbolTable.cs @@ -18,6 +18,7 @@ namespace GtkSharp.Generation { public SymbolTable () { simple_types = new Hashtable (); + simple_types.Add ("void", "void"); simple_types.Add ("gboolean", "bool"); simple_types.Add ("gint", "int"); simple_types.Add ("guint", "uint"); @@ -95,6 +96,19 @@ namespace GtkSharp.Generation { return trim_type; } + public String FromNative(String c_type, String val) + { + c_type = Trim(c_type); + if (simple_types.ContainsKey(c_type)) { + return val; + } else if (complex_types.ContainsKey(c_type)) { + IGeneratable gen = (IGeneratable) complex_types[c_type]; + return gen.FromNative(val); + } else { + return ""; + } + } + public String GetCSType(String c_type) { c_type = Trim(c_type); diff --git a/generator/api.xml b/generator/api.xml deleted file mode 100644 index a9117f82c..000000000 --- a/generator/api.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/generator/makefile b/generator/makefile index 3b18daf42..d5bf272ea 100644 --- a/generator/makefile +++ b/generator/makefile @@ -4,7 +4,7 @@ all: windows: $(CSC) /unsafe /out:codegen.exe /recurse:*.cs - ./codegen api.xml + ./codegen gtkapi.xml unix: @echo "'make unix' is broken for now." diff --git a/parser/gapi2xml.pl b/parser/gapi2xml.pl index 771296102..e6bac372c 100755 --- a/parser/gapi2xml.pl +++ b/parser/gapi2xml.pl @@ -368,14 +368,14 @@ sub addFuncElems foreach $mname (keys(%fdefs)) { next if ($mname !~ /$prefix/); - if ($fdefs{$mname} =~ /\(\s*$inst\b/) { + if ($mname =~ /$prefix(new)/) { + $el = addNameElem($obj_el, 'constructor', $mname); + $drop_1st = 0; + } elsif ($fdefs{$mname} =~ /\(\s*$inst\b/) { $el = addNameElem($obj_el, 'method', $mname, $prefix); $fdefs{$mname} =~ /(.*?)\w+\s*\(/; addReturnElem($el, $1); $drop_1st = 1; - } elsif ($mname =~ /$prefix(new)/) { - $el = addNameElem($obj_el, 'constructor', $mname); - $drop_1st = 0; } else { next; } @@ -401,7 +401,7 @@ sub addNameElem $node->appendChild($elem); if ($prefix) { $cname =~ /$prefix(\w+)/; - $elem->setAttribute('name', $1); + $elem->setAttribute('name', StudlyCaps($1)); } if ($cname) { $elem->setAttribute('cname', $cname); diff --git a/sample/HelloWorld.cs b/sample/HelloWorld.cs index 5bc04973e..a855fb511 100755 --- a/sample/HelloWorld.cs +++ b/sample/HelloWorld.cs @@ -22,7 +22,7 @@ namespace GtkSamples { Console.WriteLine("Setting Title"); win.Title = "Gtk# Hello World"; // win.Deleted += new EventHandler (Window_Delete); - // win.Show (); + win.Show (); Console.WriteLine("Entering event loop"); Application.Run (); return 0;