As stated in T7744, currently there's no way to register events when
inheriting Eo interfaces for C# programmers since the registration methods are
not visible for them (as these methods are internal and used internally with
Eolian generators).
This patch solves that by generating default event implementations in Eo
interfaces. Since interface default method implementation is a C# 8.0
feature, it is not available for Mono (because of MCS compiler).
Example
- The following .eo:
struct Efl.Model_Changed_Event { ... <fields> } interface Efl.Ui.View { ... <things not related to this patch> events { model,changed: Efl.Model_Changed_Event; [[Event dispatched when a new model is set.]] } }
- Will generate the following .cs (considering unrelated removed noises):
... <annotations> public interface IView : Efl.Eo.IWrapper, IDisposable { #if __MonoCS /// ... <docs> public event EventHandler<Efl.Ui.ViewModelChangedEventArgs> ModelChangedEvent; #else /// ... <docs> public event EventHandler<Efl.Ui.ViewModelChangedEventArgs> ModelChangedEvent { add { Efl.EventCb callerCb = ((Efl.Eo.EoWrapper)this).GetInternalEventCallback(value, info => new Efl.Ui.ViewModelChangedEventArgs{ Arg = info }); string key = "_EFL_UI_VIEW_EVENT_MODEL_CHANGED"; ((Efl.Eo.EoWrapper)this).AddNativeEventHandler("efl", key, callerCb, value); } remove { string key = "_EFL_UI_VIEW_EVENT_MODEL_CHANGED"; ((Efl.Eo.EoWrapper)this).RemoveNativeEventHandler("efl", key, value); } } /// ... <docs> protected virtual void OnModelChangedEvent(Efl.Ui.ViewModelChangedEventArgs e) { Contract.Requires(e != null, nameof(e)); IntPtr info = Marshal.AllocHGlobal(Marshal.SizeOf(e.Arg)); ((Efl.Eo.EoWrapper)this).CallNativeEventCallback("efl", "_EFL_UI_VIEW_EVENT_MODEL_CHANGED", info, (p) => Marshal.FreeHGlobal(p)); } #endif ... <everything else from the interface> }
Resolves T7744.