using System; using System.Collections.Generic; namespace ElmSharp { public static class EcoreMainloop { static readonly Dictionary> _taskMap = new Dictionary>(); static readonly Object _taskLock = new Object(); static int _newTaskId = 0; static Interop.Ecore.EcoreTaskCallback _nativeHandler; static EcoreMainloop() { Interop.Ecore.ecore_init(); Interop.Ecore.ecore_main_loop_glib_integrate(); _nativeHandler = NativeHandler; } public static void Begin() { Interop.Ecore.ecore_main_loop_begin(); } public static void Quit() { Interop.Ecore.ecore_main_loop_quit(); } public static void Post(Action task) { int id = RegistHandler(() => { task(); return false; }); Interop.Ecore.ecore_idler_add(_nativeHandler, (IntPtr)id); } public static void PostAndWakeUp(Action task) { int id = RegistHandler(() => { task(); return false; }); Interop.Ecore.ecore_main_loop_thread_safe_call_async(_nativeHandler, (IntPtr)id); } public static void Send(Action task) { int id = RegistHandler(() => { task(); return false; }); Interop.Ecore.ecore_main_loop_thread_safe_call_sync(_nativeHandler, (IntPtr)id); } public static IntPtr AddTimer(double interval, Func handler) { int id = RegistHandler(handler); return Interop.Ecore.ecore_timer_add(interval, _nativeHandler, (IntPtr)id); } public static void RemoveTimer(IntPtr id) { int taskId = (int)Interop.Ecore.ecore_timer_del(id); _taskMap.Remove(taskId); } static int RegistHandler(Func task) { int taskId; lock (_taskLock) { taskId = _newTaskId++; } _taskMap[taskId] = task; return taskId; } static bool NativeHandler(IntPtr user_data) { int task_id = (int)user_data; Func userAction = null; _taskMap.TryGetValue(task_id, out userAction); if (userAction != null) { _taskMap.Remove(task_id); return userAction(); } return false; } } }