/* * Copyright 2019 by its authors. See AUTHORS. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma warning disable 1591 using System; using System.Runtime.InteropServices; using System.Collections.Generic; ///Eo class description, passed to efl_class_new. [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct ClassDescription { ///Current Eo version. public uint version; ///Name of the class. [MarshalAs(UnmanagedType.LPStr)] public String name; ///Class type. public int class_type; ///Size of data (private + protected + public) per instance. public UIntPtr data_size; ///Initializer for the class. public IntPtr class_initializer; ///Constructor of the class. public IntPtr class_constructor; ///Destructor of the class. public IntPtr class_destructor; } ///Description of an Eo API operation. [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct EflOpDescription { ///The EAPI function offering this op. (String with the name of the function on Windows) public IntPtr api_func; ///The static function to be called for this op public IntPtr func; } ///List of operations on a given Object. [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public struct EflObjectOps { ///The op descriptions array of size count. public IntPtr descs; ///Number of op descriptions. public UIntPtr count; }; namespace Efl { ///This struct holds the description of a specific event (Since EFL 1.22). [StructLayout(LayoutKind.Sequential)] public struct EventDescription { ///Name of the event. public IntPtr Name; ///true if the event cannot be frozen. [MarshalAs(UnmanagedType.U1)] public bool Unfreezable; ///Internal use: true if this is a legacy event. [MarshalAs(UnmanagedType.U1)] public bool Legacy_is; ///true if when the even is triggered again from a callback it ///will start from where it was. [MarshalAs(UnmanagedType.U1)] public bool Restart; private static Dictionary descriptions = new Dictionary(); ///Constructor for EventDescription ///The name of the module containing the event. ///The name of the event. public EventDescription(string moduleName, string name) { this.Name = GetNative(moduleName, name); this.Unfreezable = false; this.Legacy_is = false; this.Restart = false; } ///Get the native structure. ///The name of the module containing the event. ///The name of the event. ///Pointer to the native structure. public static IntPtr GetNative(string moduleName, string name) { if (!descriptions.ContainsKey(name)) { IntPtr data = Efl.Eo.FunctionInterop.LoadFunctionPointer(moduleName, name); if (data == IntPtr.Zero) { string error = Eina.StringConversion.NativeUtf8ToManagedString(Efl.Eo.Globals.dlerror()); throw new Exception(error); } descriptions.Add(name, data); } return descriptions[name]; } }; /// /// A parameter passed in event callbacks holding extra event parameters. /// This is the full event information passed to callbacks in C. /// (Since EFL 1.22) /// [StructLayout(LayoutKind.Sequential)] [Efl.Eo.BindingEntity] public struct Event { /// The object the callback was called on. /// (Since EFL 1.22) public Efl.Object Object; /// The event description. /// (Since EFL 1.22) public Efl.EventDescription Desc; /// Extra event information passed by the event caller. /// Must be cast to the event type declared in the EO file. Keep in mind that: /// 1) Objects are passed as a normal Eo*. Event subscribers can call functions on these objects. /// 2) Structs, built-in types and containers are passed as const pointers, with one level of indirection. /// (Since EFL 1.22) public System.IntPtr Info; /// Constructor for Event. public Event( Efl.Object obj = default(Efl.Object), Efl.EventDescription desc = default(Efl.EventDescription), System.IntPtr info = default(System.IntPtr)) { this.Object = obj; this.Desc = desc; this.Info = info; } /// Implicit conversion to the managed representation from a native pointer. /// Native pointer to be converted. public static implicit operator Event(IntPtr ptr) { var tmp = (Event.NativeStruct) Marshal.PtrToStructure(ptr, typeof(Event.NativeStruct)); return tmp; } /// Internal wrapper for struct Event. [StructLayout(LayoutKind.Sequential)] public struct NativeStruct { /// Internal wrapper for field Object public System.IntPtr Object; /// Internal wrapper for field Desc public System.IntPtr Desc; /// Internal wrapper for field Info public System.IntPtr Info; /// Implicit conversion to the internal/marshalling representation. /// Managed struct to be converted. /// Native representation of the managed struct. public static implicit operator Event.NativeStruct(Event externalStruct) { var internalStruct = new Event.NativeStruct(); internalStruct.Object = externalStruct.Object?.NativeHandle ?? System.IntPtr.Zero; internalStruct.Desc = Eina.PrimitiveConversion.ManagedToPointerAlloc(externalStruct.Desc); internalStruct.Info = externalStruct.Info; return internalStruct; } /// Implicit conversion to the managed representation. /// Native struct to be converted. /// Managed representation of the native struct. public static implicit operator Event(Event.NativeStruct internalStruct) { var externalStruct = new Event(); externalStruct.Object = (Efl.Object) Efl.Eo.Globals.CreateWrapperFor(internalStruct.Object); externalStruct.Desc = Eina.PrimitiveConversion.PointerToManaged(internalStruct.Desc); externalStruct.Info = internalStruct.Info; return externalStruct; } } } public delegate void EventCb(System.IntPtr data, ref Event.NativeStruct evt); public delegate void FreeWrapperSupervisorCb(System.IntPtr obj); [StructLayout(LayoutKind.Sequential)] public struct TextCursorCursor { IntPtr obj; UIntPtr pos; // UIntPtr to automatically change size_t between 32/64 IntPtr node; [MarshalAsAttribute(UnmanagedType.U1)]bool changed; } [StructLayout(LayoutKind.Sequential)] public struct TextAnnotateAnnotation { IntPtr list; IntPtr obj; IntPtr start_node; IntPtr end_node; [MarshalAsAttribute(UnmanagedType.U1)]bool is_item; } namespace Access { public struct ActionData { public IntPtr name; public IntPtr action; public IntPtr param; public IntPtr func; } } // namespace Access } // namespace Efl // Global delegates public delegate void EinaFreeCb(IntPtr data); public delegate void EvasSmartCb(IntPtr data, IntPtr obj, IntPtr event_info);