2003-12-30 Mike Kestner <mkestner@ximian.com>

* glib/Object.cs (ConnectDefaultHandlers): reflection code to
	hook up overridden default signal handlers.
	* glue/type.c  (gtksharp_override_virtual_method): peek the gtype
	and ref the class if it isn't created yet.
	* sample/Subclass.cs : update to override Button.OnClicked.

svn path=/trunk/gtk-sharp/; revision=21559
This commit is contained in:
Mike Kestner 2003-12-30 22:09:42 +00:00
parent 9f3cd6ae80
commit 6e3879ca4b
4 changed files with 47 additions and 21 deletions

View File

@ -1,3 +1,11 @@
2003-12-30 Mike Kestner <mkestner@ximian.com>
* glib/Object.cs (ConnectDefaultHandlers): reflection code to
hook up overridden default signal handlers.
* glue/type.c (gtksharp_override_virtual_method): peek the gtype
and ref the class if it isn't created yet.
* sample/Subclass.cs : update to override Button.OnClicked.
2003-12-26 Mike Kestner <mkestner@ximian.com> 2003-12-26 Mike Kestner <mkestner@ximian.com>
* glue/selectiondata.c : new glue to make SelectionData opaque * glue/selectiondata.c : new glue to make SelectionData opaque

View File

@ -141,6 +141,28 @@ namespace GLib {
return GetObject (o, false); return GetObject (o, false);
} }
private static void ConnectDefaultHandlers (GType gtype, System.Type t)
{
foreach (MethodInfo minfo in t.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)) {
MethodInfo baseinfo = minfo.GetBaseDefinition ();
if (baseinfo == minfo)
continue;
foreach (object attr in baseinfo.GetCustomAttributes (true)) {
if (attr.ToString () != "GLib.DefaultSignalHandlerAttribute")
continue;
DefaultSignalHandlerAttribute sigattr = attr as DefaultSignalHandlerAttribute;
MethodInfo connector = sigattr.Type.GetMethod (sigattr.ConnectionMethod, BindingFlags.Static | BindingFlags.NonPublic);
object[] parms = new object [1];
parms [0] = gtype;
connector.Invoke (null, parms);
break;
}
}
}
[DllImport("gtksharpglue")] [DllImport("gtksharpglue")]
static extern IntPtr gtksharp_register_type (string name, IntPtr parent_type); static extern IntPtr gtksharp_register_type (string name, IntPtr parent_type);
@ -165,7 +187,9 @@ namespace GLib {
GType parent_gtype = (GType) pi.GetValue (null, null); GType parent_gtype = (GType) pi.GetValue (null, null);
string name = t.Namespace.Replace(".", "_") + t.Name; string name = t.Namespace.Replace(".", "_") + t.Name;
GtkSharp.ObjectManager.RegisterType (name, t.Namespace + t.Name, t.Assembly.GetName().Name); GtkSharp.ObjectManager.RegisterType (name, t.Namespace + t.Name, t.Assembly.GetName().Name);
return new GLib.GType (gtksharp_register_type (name, parent_gtype.Val)); GType gtype = new GType (gtksharp_register_type (name, parent_gtype.Val));
ConnectDefaultHandlers (gtype, t);
return gtype;
} }
/// <summary> /// <summary>

View File

@ -71,6 +71,8 @@ gtksharp_register_type (gchar *name, GType parent)
void void
gtksharp_override_virtual_method (GType g_type, const gchar *name, GCallback callback) gtksharp_override_virtual_method (GType g_type, const gchar *name, GCallback callback)
{ {
if (g_type_class_peek (g_type) == NULL)
g_type_class_ref (g_type);
guint id = g_signal_lookup (name, g_type); guint id = g_signal_lookup (name, g_type);
GClosure *closure = g_cclosure_new (callback, NULL, NULL); GClosure *closure = g_cclosure_new (callback, NULL, NULL);
g_signal_override_class_closure (id, g_type, closure); g_signal_override_class_closure (id, g_type, closure);

View File

@ -1,8 +1,8 @@
// Subclass.cs - Widget subclass Test implementation // Subclass.cs - Widget subclass Test
// //
// Author: Mike Kestner <mkestner@speakeasy.net> // Author: Mike Kestner <mkestner@ximian.com>
// //
// (c) 2001-2002 Mike Kestner // (c) 2001-2003 Mike Kestner, Novell, Inc.
namespace GtkSamples { namespace GtkSamples {
@ -17,35 +17,22 @@ namespace GtkSamples {
{ {
Application.Init (); Application.Init ();
Window win = new Window ("Button Tester"); Window win = new Window ("Button Tester");
win.DefaultSize = new Size (200, 150);
win.DeleteEvent += new DeleteEventHandler (Window_Delete);
Button btn = new MyButton (); Button btn = new MyButton ();
btn.Label = "I'm a subclassed button";
btn.Clicked += new EventHandler (btn_click);
win.Add (btn); win.Add (btn);
win.ShowAll (); win.ShowAll ();
Application.Run (); Application.Run ();
return 0; return 0;
} }
static void btn_click (object obj, EventArgs args)
{
Console.WriteLine ("Button Clicked");
}
static void Window_Delete (object obj, DeleteEventArgs args)
{
Application.Quit ();
args.RetVal = true;
}
} }
public class MyButton : Gtk.Button { public class MyButton : Gtk.Button {
static GLib.GType gtype = GLib.GType.Invalid; static GLib.GType gtype = GLib.GType.Invalid;
public MyButton () : base (GType) {} public MyButton () : base (GType)
{
Label = "I'm a subclassed button";
}
public static new GLib.GType GType { public static new GLib.GType GType {
get { get {
@ -54,5 +41,10 @@ namespace GtkSamples {
return gtype; return gtype;
} }
} }
protected override void OnClicked ()
{
Console.WriteLine ("Button::Clicked default handler fired.");
}
} }
} }