[Gtk-sharp-list] Returning Gdk.Events

Jonathan Pryor jonpryor@vt.edu
11 Mar 2003 06:38:51 -0500


Not sure if it's applicable here, but last year I had a similar problem
where I needed to keep a C# class tree and a C++ class tree "in sync" so
that the usage would be consistent between both languages.

What I settled on doing was using a table (Hashtable, IIRC) mapping of
strings to strings.  The input strings was the result of C++'s
typeid(ClassName).name() function call, while the mapped-to strings were
the corresponding C# class name.

This would allow me to check the dynamic type of the C++ object and
construct a "closest-matching" C# class instance, returning that to the
caller.

Advantages: C# dynamic type is "correct", allowing for use of casting,
the "is" operator, sane ToString() output, etc.

Disadvantages: requires building table, which adds to program
initialization overhead.  Also requires being able to get a
string/textual description of the "native" class.  C++ allows this, but
I'm not that familiar with GObject, so this may be possible.  It looks
like g_type_name() would fit the bill, however.

Also, the simplest "closest match" ignores inheritance.  If there is no
explicit mapping, then Gdk.Event is the default wrapper.

This would allow a pseudo-implementation of:

	public class Application {
		static IDictionary mapping;
		static Application () {
			mapping = new Hashtable ();
			mapping["KnownGtkEventType"] = 
				"Corresponding Gtk# Type Name";
			// ...
		}

		public static Gdk.Event CurrrentEvent {
			IntPtr handle = gtk_get_current_event ();
			string gtk_name = g_type_name (handle);
			string cs_name = mapping[gtk_name];
			Gdk.Event ev = null;
			if (cs_name != null)
				ev = Activator.CreateInstance (cs_name, 
					new object[]{handle});
			else
				// no "closest match"
				ev = new Gdk.Event (handle);
			return ev;
		}
	}

I prefer this approach over Mike Kestner's approach, merely because the
dynamic types are kept in sync.  Though the table construction/lookup
overhead may be undesirable, so this might not be the best alternative.

 - Jon

On Mon, 2003-03-10 at 21:17, Miguel de Icaza wrote:
> Hello!
> 
>      I have the following function:
> 
> 	GdkEvent *gtk_get_current_event ()
> 
>      The problem is that the Event can be one of many of the various
> events, how can I construct the right event depending on the type field
> of the event?
> 
> Miguel
> _______________________________________________
> Gtk-sharp-list maillist  -  Gtk-sharp-list@lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/gtk-sharp-list