diff --git a/ChangeLog b/ChangeLog index e8b03c490..ab2620d77 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2002-02-14 Mike Kestner + + * generator/ObjectGen.cs : suppress generation of get/set methods when + properties exist. Mangle method names on signal name clashes. Gen + the signals. + * generator/SymbolTable.cs : Add GetName. Add some more calls to Trim. + * generator/gtkapi.xml : adding binary file as an experiment. If the + diff's show this file, I'll be removing it with apologies and going + back to the separate package idea. + * parser/gapi2xml.pl : some signal related fixes. + * sample/HelloWorld.cs : uncomment the event hook. + 2002-02-10 Mike Kestner * generator/BoxedGen.cs (FromNative): Add explicit cast. diff --git a/generator/ObjectGen.cs b/generator/ObjectGen.cs index 9fa94d7da..143721b54 100644 --- a/generator/ObjectGen.cs +++ b/generator/ObjectGen.cs @@ -43,7 +43,7 @@ namespace GtkSharp.Generation { StreamWriter sw = new StreamWriter (stream); sw.WriteLine ("// Generated File. Do not modify."); - sw.WriteLine ("// 2001 Mike Kestner"); + sw.WriteLine ("// 2001-2002 Mike Kestner"); sw.WriteLine (); sw.WriteLine ("namespace " + ns + " {"); @@ -69,6 +69,10 @@ namespace GtkSharp.Generation { sw.WriteLine(); Hashtable clash_map = new Hashtable(); + Hashtable props = new Hashtable(); + Hashtable sigs = new Hashtable(); + ArrayList methods = new ArrayList(); + bool first_sig = true; foreach (XmlNode node in elem.ChildNodes) { @@ -91,18 +95,27 @@ namespace GtkSharp.Generation { break; case "method": - if (!GenMethod(member, table, sw)) { - Console.WriteLine("in object " + CName); - } + methods.Add(member); break; case "property": - if (!GenProperty(member, table, sw)) { + String pname; + if (!GenProperty(member, table, sw, out pname)) { Console.WriteLine("in object " + CName); } + props.Add(pname, pname); break; case "signal": + if (first_sig) { + first_sig = false; + sw.WriteLine("\t\tprivate Hashtable Signals = new Hashtable();"); + } + String sname; + if (!GenSignal(member, table, sw, out sname)) { + Console.WriteLine("in object " + CName); + } + sigs.Add(sname, sname); break; default: @@ -116,7 +129,21 @@ namespace GtkSharp.Generation { sw.WriteLine("\t\tpublic " + Name + "() : base(){}"); sw.WriteLine(); } + + foreach (XmlElement member in methods) { + String mname = member.GetAttribute("name"); + if ((mname.StartsWith("Set") || mname.StartsWith("Get")) && + props.ContainsKey(mname.Substring(3))) { + continue; + } else if (sigs.ContainsKey(mname)) { + member.SetAttribute("name", "Emit" + mname); + } + if (!GenMethod(member, table, sw)) { + Console.WriteLine("in object " + CName); + } + } + sw.WriteLine ("\t}"); sw.WriteLine (); sw.WriteLine ("}"); @@ -125,7 +152,7 @@ namespace GtkSharp.Generation { sw.Close(); } - public bool GenProperty (XmlElement prop, SymbolTable table, StreamWriter sw) + public bool GenProperty (XmlElement prop, SymbolTable table, StreamWriter sw, out String name) { String c_type = prop.GetAttribute("type"); @@ -134,6 +161,12 @@ namespace GtkSharp.Generation { String cs_type = table.GetCSType(c_type); String m_type; + XmlElement parent = (XmlElement) prop.ParentNode; + name = prop.GetAttribute("name"); + if (name == parent.GetAttribute("name")) { + name += "Prop"; + } + if (table.IsObject(c_type)) { m_type = "GLib.Object"; } else if (table.IsBoxed(c_type)) { @@ -155,12 +188,6 @@ namespace GtkSharp.Generation { return true; } - XmlElement parent = (XmlElement) prop.ParentNode; - String name = prop.GetAttribute("name"); - if (name == parent.GetAttribute("name")) { - name += "Prop"; - } - sw.WriteLine("\t\tpublic " + cs_type + " " + name + " {"); if (prop.HasAttribute("readable")) { sw.WriteLine("\t\t\tget {"); @@ -186,30 +213,33 @@ namespace GtkSharp.Generation { return true; } - public bool GenSignal (XmlElement sig, SymbolTable table, StreamWriter sw) + public bool GenSignal (XmlElement sig, SymbolTable table, StreamWriter sw, out String name) { String cname = "\"" + sig.GetAttribute("cname") + "\""; + name = sig.GetAttribute("name"); - String marsh = "blah"; // SignalHandler.GetName(sig); + String marsh = SignalHandler.GetName(sig, table); if (marsh == "") { return false; } + + marsh = "GtkSharp." + marsh; - sw.WriteLine("\t\t/// " + cname + " Event "); + sw.WriteLine("\t\t/// " + name + " Event "); sw.WriteLine("\t\t/// "); // FIXME: Generate some signal docs sw.WriteLine("\t\t/// "); sw.WriteLine(); - sw.WriteLine("\t\tpublic event EventHandler " + cname + " {"); + sw.WriteLine("\t\tpublic event EventHandler " + name + " {"); sw.WriteLine("\t\t\tadd {"); - sw.WriteLine("\t\t\t\tif (Events [" + cname + "] == null)"); + sw.WriteLine("\t\t\t\tif (EventList[" + cname + "] == null)"); sw.Write("\t\t\t\t\tSignals[" + cname + "] = new " + marsh); sw.WriteLine("(this, Handle, " + cname + ", value);"); - sw.WriteLine("\t\t\t\tEvents.AddHandler(" + cname + ", value);"); + sw.WriteLine("\t\t\t\tEventList.AddHandler(" + cname + ", value);"); sw.WriteLine("\t\t\t}"); sw.WriteLine("\t\t\tremove {"); - sw.WriteLine("\t\t\t\tEvents.RemoveHandler(" + cname + ", value);"); - sw.WriteLine("\t\t\t\tif (Events[" + cname + "] == null)"); + sw.WriteLine("\t\t\t\tEventList.RemoveHandler(" + cname + ", value);"); + sw.WriteLine("\t\t\t\tif (EventList[" + cname + "] == null)"); sw.WriteLine("\t\t\t\t\tSignals.Remove(" + cname + ");"); sw.WriteLine("\t\t\t}"); sw.WriteLine("\t\t}"); diff --git a/generator/SymbolTable.cs b/generator/SymbolTable.cs index 899408c8e..1abe75206 100644 --- a/generator/SymbolTable.cs +++ b/generator/SymbolTable.cs @@ -122,6 +122,25 @@ namespace GtkSharp.Generation { } } + public String GetName(String c_type) + { + c_type = Trim(c_type); + if (simple_types.ContainsKey(c_type)) { + String stype = (String) simple_types[c_type]; + int dotidx = stype.IndexOf("."); + if (dotidx == -1) { + return stype; + } else { + return stype.Substring(dotidx+1); + } + } else if (complex_types.ContainsKey(c_type)) { + IGeneratable gen = (IGeneratable) complex_types[c_type]; + return gen.Name; + } else { + return ""; + } + } + public String GetDllName(String ns) { return (String) dlls[ns]; @@ -155,6 +174,7 @@ namespace GtkSharp.Generation { public bool IsBoxed(String c_type) { + c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is BoxedGen) { @@ -166,6 +186,7 @@ namespace GtkSharp.Generation { public bool IsInterface(String c_type) { + c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is InterfaceGen) { @@ -177,6 +198,7 @@ namespace GtkSharp.Generation { public bool IsObject(String c_type) { + c_type = Trim(c_type); if (complex_types.ContainsKey(c_type)) { IGeneratable gen = (IGeneratable) complex_types[c_type]; if (gen is ObjectGen) { diff --git a/generator/gtkapi.xml b/generator/gtkapi.xml new file mode 100644 index 000000000..ab0c1bdc0 --- /dev/null +++ b/generator/gtkapi.xml @@ -0,0 +1,2 @@ + + diff --git a/parser/gapi2xml.pl b/parser/gapi2xml.pl index e6bac372c..edcd3a64e 100755 --- a/parser/gapi2xml.pl +++ b/parser/gapi2xml.pl @@ -496,7 +496,10 @@ sub addSignalElem $sig_elem = $doc->createElement('signal'); $node->appendChild($sig_elem); - $sig_elem->setAttribute('name', $1) if ($spec =~ /\(\"(\w+)\"/); + if ($spec =~ /\(\"([\w\-]+)\"/) { + $sig_elem->setAttribute('name', StudlyCaps($1)); + $sig_elem->setAttribute('cname', $1); + } $sig_elem->setAttribute('when', $1) if ($spec =~ /_RUN_(\w+)/); my $method = ""; @@ -523,7 +526,7 @@ sub addSignalElem return; } - if ($class =~ /;\s*(\S+\s*\**)\s*\(\*\s*$method\)\s*\((.*)\);/) { + if ($class =~ /;\s*(\S+\s*\**)\s*\(\*\s*$method\)\s*\((.*?)\);/) { $ret = $1; $parms = $2; addReturnElem($sig_elem, $ret); if ($parms && ($parms ne "void")) { diff --git a/sample/HelloWorld.cs b/sample/HelloWorld.cs index a855fb511..229479a63 100755 --- a/sample/HelloWorld.cs +++ b/sample/HelloWorld.cs @@ -21,8 +21,8 @@ namespace GtkSamples { Gtk.Window win = new Gtk.Window (Gtk.WindowType.Toplevel); Console.WriteLine("Setting Title"); win.Title = "Gtk# Hello World"; - // win.Deleted += new EventHandler (Window_Delete); - win.Show (); + win.DeleteEvent += new EventHandler (Window_Delete); + win.ShowAll (); Console.WriteLine("Entering event loop"); Application.Run (); return 0;