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 Window :
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 WindowConcrete :
34 ///<summary>Pointer to the native class description.</summary>
35 public System.IntPtr NativeClass {
37 if (((object)this).GetType() == typeof (WindowConcrete))
38 return Efl.Access.WindowNativeInherit.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 public WindowConcrete(System.IntPtr raw)
55 register_event_proxies();
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>Casts obj into an instance of this type.</summary>
77 public static WindowConcrete static_cast(Efl.Object obj)
80 throw new System.ArgumentNullException("obj");
81 return new WindowConcrete(obj.NativeHandle);
83 ///<summary>Verifies if the given object is equal to this one.</summary>
84 public override bool Equals(object obj)
86 var other = obj as Efl.Object;
89 return this.NativeHandle == other.NativeHandle;
91 ///<summary>Gets the hash code for this object based on the native pointer it points to.</summary>
92 public override int GetHashCode()
94 return this.NativeHandle.ToInt32();
96 ///<summary>Turns the native pointer into a string representation.</summary>
97 public override String ToString()
99 return $"{this.GetType().Name}@[{this.NativeHandle.ToInt32():x}]";
101 private readonly object eventLock = new object();
102 private Dictionary<string, int> event_cb_count = new Dictionary<string, int>();
103 private bool add_cpp_event_handler(string lib, string key, Efl.EventCb evt_delegate) {
105 if (!event_cb_count.TryGetValue(key, out event_count))
106 event_cb_count[key] = event_count;
107 if (event_count == 0) {
108 IntPtr desc = Efl.EventDescription.GetNative(lib, key);
109 if (desc == IntPtr.Zero) {
110 Eina.Log.Error($"Failed to get native event {key}");
113 bool result = Efl.Eo.Globals.efl_event_callback_priority_add(handle, desc, 0, evt_delegate, System.IntPtr.Zero);
115 Eina.Log.Error($"Failed to add event proxy for event {key}");
118 Eina.Error.RaiseIfUnhandledException();
120 event_cb_count[key]++;
123 private bool remove_cpp_event_handler(string key, Efl.EventCb evt_delegate) {
125 if (!event_cb_count.TryGetValue(key, out event_count))
126 event_cb_count[key] = event_count;
127 if (event_count == 1) {
128 IntPtr desc = Efl.EventDescription.GetNative(efl.Libs.Elementary, key);
129 if (desc == IntPtr.Zero) {
130 Eina.Log.Error($"Failed to get native event {key}");
133 bool result = Efl.Eo.Globals.efl_event_callback_del(handle, desc, evt_delegate, System.IntPtr.Zero);
135 Eina.Log.Error($"Failed to remove event proxy for event {key}");
138 Eina.Error.RaiseIfUnhandledException();
139 } else if (event_count == 0) {
140 Eina.Log.Error($"Trying to remove proxy for event {key} when there is nothing registered.");
143 event_cb_count[key]--;
146 private static object WindowCreatedEvtKey = new object();
147 /// <summary>Called when new window has been created.</summary>
148 public event EventHandler WindowCreatedEvt
152 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_CREATED";
153 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowCreatedEvt_delegate)) {
154 eventHandlers.AddHandler(WindowCreatedEvtKey , value);
156 Eina.Log.Error($"Error adding proxy for event {key}");
161 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_CREATED";
162 if (remove_cpp_event_handler(key, this.evt_WindowCreatedEvt_delegate)) {
163 eventHandlers.RemoveHandler(WindowCreatedEvtKey , value);
165 Eina.Log.Error($"Error removing proxy for event {key}");
169 ///<summary>Method to raise event WindowCreatedEvt.</summary>
170 public void On_WindowCreatedEvt(EventArgs e)
174 evt = (EventHandler)eventHandlers[WindowCreatedEvtKey];
176 evt?.Invoke(this, e);
178 Efl.EventCb evt_WindowCreatedEvt_delegate;
179 private void on_WindowCreatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
181 EventArgs args = EventArgs.Empty;
183 On_WindowCreatedEvt(args);
184 } catch (Exception e) {
185 Eina.Log.Error(e.ToString());
186 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
190 private static object WindowDestroyedEvtKey = new object();
191 /// <summary>Called when window has been destroyed.</summary>
192 public event EventHandler WindowDestroyedEvt
196 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DESTROYED";
197 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowDestroyedEvt_delegate)) {
198 eventHandlers.AddHandler(WindowDestroyedEvtKey , value);
200 Eina.Log.Error($"Error adding proxy for event {key}");
205 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DESTROYED";
206 if (remove_cpp_event_handler(key, this.evt_WindowDestroyedEvt_delegate)) {
207 eventHandlers.RemoveHandler(WindowDestroyedEvtKey , value);
209 Eina.Log.Error($"Error removing proxy for event {key}");
213 ///<summary>Method to raise event WindowDestroyedEvt.</summary>
214 public void On_WindowDestroyedEvt(EventArgs e)
218 evt = (EventHandler)eventHandlers[WindowDestroyedEvtKey];
220 evt?.Invoke(this, e);
222 Efl.EventCb evt_WindowDestroyedEvt_delegate;
223 private void on_WindowDestroyedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
225 EventArgs args = EventArgs.Empty;
227 On_WindowDestroyedEvt(args);
228 } catch (Exception e) {
229 Eina.Log.Error(e.ToString());
230 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
234 private static object WindowActivatedEvtKey = new object();
235 /// <summary>Called when window has been activated. (focused)</summary>
236 public event EventHandler WindowActivatedEvt
240 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_ACTIVATED";
241 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowActivatedEvt_delegate)) {
242 eventHandlers.AddHandler(WindowActivatedEvtKey , value);
244 Eina.Log.Error($"Error adding proxy for event {key}");
249 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_ACTIVATED";
250 if (remove_cpp_event_handler(key, this.evt_WindowActivatedEvt_delegate)) {
251 eventHandlers.RemoveHandler(WindowActivatedEvtKey , value);
253 Eina.Log.Error($"Error removing proxy for event {key}");
257 ///<summary>Method to raise event WindowActivatedEvt.</summary>
258 public void On_WindowActivatedEvt(EventArgs e)
262 evt = (EventHandler)eventHandlers[WindowActivatedEvtKey];
264 evt?.Invoke(this, e);
266 Efl.EventCb evt_WindowActivatedEvt_delegate;
267 private void on_WindowActivatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
269 EventArgs args = EventArgs.Empty;
271 On_WindowActivatedEvt(args);
272 } catch (Exception e) {
273 Eina.Log.Error(e.ToString());
274 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
278 private static object WindowDeactivatedEvtKey = new object();
279 /// <summary>Called when window has been deactivated (unfocused).</summary>
280 public event EventHandler WindowDeactivatedEvt
284 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DEACTIVATED";
285 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowDeactivatedEvt_delegate)) {
286 eventHandlers.AddHandler(WindowDeactivatedEvtKey , value);
288 Eina.Log.Error($"Error adding proxy for event {key}");
293 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_DEACTIVATED";
294 if (remove_cpp_event_handler(key, this.evt_WindowDeactivatedEvt_delegate)) {
295 eventHandlers.RemoveHandler(WindowDeactivatedEvtKey , value);
297 Eina.Log.Error($"Error removing proxy for event {key}");
301 ///<summary>Method to raise event WindowDeactivatedEvt.</summary>
302 public void On_WindowDeactivatedEvt(EventArgs e)
306 evt = (EventHandler)eventHandlers[WindowDeactivatedEvtKey];
308 evt?.Invoke(this, e);
310 Efl.EventCb evt_WindowDeactivatedEvt_delegate;
311 private void on_WindowDeactivatedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
313 EventArgs args = EventArgs.Empty;
315 On_WindowDeactivatedEvt(args);
316 } catch (Exception e) {
317 Eina.Log.Error(e.ToString());
318 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
322 private static object WindowMaximizedEvtKey = new object();
323 /// <summary>Called when window has been maximized</summary>
324 public event EventHandler WindowMaximizedEvt
328 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MAXIMIZED";
329 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowMaximizedEvt_delegate)) {
330 eventHandlers.AddHandler(WindowMaximizedEvtKey , value);
332 Eina.Log.Error($"Error adding proxy for event {key}");
337 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MAXIMIZED";
338 if (remove_cpp_event_handler(key, this.evt_WindowMaximizedEvt_delegate)) {
339 eventHandlers.RemoveHandler(WindowMaximizedEvtKey , value);
341 Eina.Log.Error($"Error removing proxy for event {key}");
345 ///<summary>Method to raise event WindowMaximizedEvt.</summary>
346 public void On_WindowMaximizedEvt(EventArgs e)
350 evt = (EventHandler)eventHandlers[WindowMaximizedEvtKey];
352 evt?.Invoke(this, e);
354 Efl.EventCb evt_WindowMaximizedEvt_delegate;
355 private void on_WindowMaximizedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
357 EventArgs args = EventArgs.Empty;
359 On_WindowMaximizedEvt(args);
360 } catch (Exception e) {
361 Eina.Log.Error(e.ToString());
362 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
366 private static object WindowMinimizedEvtKey = new object();
367 /// <summary>Called when window has been minimized</summary>
368 public event EventHandler WindowMinimizedEvt
372 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MINIMIZED";
373 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowMinimizedEvt_delegate)) {
374 eventHandlers.AddHandler(WindowMinimizedEvtKey , value);
376 Eina.Log.Error($"Error adding proxy for event {key}");
381 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_MINIMIZED";
382 if (remove_cpp_event_handler(key, this.evt_WindowMinimizedEvt_delegate)) {
383 eventHandlers.RemoveHandler(WindowMinimizedEvtKey , value);
385 Eina.Log.Error($"Error removing proxy for event {key}");
389 ///<summary>Method to raise event WindowMinimizedEvt.</summary>
390 public void On_WindowMinimizedEvt(EventArgs e)
394 evt = (EventHandler)eventHandlers[WindowMinimizedEvtKey];
396 evt?.Invoke(this, e);
398 Efl.EventCb evt_WindowMinimizedEvt_delegate;
399 private void on_WindowMinimizedEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
401 EventArgs args = EventArgs.Empty;
403 On_WindowMinimizedEvt(args);
404 } catch (Exception e) {
405 Eina.Log.Error(e.ToString());
406 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
410 private static object WindowRestoredEvtKey = new object();
411 /// <summary>Called when window has been restored</summary>
412 public event EventHandler WindowRestoredEvt
416 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_RESTORED";
417 if (add_cpp_event_handler(efl.Libs.Elementary, key, this.evt_WindowRestoredEvt_delegate)) {
418 eventHandlers.AddHandler(WindowRestoredEvtKey , value);
420 Eina.Log.Error($"Error adding proxy for event {key}");
425 string key = "_EFL_ACCESS_WINDOW_EVENT_WINDOW_RESTORED";
426 if (remove_cpp_event_handler(key, this.evt_WindowRestoredEvt_delegate)) {
427 eventHandlers.RemoveHandler(WindowRestoredEvtKey , value);
429 Eina.Log.Error($"Error removing proxy for event {key}");
433 ///<summary>Method to raise event WindowRestoredEvt.</summary>
434 public void On_WindowRestoredEvt(EventArgs e)
438 evt = (EventHandler)eventHandlers[WindowRestoredEvtKey];
440 evt?.Invoke(this, e);
442 Efl.EventCb evt_WindowRestoredEvt_delegate;
443 private void on_WindowRestoredEvt_NativeCallback(System.IntPtr data, ref Efl.Event_StructInternal evt)
445 EventArgs args = EventArgs.Empty;
447 On_WindowRestoredEvt(args);
448 } catch (Exception e) {
449 Eina.Log.Error(e.ToString());
450 Eina.Error.Set(Eina.Error.UNHANDLED_EXCEPTION);
454 void register_event_proxies()
456 evt_WindowCreatedEvt_delegate = new Efl.EventCb(on_WindowCreatedEvt_NativeCallback);
457 evt_WindowDestroyedEvt_delegate = new Efl.EventCb(on_WindowDestroyedEvt_NativeCallback);
458 evt_WindowActivatedEvt_delegate = new Efl.EventCb(on_WindowActivatedEvt_NativeCallback);
459 evt_WindowDeactivatedEvt_delegate = new Efl.EventCb(on_WindowDeactivatedEvt_NativeCallback);
460 evt_WindowMaximizedEvt_delegate = new Efl.EventCb(on_WindowMaximizedEvt_NativeCallback);
461 evt_WindowMinimizedEvt_delegate = new Efl.EventCb(on_WindowMinimizedEvt_NativeCallback);
462 evt_WindowRestoredEvt_delegate = new Efl.EventCb(on_WindowRestoredEvt_NativeCallback);
465 public class WindowNativeInherit : Efl.Eo.NativeClass{
466 public static Efl.Eo.NativeModule _Module = new Efl.Eo.NativeModule(efl.Libs.Elementary);
467 public override System.Collections.Generic.List<Efl_Op_Description> GetEoOps(System.Type type)
469 var descs = new System.Collections.Generic.List<Efl_Op_Description>();
472 public override IntPtr GetEflClass()
474 return Efl.Access.WindowConcrete.efl_access_window_interface_get();
476 public static IntPtr GetEflClassStatic()
478 return Efl.Access.WindowConcrete.efl_access_window_interface_get();