Hi,

While I was working on creating a custom cell renderer for a project of
mine, I found that once I tried to override the Render method, and
simply call the base one, the program would crash with an error in the
native code.

The attached patch makes custom CellRenderer behave, although it might
be a bit hackish: the other functions that use "ref Gtk.Rectangle" for
the native call also have it in the managed interface, but since I
didn't want to change the interface (which I'm pretty sure would be a
bad thing™) I kept the ref only in the subsequent call. It *should* be
fine since the rectangles shouldn't be modified as far as I can see.

I'm also attaching a simple testcase, if you're interested in seeing
what the problem is.

I also have another problem here: how do I make sure the Windows gtk#
also have this applied? Should I rebuild it myself, or using the .dll
file built on (Gentoo) Linux with that patch should be enough?

Thanks,

-- 
Diego Elio Pettenò — “Flameeyes”
http://blog.flameeyes.eu/

If you found a .asc file in this mail and know not what it is,
it's a GnuPG digital signature: http://www.gnupg.org/

Index: gtk-sharp-2.12.9/gtk/CellRenderer.custom
===================================================================
--- gtk-sharp-2.12.9.orig/gtk/CellRenderer.custom
+++ gtk-sharp-2.12.9/gtk/CellRenderer.custom
@@ -80,7 +80,7 @@
 		}
 
 		[DllImport("gtksharpglue-2")]
-		static extern void gtksharp_cellrenderer_base_render (IntPtr handle, IntPtr window, IntPtr widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags);
+		static extern void gtksharp_cellrenderer_base_render (IntPtr handle, IntPtr window, IntPtr widget, ref Gdk.Rectangle background_area, ref Gdk.Rectangle cell_area, ref Gdk.Rectangle expose_area, Gtk.CellRendererState flags);
 
 		[DllImport("gtksharpglue-2")]
 		static extern void gtksharp_cellrenderer_override_render (IntPtr gtype, RenderDelegate cb);
@@ -112,15 +112,15 @@
 		[GLib.DefaultSignalHandler (Type=typeof(Gtk.CellRenderer), ConnectionMethod="OverrideRender")]
 		protected virtual void Render (Gdk.Drawable window, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags)
 		{
-			gtksharp_cellrenderer_base_render (Handle, window.Handle, widget.Handle, background_area, cell_area, expose_area, flags);
+			gtksharp_cellrenderer_base_render (Handle, window.Handle, widget.Handle, ref background_area, ref cell_area, ref expose_area, flags);
 		}
 
 		[DllImport("gtksharpglue-2")]
-		static extern void gtksharp_cellrenderer_invoke_render (IntPtr gtype, IntPtr handle, IntPtr window, IntPtr widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags);
+		static extern void gtksharp_cellrenderer_invoke_render (IntPtr gtype, IntPtr handle, IntPtr window, IntPtr widget, ref Gdk.Rectangle background_area, ref Gdk.Rectangle cell_area, ref Gdk.Rectangle expose_area, Gtk.CellRendererState flags);
 
 		internal static void InternalRender (GLib.GType gtype, Gtk.CellRenderer cell, Gdk.Drawable window, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags)
 		{
-			gtksharp_cellrenderer_invoke_render (gtype.Val, cell.Handle, window.Handle, widget.Handle, background_area, cell_area, expose_area, flags);
+			gtksharp_cellrenderer_invoke_render (gtype.Val, cell.Handle, window.Handle, widget.Handle, ref background_area, ref cell_area, ref expose_area, flags);
 		}
 
 		[DllImport("gtksharpglue-2")]
using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{
	public class CellRendererString : CellRendererText
	{
		[GLib.Property("object")]
		public object Object
		{ get; set; }

		public override void GetSize (Gtk.Widget widget, ref Gdk.Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height)
		{
			Text = Object.ToString();
			base.GetSize (widget, ref cell_area, out x_offset, out y_offset, out width, out height);
		}

		protected override void Render (Gdk.Drawable window, Gtk.Widget widget, Gdk.Rectangle background_area, Gdk.Rectangle cell_area, Gdk.Rectangle expose_area, Gtk.CellRendererState flags)
		{
			Text = Object.ToString();
			base.Render (window, widget, background_area, cell_area, expose_area, flags);
		}
	}
	
	public MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();

		ListStore ls = new ListStore(typeof(object));

		treeview1.Model = ls;

		treeview1.AppendColumn("Test", new CellRendererString(), "object", 0);

		ls.AppendValues(DateTime.Now);
		ls.AppendValues(System.Guid.NewGuid());
	}
	
	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}
}
_______________________________________________
Gtk-sharp-list maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/gtk-sharp-list

Reply via email to