1 #pragma warning disable CS1591
3 using System.Runtime.InteropServices;
4 using System.Collections.Generic;
6 using System.ComponentModel;
7 namespace Efl { namespace Access {
8 /// <summary>Elementary accessible window interface</summary>
10 public interface IWindow :
11 Efl.Eo.IWrapper, IDisposable
13 /// <summary>Called when new window has been created.</summary>
14 event EventHandler WindowCreatedEvt;
15 /// <summary>Called when window has been destroyed.</summary>
16 event EventHandler WindowDestroyedEvt;
17 /// <summary>Called when window has been activated. (focused)</summary>
18 event EventHandler WindowActivatedEvt;
19 /// <summary>Called when window has been deactivated (unfocused).</summary>
20 event EventHandler WindowDeactivatedEvt;
21 /// <summary>Called when window has been maximized</summary>
22 event EventHandler WindowMaximizedEvt;
23 /// <summary>Called when window has been minimized</summary>
24 event EventHandler WindowMinimizedEvt;
25 /// <summary>Called when window has been restored</summary>
26 event EventHandler WindowRestoredEvt;
28 /// <summary>Elementary accessible window interface</summary>
29 sealed public class IWindowConcrete :
34 ///<summary>Pointer to the native class description.</summary>
35 public System.IntPtr NativeClass {
37 if (((object)this).GetType() == typeof (IWindowConcrete))
38 return Efl.Access.IWindowNativeInherit.GetEflClassStatic();
40 return Efl.Eo.ClassRegister.klassFromType[((object)this).GetType()];
43 private EventHandlerList eventHandlers = new EventHandlerList();
44 private System.IntPtr handle;
45 ///<summary>Pointer to the native instance.</summary>
46 public System.IntPtr NativeHandle {
47 get { return handle; }
49 [System.Runtime.InteropServices.DllImport(efl.Libs.Elementary)] internal static extern System.IntPtr
50 efl_access_window_interface_get();
51 ///<summary>Internal usage: Constructs an instance from a native pointer. This is used when interacting with C code and should not be used directly.</summary>
52 private IWindowConcrete(System.IntPtr raw)
55 RegisterEventProxies();
57 ///<summary>Destructor.</summary>
62 ///<summary>Releases the underlying native instance.</summary>
63 void Dispose(bool disposing)
65 if (handle != System.IntPtr.Zero) {
66 Efl.Eo.Globals.efl_unref(handle);
67 handle = System.IntPtr.Zero;
70 ///<summary>Releases the underlying native instance.</summary>
74 GC.SuppressFinalize(this);
76 ///<summary>Verifies if the given object is equal to this one.</summary>
77 public override bool Equals(object obj)
79 var other = obj as Efl.Object;
82 return this.NativeHandle == other.NativeHandle;
84 ///<summary>Gets the hash code for this object based on the native pointer it points to.</summary>
85 public override int GetHashCode()
87 return this.NativeHandle.ToInt32();
89 ///<summary>Turns the native pointer into a string representation.</summary>
90 public override String ToString()
92 return $"{this.GetType().Name}@[{this.NativeHandle.ToInt32():x}]";
94 private readonly object eventLock = new object();
95 private Dictionary<string, int> event_cb_count = new Dictionary<string, int>();
96 ///<summary>Adds a new event handler, registering it to the native event. For internal use only.</summary>
97 ///<param name="lib">The name of the native library definining the event.</param>
98 ///<param name="key">The name of the native event.</param>
99 ///<param name="evt_delegate">The delegate to be called on event raising.</param>
100 ///<returns>True if the delegate was successfully registered.</returns>
101 private bool AddNativeEventHandler(string lib, string key, Efl.EventCb evt_delegate) {
103 if (!event_cb_count.TryGetValue(key, out event_count))
104 event_cb_count[key] = event_count;
105 if (event_count == 0) {
106 IntPtr desc = Efl.EventDescription.GetNative(lib, key);
107 if (desc == IntPtr.Zero) {
108 Eina.Log.Error($"Failed to get native event {key}");
111 bool result = Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evt_delegate, System.IntPtr.Zero);
113 Eina.Log.Error($"Failed to add event proxy for event {key}");
116 Eina.Error.RaiseIfUnhandledException();
118 event_cb_count[key]++;
121 ///<summary>Removes the given event handler for the given event. For internal use only.</summary>
122 ///<param name="key">The name of the native event.</param>
123 ///<param name="evt_delegate">The delegate to be removed.</param>
124 ///<returns>True if the delegate was successfully registered.</returns>
125 private bool RemoveNativeEventHandler(string key, Efl.EventCb evt_delegate) {
127 if (!event_cb_count.TryGetValue(key, out event_count))
128 event_cb_count[key] = event_count;
129 if (event_count == 1) {
130 IntPtr desc = Efl.EventDescription.GetNative(efl.Libs.Elementary, key);
131 if (desc == IntPtr.Zero) {
132 Eina.Log.Error($"Failed to get native event {key}");
135 bool result = Efl.Eo.Globals.efl_event_callback_del(handle, desc, evt_delegate, System.IntPtr.Zero);
137 Eina.Log.Error($"Failed to remove event proxy for event {key}");
140 Eina.Error.RaiseIfUnhandledException();
141 } else if (event_count == 0) {
142 Eina.Log.Error($"Trying to remove proxy for event {key} when there is nothing registered.");
145 event_cb_count[key]--;
148 private static object WindowCreatedEvtKey = new object();
149 /// <summary>Called when new window has been created.</summary>
150 public event EventHandler WindowCreatedEvt
154 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_CREATED";
155 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowCreatedEvt_delegate)) {
156 eventHandlers.AddHandler(WindowCreatedEvtKey , value);
158 Eina.Log.Error($"Error adding proxy for event {key}");
163 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_CREATED";
164 if (RemoveNativeEventHandler(key, this.evt_WindowCreatedEvt_delegate)) {
165 eventHandlers.RemoveHandler(WindowCreatedEvtKey , value);
167 Eina.Log.Error($"Error removing proxy for event {key}");
171 ///<summary>Method to raise event WindowCreatedEvt.</summary>
172 public void On_WindowCreatedEvt(EventArgs e)
176 evt = (EventHandler)eventHandlers[WindowCreatedEvtKey];
178 evt?.Invoke(this, e);
180 Efl.EventCb evt_WindowCreatedEvt_delegate;
181 private void on_WindowCreatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
183 EventArgs args = EventArgs.Empty;
185 On_WindowCreatedEvt(args);
186 } catch (Exception e) {
187 Eina.Log.Error(e.ToString());
188 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
192 private static object WindowDestroyedEvtKey = new object();
193 /// <summary>Called when window has been destroyed.</summary>
194 public event EventHandler WindowDestroyedEvt
198 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DESTROYED";
199 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowDestroyedEvt_delegate)) {
200 eventHandlers.AddHandler(WindowDestroyedEvtKey , value);
202 Eina.Log.Error($"Error adding proxy for event {key}");
207 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DESTROYED";
208 if (RemoveNativeEventHandler(key, this.evt_WindowDestroyedEvt_delegate)) {
209 eventHandlers.RemoveHandler(WindowDestroyedEvtKey , value);
211 Eina.Log.Error($"Error removing proxy for event {key}");
215 ///<summary>Method to raise event WindowDestroyedEvt.</summary>
216 public void On_WindowDestroyedEvt(EventArgs e)
220 evt = (EventHandler)eventHandlers[WindowDestroyedEvtKey];
222 evt?.Invoke(this, e);
224 Efl.EventCb evt_WindowDestroyedEvt_delegate;
225 private void on_WindowDestroyedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
227 EventArgs args = EventArgs.Empty;
229 On_WindowDestroyedEvt(args);
230 } catch (Exception e) {
231 Eina.Log.Error(e.ToString());
232 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
236 private static object WindowActivatedEvtKey = new object();
237 /// <summary>Called when window has been activated. (focused)</summary>
238 public event EventHandler WindowActivatedEvt
242 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_ACTIVATED";
243 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowActivatedEvt_delegate)) {
244 eventHandlers.AddHandler(WindowActivatedEvtKey , value);
246 Eina.Log.Error($"Error adding proxy for event {key}");
251 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_ACTIVATED";
252 if (RemoveNativeEventHandler(key, this.evt_WindowActivatedEvt_delegate)) {
253 eventHandlers.RemoveHandler(WindowActivatedEvtKey , value);
255 Eina.Log.Error($"Error removing proxy for event {key}");
259 ///<summary>Method to raise event WindowActivatedEvt.</summary>
260 public void On_WindowActivatedEvt(EventArgs e)
264 evt = (EventHandler)eventHandlers[WindowActivatedEvtKey];
266 evt?.Invoke(this, e);
268 Efl.EventCb evt_WindowActivatedEvt_delegate;
269 private void on_WindowActivatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
271 EventArgs args = EventArgs.Empty;
273 On_WindowActivatedEvt(args);
274 } catch (Exception e) {
275 Eina.Log.Error(e.ToString());
276 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
280 private static object WindowDeactivatedEvtKey = new object();
281 /// <summary>Called when window has been deactivated (unfocused).</summary>
282 public event EventHandler WindowDeactivatedEvt
286 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DEACTIVATED";
287 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowDeactivatedEvt_delegate)) {
288 eventHandlers.AddHandler(WindowDeactivatedEvtKey , value);
290 Eina.Log.Error($"Error adding proxy for event {key}");
295 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DEACTIVATED";
296 if (RemoveNativeEventHandler(key, this.evt_WindowDeactivatedEvt_delegate)) {
297 eventHandlers.RemoveHandler(WindowDeactivatedEvtKey , value);
299 Eina.Log.Error($"Error removing proxy for event {key}");
303 ///<summary>Method to raise event WindowDeactivatedEvt.</summary>
304 public void On_WindowDeactivatedEvt(EventArgs e)
308 evt = (EventHandler)eventHandlers[WindowDeactivatedEvtKey];
310 evt?.Invoke(this, e);
312 Efl.EventCb evt_WindowDeactivatedEvt_delegate;
313 private void on_WindowDeactivatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
315 EventArgs args = EventArgs.Empty;
317 On_WindowDeactivatedEvt(args);
318 } catch (Exception e) {
319 Eina.Log.Error(e.ToString());
320 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
324 private static object WindowMaximizedEvtKey = new object();
325 /// <summary>Called when window has been maximized</summary>
326 public event EventHandler WindowMaximizedEvt
330 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MAXIMIZED";
331 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowMaximizedEvt_delegate)) {
332 eventHandlers.AddHandler(WindowMaximizedEvtKey , value);
334 Eina.Log.Error($"Error adding proxy for event {key}");
339 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MAXIMIZED";
340 if (RemoveNativeEventHandler(key, this.evt_WindowMaximizedEvt_delegate)) {
341 eventHandlers.RemoveHandler(WindowMaximizedEvtKey , value);
343 Eina.Log.Error($"Error removing proxy for event {key}");
347 ///<summary>Method to raise event WindowMaximizedEvt.</summary>
348 public void On_WindowMaximizedEvt(EventArgs e)
352 evt = (EventHandler)eventHandlers[WindowMaximizedEvtKey];
354 evt?.Invoke(this, e);
356 Efl.EventCb evt_WindowMaximizedEvt_delegate;
357 private void on_WindowMaximizedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
359 EventArgs args = EventArgs.Empty;
361 On_WindowMaximizedEvt(args);
362 } catch (Exception e) {
363 Eina.Log.Error(e.ToString());
364 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
368 private static object WindowMinimizedEvtKey = new object();
369 /// <summary>Called when window has been minimized</summary>
370 public event EventHandler WindowMinimizedEvt
374 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MINIMIZED";
375 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowMinimizedEvt_delegate)) {
376 eventHandlers.AddHandler(WindowMinimizedEvtKey , value);
378 Eina.Log.Error($"Error adding proxy for event {key}");
383 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MINIMIZED";
384 if (RemoveNativeEventHandler(key, this.evt_WindowMinimizedEvt_delegate)) {
385 eventHandlers.RemoveHandler(WindowMinimizedEvtKey , value);
387 Eina.Log.Error($"Error removing proxy for event {key}");
391 ///<summary>Method to raise event WindowMinimizedEvt.</summary>
392 public void On_WindowMinimizedEvt(EventArgs e)
396 evt = (EventHandler)eventHandlers[WindowMinimizedEvtKey];
398 evt?.Invoke(this, e);
400 Efl.EventCb evt_WindowMinimizedEvt_delegate;
401 private void on_WindowMinimizedEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
403 EventArgs args = EventArgs.Empty;
405 On_WindowMinimizedEvt(args);
406 } catch (Exception e) {
407 Eina.Log.Error(e.ToString());
408 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
412 private static object WindowRestoredEvtKey = new object();
413 /// <summary>Called when window has been restored</summary>
414 public event EventHandler WindowRestoredEvt
418 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_RESTORED";
419 if (AddNativeEventHandler(efl.Libs.Elementary, key, this.evt_WindowRestoredEvt_delegate)) {
420 eventHandlers.AddHandler(WindowRestoredEvtKey , value);
422 Eina.Log.Error($"Error adding proxy for event {key}");
427 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_RESTORED";
428 if (RemoveNativeEventHandler(key, this.evt_WindowRestoredEvt_delegate)) {
429 eventHandlers.RemoveHandler(WindowRestoredEvtKey , value);
431 Eina.Log.Error($"Error removing proxy for event {key}");
435 ///<summary>Method to raise event WindowRestoredEvt.</summary>
436 public void On_WindowRestoredEvt(EventArgs e)
440 evt = (EventHandler)eventHandlers[WindowRestoredEvtKey];
442 evt?.Invoke(this, e);
444 Efl.EventCb evt_WindowRestoredEvt_delegate;
445 private void on_WindowRestoredEvt_NativeCallback(System.IntPtr data, ref Efl.Event.NativeStruct evt)
447 EventArgs args = EventArgs.Empty;
449 On_WindowRestoredEvt(args);
450 } catch (Exception e) {
451 Eina.Log.Error(e.ToString());
452 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
456 ///<summary>Register the Eo event wrappers making the bridge to C# events. Internal usage only.</summary>
457 void RegisterEventProxies()
459 evt_WindowCreatedEvt_delegate = new Efl.EventCb(on_WindowCreatedEvt_NativeCallback);
460 evt_WindowDestroyedEvt_delegate = new Efl.EventCb(on_WindowDestroyedEvt_NativeCallback);
461 evt_WindowActivatedEvt_delegate = new Efl.EventCb(on_WindowActivatedEvt_NativeCallback);
462 evt_WindowDeactivatedEvt_delegate = new Efl.EventCb(on_WindowDeactivatedEvt_NativeCallback);
463 evt_WindowMaximizedEvt_delegate = new Efl.EventCb(on_WindowMaximizedEvt_NativeCallback);
464 evt_WindowMinimizedEvt_delegate = new Efl.EventCb(on_WindowMinimizedEvt_NativeCallback);
465 evt_WindowRestoredEvt_delegate = new Efl.EventCb(on_WindowRestoredEvt_NativeCallback);
467 private static IntPtr GetEflClassStatic()
469 return Efl.Access.IWindowConcrete.efl_access_window_interface_get();
472 public class IWindowNativeInherit : Efl.Eo.NativeClass{
473 public static Efl.Eo.NativeModule _Module = new Efl.Eo.NativeModule(efl.Libs.Elementary);
474 public override System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type)
476 var descs = new System.Collections.Generic.List<Efl_Op_Description>();
477 var methods = Efl.Eo.Globals.GetUserMethods(type);
480 public override IntPtr GetEflClass()
482 return Efl.Access.IWindowConcrete.efl_access_window_interface_get();
484 public static IntPtr GetEflClassStatic()
486 return Efl.Access.IWindowConcrete.efl_access_window_interface_get();