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.Generic;
20 using System.Runtime.InteropServices;
25 /// The EcoreEventType is a type of EcoreEvent.
26 /// It includes some predefined instance.
28 /// <since_tizen> preview </since_tizen>
29 public class EcoreEventType
32 /// Key down Ecore event type.
34 /// <since_tizen> preview </since_tizen>
35 public static readonly EcoreEventType KeyDown = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_KEY_DOWN");
37 /// Key Up Ecore event type.
39 /// <since_tizen> preview </since_tizen>
40 public static readonly EcoreEventType KeyUp = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_KEY_UP");
42 /// Mouse Button Down Ecore event type.
44 /// <since_tizen> preview </since_tizen>
45 public static readonly EcoreEventType MouseButtonDown = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_BUTTON_DOWN");
47 /// Mouse Button Up Ecore event type.
49 /// <since_tizen> preview </since_tizen>
50 public static readonly EcoreEventType MouseButtonUp = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_BUTTON_UP");
52 /// Mouse Button Cancel Ecore event type.
54 /// <since_tizen> preview </since_tizen>
55 public static readonly EcoreEventType MouseButtonCancel = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_BUTTON_CANCEL");
57 /// Mouse Move Ecore event type.
59 /// <since_tizen> preview </since_tizen>
60 public static readonly EcoreEventType MouseMove = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_MOVE");
62 /// Mouse Wheel Ecore event type.
64 /// <since_tizen> preview </since_tizen>
65 public static readonly EcoreEventType MouseWheel = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_WHEEL");
67 /// Mouse In Ecore event type.
69 /// <since_tizen> preview </since_tizen>
70 public static readonly EcoreEventType MouseIn = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_IN");
72 /// Mouse Out Ecore event type.
74 /// <since_tizen> preview </since_tizen>
75 public static readonly EcoreEventType MouseOut = new EcoreEventType(Interop.Libraries.EcoreInput, "ECORE_EVENT_MOUSE_OUT");
79 private int _typeValue;
81 private EcoreEventType(string lib, string name)
89 /// Gets the value associated with the specified type.
91 /// <returns>The value of type.</returns>
92 /// <since_tizen> preview </since_tizen>
97 IntPtr hDll = Interop.Libdl.LoadLibrary(_lib);
98 if (hDll != IntPtr.Zero)
100 IntPtr pValue = Interop.Libdl.GetProcAddress(hDll, _name);
101 if (pValue != IntPtr.Zero)
103 _typeValue = Marshal.ReadInt32(pValue);
105 Interop.Libdl.FreeLibrary(hDll);
113 /// The EcoreEvent is a class to help create events that are being notified of events.
115 /// <typeparam name="TEventArgs">Kinds of EventArgs.</typeparam>
116 /// <since_tizen> preview </since_tizen>
117 public class EcoreEvent<TEventArgs> : IDisposable where TEventArgs : EventArgs
120 /// EventInfoParser delegate of the EcoreEvent class.
122 /// <param name="data">IntPtr</param>
123 /// <param name="type">EcoreEventType</param>
124 /// <param name="info">IntPtr</param>
125 /// <returns></returns>
126 /// <since_tizen> preview </since_tizen>
127 public delegate TEventArgs EventInfoParser(IntPtr data, EcoreEventType type, IntPtr info);
129 private bool _disposed = false;
130 private EcoreEventType _eventType;
131 private readonly EventInfoParser _parser;
132 private readonly List<NativeCallback> _nativeCallbacks = new List<NativeCallback>();
135 /// Creates and initializes a new instance of the EcoreEvent class.
137 /// <param name="type">EcoreEventType</param>
138 /// <since_tizen> preview </since_tizen>
139 public EcoreEvent(EcoreEventType type) : this(type, null)
144 /// Creates and initializes a new instance of the EcoreEvent class.
146 /// <param name="type">EcoreEventType</param>
147 /// <param name="parser">EventInfoParser</param>
148 /// <since_tizen> preview </since_tizen>
149 public EcoreEvent(EcoreEventType type, EventInfoParser parser)
156 /// Destructor for the EcoreEvent class.
163 private struct NativeCallback
165 public Interop.Ecore.EcoreEventCallback callback;
166 public IntPtr nativeHandler;
167 public EventHandler<TEventArgs> eventHandler;
171 /// On Event Handler of the EcoreEvent.
173 /// <since_tizen> preview </since_tizen>
174 public event EventHandler<TEventArgs> On
178 EventHandler<TEventArgs> handler = value;
179 var cb = new Interop.Ecore.EcoreEventCallback((data, type, info) =>
181 TEventArgs ea = _parser == null ? (TEventArgs)EventArgs.Empty : _parser(data, _eventType, info);
185 IntPtr hNative = Interop.Ecore.ecore_event_handler_add(_eventType.GetValue(), cb, IntPtr.Zero);
186 _nativeCallbacks.Add(new NativeCallback { callback = cb, eventHandler = handler, nativeHandler = hNative });
190 EventHandler<TEventArgs> handler = value;
191 var callbacks = _nativeCallbacks.Where(cb => cb.eventHandler == handler);
192 foreach (var cb in callbacks)
194 Interop.Ecore.ecore_event_handler_del(cb.nativeHandler);
200 /// Releases all the resources currently used by this instance.
202 /// <param name="disposing">
203 /// true if the managed resources should be disposed,
206 /// <since_tizen> preview </since_tizen>
207 protected virtual void Dispose(bool disposing)
213 // Place holder to dispose managed state (managed objects).
215 foreach (var cb in _nativeCallbacks)
217 Interop.Ecore.ecore_event_handler_del(cb.nativeHandler);
219 _nativeCallbacks.Clear();
225 /// Destroys the current object.
227 /// <since_tizen> preview </since_tizen>
228 public void Dispose()
231 GC.SuppressFinalize(this);
236 /// The event class for EcoreEvent.
238 /// <since_tizen> preview </since_tizen>
239 public class EcoreEvent : EcoreEvent<EventArgs>
242 /// Creates and initializes a new instance of the EcoreEvent class.
244 /// <param name="type">EcoreEventType</param>
245 /// <since_tizen> preview </since_tizen>
246 public EcoreEvent(EcoreEventType type) : base(type)