[Gtk-sharp-list] "format-value" signal in Gtk.Scale

Gonzalo Paniagua Javier gonzalo@ximian.com
11 Mar 2003 19:08:16 +0100


El mar, 11 de 03 de 2003 a las 18:05, Miguel de Icaza escribió:
> > Well, if anyone can convince me with documentation that non-void
> > delegates as events are being used safely and effectively elsewhere in
> > .net, I'd consider changing this.  I think the current method will be
> > least confusing to people familiar with .net paradigms, and I'm also not
> > convinced that using non-void delegates for events is correct.
> 
> The construct is allowed in .NET, it does have the same semantics than
> the current RetVal approach in the presence of multiple signals.
> 
> Another thing to keep in mind is that in Glib there is a notion of
> "stopping" an emission, to address issues like this.  Mathieu's Lacage
> document on GLib object and signals is interesting:
> 
> 	http://www.gnome.org/~mathieu/gobject/main.html

> 
> Gtk has a few ways of dealing with multiple-return values:
> 
> 	* Accumulators
> 
> 	* If no accumulators are present, the result is the result of
> 	  the last signal invoked.
> 
> I am not sure if we could even think about doing something like this
> with the delegate/event infrastructure in .NET.  We can *stop* an
> emision from GLib/Gtk, but we could not stop the signal from being
> propagated to other delegates on the MulticastDelegate event chain.

If we add a StopEmitting boolean property to SignalArgs and we invoke
the delegates like:
	....
	object[] argv = new object[2];
	argv[0] = inst._obj;
	argv[1] = args;

	foreach (XXXSignal signal in inst._obj.GetInvocationList ()) {
		signal.DynamicInvoke (argv);
		if (args.StopEmission)
			break;
	}

we can stop calling other delegates if one of them requests it.

We can also add an Accumulator property and deal with it after each
invocation in presence of a GSignalAccumulator.

I also prefer the .NET way of doing this. For example, implementing
automatic event wire up in System.Web is much easier as I don't have to
check each of the (many) possible event signatures: all the event
handlers have the same signature.

-Gonzalo / just my 2c