2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.Collections.Concurrent;
23 /// EcoreMainloop is a helper class, which provides the functions relative to Ecore's main loop.
25 /// <since_tizen> preview </since_tizen>
26 [Obsolete("This has been deprecated in API12")]
27 public static class EcoreMainloop
30 static readonly ConcurrentDictionary<int, Func<bool>> _taskMap = new ConcurrentDictionary<int, Func<bool>>();
31 static readonly Object _taskLock = new Object();
32 static int _newTaskId = 0;
34 static Interop.Ecore.EcoreTaskCallback _nativeHandler;
36 static EcoreMainloop()
38 Interop.Ecore.ecore_init();
39 Interop.Ecore.ecore_main_loop_glib_integrate();
40 _nativeHandler = NativeHandler;
44 /// Checks if you are calling this function from the main thread.
46 /// <remarks>True if the calling function is the same thread, false otherwise.</remarks>
47 /// <since_tizen> preview </since_tizen>
48 [Obsolete("This has been deprecated in API12")]
49 public static bool IsMainThread => Interop.Eina.eina_main_loop_is();
52 /// Runs the application main loop.
54 /// <since_tizen> preview </since_tizen>
55 [Obsolete("This has been deprecated in API12")]
56 public static void Begin()
58 Interop.Ecore.ecore_main_loop_begin();
62 /// Quits the main loop, once all the events currently on the queue have been processed.
64 /// <since_tizen> preview </since_tizen>
65 [Obsolete("This has been deprecated in API12")]
66 public static void Quit()
68 Interop.Ecore.ecore_main_loop_quit();
72 /// Adds an idler handler.
74 /// <param name="task">The action to call when idle.</param>
75 /// <since_tizen> preview </since_tizen>
76 [Obsolete("This has been deprecated in API12")]
77 public static void Post(Action task)
79 int id = RegistHandler(() => { task(); return false; });
80 Interop.Ecore.ecore_idler_add(_nativeHandler, (IntPtr)id);
84 /// Calls the callback asynchronously in the main loop.
86 /// <param name="task">The action wanted to be called.</param>
87 /// <since_tizen> preview </since_tizen>
88 [Obsolete("This has been deprecated in API12")]
89 public static void PostAndWakeUp(Action task)
97 int id = RegistHandler(() => { task(); return false; });
98 Interop.Ecore.ecore_main_loop_thread_safe_call_async(_nativeHandler, (IntPtr)id);
103 /// Calls the callback synchronously in the main loop.
105 /// <param name="task">The action wanted to be called.</param>
106 /// <since_tizen> preview </since_tizen>
107 [Obsolete("This has been deprecated in API12")]
108 public static void Send(Action task)
110 int id = RegistHandler(() => { task(); return false; });
111 Interop.Ecore.ecore_main_loop_thread_safe_call_sync(_nativeHandler, (IntPtr)id);
115 /// Creates a timer to call the given function in the given period of time.
117 /// <param name="interval">The interval in seconds.</param>
118 /// <param name="handler">The given function.</param>
119 /// <returns>A timer object handler on success, or null on failure.</returns>
120 /// <since_tizen> preview </since_tizen>
121 [Obsolete("This has been deprecated in API12")]
122 public static IntPtr AddTimer(double interval, Func<bool> handler)
124 int id = RegistHandler(handler);
125 return Interop.Ecore.ecore_timer_add(interval, _nativeHandler, (IntPtr)id);
129 /// Removes the specified timer from the timer list.
131 /// <param name="id">The specified timer handler</param>
132 /// <since_tizen> preview </since_tizen>
133 [Obsolete("This has been deprecated in API12")]
134 public static void RemoveTimer(IntPtr id)
136 int taskId = (int)Interop.Ecore.ecore_timer_del(id);
138 _taskMap.TryRemove(taskId, out unused);
141 static int RegistHandler(Func<bool> task)
146 taskId = _newTaskId++;
148 _taskMap[taskId] = task;
152 static bool NativeHandler(IntPtr user_data)
154 int task_id = (int)user_data;
155 Func<bool> userAction = null;
156 if (_taskMap.TryGetValue(task_id, out userAction))
160 if (userAction != null)
162 result = userAction();
167 _taskMap.TryRemove(task_id, out userAction);