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);
}
}
/// <summary>Method to raise event ModelChangedEvent.
/// <para>Since EFL 1.23.</para>
/// </summary>
/// <param name="e">Event to raise.</param>
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.