internal sealed class ProcessorController : Disposable
{
private static ProcessorController instance = null;
+ private bool initialied = false;
private ProcessorController() : this(Interop.ProcessorController.New(), true)
{
internal ProcessorController(global::System.IntPtr cPtr, bool cMemoryOwn) : base(cPtr, cMemoryOwn)
{
- processorCallback = new ProcessorEventHandler(Process);
- processorPostCallback = new ProcessorEventHandler(PostProcess);
- Interop.ProcessorController.SetCallback(SwigCPtr, processorCallback);
- Interop.ProcessorController.SetPostCallback(SwigCPtr, processorPostCallback);
}
- [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
internal delegate void ProcessorEventHandler();
private ProcessorEventHandler processorCallback = null;
- private ProcessorEventHandler processorPostCallback = null;
- public event EventHandler ProcessorOnceEvent;
+ private uint onceEventIndex;
+ // Double buffered once event processing
+ private EventHandler[] internalProcessorOnceEvent;
+
+ public event EventHandler ProcessorOnceEvent
+ {
+ add
+ {
+ internalProcessorOnceEvent[onceEventIndex] += value;
+ }
+ remove
+ {
+ internalProcessorOnceEvent[onceEventIndex] -= value;
+ }
+ }
public event EventHandler ProcessorEvent;
public event EventHandler LayoutProcessorEvent;
+ public bool Initialized => initialied;
+
public static ProcessorController Instance
{
get
}
}
+ public void Initialize()
+ {
+ if (initialied == false)
+ {
+ initialied = true;
+
+ Interop.ProcessorController.Initialize(SwigCPtr);
+
+ onceEventIndex = 0u;
+ internalProcessorOnceEvent = new EventHandler[2];
+ internalProcessorOnceEvent[0] = null;
+ internalProcessorOnceEvent[1] = null;
+
+ processorCallback = new ProcessorEventHandler(Process);
+ Interop.ProcessorController.SetCallback(SwigCPtr, processorCallback);
+ NDalicPINVOKE.ThrowExceptionIfExists();
+ }
+ }
+
public void Process()
{
- ProcessorOnceEvent?.Invoke(this, null);
- ProcessorOnceEvent = null;
+ // Let us add once event into 1 index during 0 event invoke
+ onceEventIndex = 1;
+ internalProcessorOnceEvent[0]?.Invoke(this, null);
+ internalProcessorOnceEvent[0] = null;
+
ProcessorEvent?.Invoke(this, null);
LayoutProcessorEvent?.Invoke(this, null);
- }
- public void PostProcess()
- {
- ProcessorOnceEvent?.Invoke(this, null);
- ProcessorOnceEvent = null;
+ // Let us add once event into 0 index during 1 event invoke
+ // Note : To avoid ImageView's properties mismatched problem,
+ // We need to invoke events now which attached during internalProcessorOnceEvent[0] and LayoutProcessor.
+ onceEventIndex = 0;
+ internalProcessorOnceEvent[1]?.Invoke(this, null);
+ internalProcessorOnceEvent[1] = null;
}
/// <summary>
protected override void Dispose(DisposeTypes type)
{
Interop.ProcessorController.RemoveCallback(SwigCPtr, processorCallback);
- Interop.ProcessorController.RemovePostCallback(SwigCPtr, processorPostCallback);
- ProcessorOnceEvent = null;
+ internalProcessorOnceEvent[0] = null;
+ internalProcessorOnceEvent[1] = null;
ProcessorEvent = null;
LayoutProcessorEvent = null;
GC.SuppressFinalize(this);
public void Awake()
{
Interop.ProcessorController.Awake(SwigCPtr);
+ NDalicPINVOKE.ThrowExceptionIfExists();
}
} // class ProcessorController
} // namespace Tizen.NUI