2 * Copyright(c) 2023 Samsung Electronics Co., Ltd.
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.
19 using System.ComponentModel;
20 using System.Runtime.InteropServices;
21 using Tizen.NUI.BaseComponents;
22 using System.Collections.Generic;
27 /// The window class is used internally for drawing.<br />
28 /// The window has an orientation and indicator properties.<br />
30 /// <since_tizen> 3 </since_tizen>
31 public partial class Window
33 private WindowFocusChangedEventCallbackType windowFocusChangedEventCallback;
34 private RootLayerTouchDataCallbackType rootLayerTouchDataCallback;
35 private RootLayerTouchDataCallbackType rootLayerInterceptTouchDataCallback;
36 private WheelEventCallbackType wheelEventCallback;
37 private EventCallbackDelegateType1 stageKeyCallbackDelegate;
38 private InterceptKeyEventDelegateType stageInterceptKeyCallbackDelegate;
39 private EventCallbackDelegateType0 stageEventProcessingFinishedEventCallbackDelegate;
40 private EventHandler stageContextLostEventHandler;
41 private EventCallbackDelegateType0 stageContextLostEventCallbackDelegate;
42 private EventHandler stageContextRegainedEventHandler;
43 private EventCallbackDelegateType0 stageContextRegainedEventCallbackDelegate;
44 private EventHandler stageSceneCreatedEventHandler;
45 private EventCallbackDelegateType0 stageSceneCreatedEventCallbackDelegate;
46 private WindowResizeEventCallbackType windowResizeEventCallback;
47 private WindowFocusChangedEventCallbackType windowFocusChangedEventCallback2;
48 private TransitionEffectEventCallbackType transitionEffectEventCallback;
49 private MovedEventCallbackType movedEventCallback;
50 private OrientationChangedEventCallbackType orientationChangedEventCallback;
51 private KeyboardRepeatSettingsChangedEventCallbackType keyboardRepeatSettingsChangedEventCallback;
52 private AuxiliaryMessageEventCallbackType auxiliaryMessageEventCallback;
53 private WindowMouseInOutEventCallbackType windowMouseInOutEventCallback;
54 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
55 private delegate void WindowFocusChangedEventCallbackType(IntPtr window, bool focusGained);
56 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
57 private delegate bool RootLayerTouchDataCallbackType(IntPtr view, IntPtr touchData);
58 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
59 private delegate bool WheelEventCallbackType(IntPtr view, IntPtr wheelEvent);
60 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
61 private delegate void WindowResizeEventCallbackType(IntPtr window, IntPtr windowSize);
62 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
63 private delegate void WindowFocusChangedEventCallbackType2(IntPtr window, bool focusGained);
64 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
65 private delegate void TransitionEffectEventCallbackType(IntPtr window, int state, int type);
66 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
67 private delegate void MovedEventCallbackType(IntPtr window, IntPtr position);
68 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
69 private delegate void OrientationChangedEventCallbackType(IntPtr window, int orientation);
70 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
71 private delegate void KeyboardRepeatSettingsChangedEventCallbackType();
72 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
73 private delegate void AuxiliaryMessageEventCallbackType(IntPtr kData, IntPtr vData, IntPtr optionsArray);
74 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
75 private delegate bool InterceptKeyEventDelegateType(IntPtr arg1);
76 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
77 private delegate void WindowMouseInOutEventCallbackType(IntPtr window, IntPtr mouseEvent);
80 /// FocusChanged event.
82 /// <since_tizen> 3 </since_tizen>
83 public event EventHandler<FocusChangedEventArgs> FocusChanged
87 if (windowFocusChangedEventHandler == null)
89 windowFocusChangedEventCallback = OnWindowFocusedChanged;
90 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
91 signal.Ensure()?.Connect(windowFocusChangedEventCallback);
93 windowFocusChangedEventHandler += value;
97 windowFocusChangedEventHandler -= value;
98 if (windowFocusChangedEventHandler == null && windowFocusChangedEventCallback != null)
100 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
101 signal.Ensure()?.Disconnect(windowFocusChangedEventCallback);
102 windowFocusChangedEventCallback = null;
108 /// Emits the event when the screen is touched and when the touch ends.<br />
109 /// If there are multiple touch points then it is emitted when the first touch occurs and
110 /// when the last finger is lifted too.<br />
111 /// Even though incoming events are interrupted, the event occurs.<br />
113 /// <since_tizen> 3 </since_tizen>
114 public event EventHandler<TouchEventArgs> TouchEvent
118 if (rootLayerTouchDataEventHandler == null)
120 rootLayerTouchDataCallback = OnWindowTouch;
121 Interop.ActorSignal.TouchConnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
122 NDalicPINVOKE.ThrowExceptionIfExists();
124 rootLayerTouchDataEventHandler += value;
128 rootLayerTouchDataEventHandler -= value;
129 if (rootLayerTouchDataEventHandler == null && rootLayerTouchDataCallback != null)
131 Interop.ActorSignal.TouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
132 NDalicPINVOKE.ThrowExceptionIfExists();
133 rootLayerTouchDataCallback = null;
139 /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
140 /// The touched signal is emitted when the touch input is received.<br />
141 /// This can receive touch events before child. <br />
142 /// If it returns false, the child can receive the touch event. If it returns true, the touch event is intercepted. So child cannot receive touch event.<br />
144 [EditorBrowsable(EditorBrowsableState.Never)]
145 public event ReturnTypeEventHandler<object, TouchEventArgs, bool> InterceptTouchEvent
149 if (rootLayerInterceptTouchDataEventHandler == null)
151 rootLayerInterceptTouchDataCallback = OnWindowInterceptTouch;
152 Interop.ActorSignal.InterceptTouchConnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
153 NDalicPINVOKE.ThrowExceptionIfExists();
155 rootLayerInterceptTouchDataEventHandler += value;
159 rootLayerInterceptTouchDataEventHandler -= value;
160 if (rootLayerInterceptTouchDataEventHandler == null && rootLayerInterceptTouchDataCallback != null)
162 Interop.ActorSignal.InterceptTouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
163 NDalicPINVOKE.ThrowExceptionIfExists();
164 rootLayerInterceptTouchDataCallback = null;
170 /// Emits the event when the wheel event is received.
172 /// <since_tizen> 3 </since_tizen>
173 public event EventHandler<WheelEventArgs> WheelEvent
177 if (stageWheelHandler == null)
179 wheelEventCallback = OnStageWheel;
180 Interop.ActorSignal.WheelEventConnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
181 NDalicPINVOKE.ThrowExceptionIfExists();
183 stageWheelHandler += value;
185 if (DetentEventHandler == null)
187 DetentEventCallback = OnDetentEvent;
188 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
189 signal.Ensure()?.Connect(DetentEventCallback);
191 DetentEventHandler += value;
195 stageWheelHandler -= value;
196 if (stageWheelHandler == null && wheelEventCallback != null)
198 Interop.ActorSignal.WheelEventDisconnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
199 NDalicPINVOKE.ThrowExceptionIfExists();
200 wheelEventCallback = null;
203 DetentEventHandler -= value;
204 if (DetentEventHandler == null && DetentEventCallback != null)
206 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
207 signal.Ensure()?.Disconnect(DetentEventCallback);
208 DetentEventCallback = null;
214 /// Emits the event when the key event is received.
216 /// <since_tizen> 3 </since_tizen>
217 public event EventHandler<KeyEventArgs> KeyEvent
221 if (stageKeyHandler == null)
223 stageKeyCallbackDelegate = OnStageKey;
224 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
225 signal.Ensure()?.Connect(stageKeyCallbackDelegate);
227 stageKeyHandler += value;
231 stageKeyHandler -= value;
232 if (stageKeyHandler == null && stageKeyCallbackDelegate != null)
234 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
235 signal.Ensure()?.Disconnect(stageKeyCallbackDelegate);
236 stageKeyCallbackDelegate = null;
242 /// Intercepts KeyEvents in the window before dispatching KeyEvents to the child.<br />
243 /// If it returns true(consumed), no KeyEvent is delivered to the child.
245 [EditorBrowsable(EditorBrowsableState.Never)]
246 public event ReturnTypeEventHandler<object, KeyEventArgs, bool> InterceptKeyEvent
250 if (stageInterceptKeyHandler == null)
252 stageInterceptKeyCallbackDelegate = OnStageInterceptKey;
253 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
254 signal.Ensure()?.Connect(stageInterceptKeyCallbackDelegate);
256 stageInterceptKeyHandler += value;
260 stageInterceptKeyHandler -= value;
261 if (stageInterceptKeyHandler == null && stageInterceptKeyCallbackDelegate != null)
263 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
264 signal.Ensure()?.Disconnect(stageInterceptKeyCallbackDelegate);
265 stageInterceptKeyCallbackDelegate = null;
271 /// Emits the event when the window resized.
273 /// <since_tizen> 3 </since_tizen>
274 public event EventHandler<ResizedEventArgs> Resized
278 if (windowResizeEventHandler == null)
280 windowResizeEventCallback = OnResized;
281 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
282 signal.Ensure()?.Connect(windowResizeEventCallback);
285 windowResizeEventHandler += value;
289 windowResizeEventHandler -= value;
290 if (windowResizeEventHandler == null && windowResizeEventCallback != null)
292 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
293 signal.Ensure()?.Disconnect(windowResizeEventCallback);
294 windowResizeEventCallback = null;
300 /// Do not use this, that will be deprecated. Use 'FocusChanged' event instead.
302 /// <since_tizen> 3 </since_tizen>
303 /// Do not use this, that will be deprecated.
304 /// Instead Use FocusChanged.
305 [Obsolete("Do not use this, that will be deprecated. Use FocusChanged instead. " +
307 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
308 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
309 [EditorBrowsable(EditorBrowsableState.Never)]
310 public event EventHandler<FocusChangedEventArgs> WindowFocusChanged
314 if (windowFocusChangedEventHandler2 == null)
316 windowFocusChangedEventCallback2 = OnWindowFocusedChanged2;
317 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
318 signal.Ensure()?.Connect(windowFocusChangedEventCallback2);
320 windowFocusChangedEventHandler2 += value;
324 windowFocusChangedEventHandler2 -= value;
325 if (windowFocusChangedEventHandler2 == null && windowFocusChangedEventCallback2 != null)
327 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
328 signal.Ensure()?.Disconnect(windowFocusChangedEventCallback2);
329 windowFocusChangedEventCallback2 = null;
337 [EditorBrowsable(EditorBrowsableState.Never)]
338 public event EventHandler<TransitionEffectEventArgs> TransitionEffect
342 if (transitionEffectHandler == null)
344 transitionEffectEventCallback = OnTransitionEffect;
345 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
346 signal.Ensure()?.Connect(transitionEffectEventCallback);
348 transitionEffectHandler += value;
352 transitionEffectHandler -= value;
353 if (transitionEffectHandler == null && transitionEffectEventCallback != null)
355 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
356 signal.Ensure()?.Disconnect(transitionEffectEventCallback);
357 transitionEffectEventCallback = null;
365 [EditorBrowsable(EditorBrowsableState.Never)]
366 public event EventHandler<WindowMovedEventArgs> Moved
370 if (movedHandler == null)
372 movedEventCallback = OnMoved;
373 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
374 signal.Ensure()?.Connect(movedEventCallback);
376 movedHandler += value;
380 movedHandler -= value;
381 if (movedHandler == null && movedEventCallback != null)
383 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
384 signal.Ensure()?.Disconnect(movedEventCallback);
385 movedEventCallback = null;
391 /// Window Orientation Changed event
392 /// This event is for per windows
394 [EditorBrowsable(EditorBrowsableState.Never)]
395 public event EventHandler<WindowOrientationChangedEventArgs> OrientationChanged
399 if (orientationChangedHandler == null)
401 orientationChangedEventCallback = OnOrientationChanged;
402 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
403 signal.Ensure()?.Connect(orientationChangedEventCallback);
405 orientationChangedHandler += value;
409 orientationChangedHandler -= value;
410 if (orientationChangedHandler == null && orientationChangedEventCallback != null)
412 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
413 signal.Ensure()?.Disconnect(orientationChangedEventCallback);
414 orientationChangedEventCallback = null;
420 /// Keyboard Repeat Settings Changed
422 [EditorBrowsable(EditorBrowsableState.Never)]
423 public event EventHandler KeyboardRepeatSettingsChanged
427 if (keyboardRepeatSettingsChangedHandler == null)
429 keyboardRepeatSettingsChangedEventCallback = OnKeyboardRepeatSettingsChanged;
430 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
431 signal.Ensure()?.Connect(keyboardRepeatSettingsChangedEventCallback);
433 keyboardRepeatSettingsChangedHandler += value;
437 keyboardRepeatSettingsChangedHandler -= value;
438 if (keyboardRepeatSettingsChangedHandler == null && keyboardRepeatSettingsChangedEventCallback != null)
440 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
441 signal.Ensure()?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
442 keyboardRepeatSettingsChangedEventCallback = null;
448 /// MouseInOutEvent event.
450 [EditorBrowsable(EditorBrowsableState.Never)]
451 public event EventHandler<MouseInOutEventArgs> MouseInOutEvent
455 if (windowMouseInOutEventHandler == null)
457 windowMouseInOutEventCallback = OnWindowMouseInOutEvent;
458 using WindowMouseInOutEventSignal signal = new WindowMouseInOutEventSignal(Interop.WindowMouseInOutEventSignal.GetSignal(SwigCPtr), false);
459 signal.Ensure()?.Connect(windowMouseInOutEventCallback);
461 windowMouseInOutEventHandler += value;
465 windowMouseInOutEventHandler -= value;
466 if (windowMouseInOutEventHandler == null && windowMouseInOutEventCallback != null)
468 using WindowMouseInOutEventSignal signal = new WindowMouseInOutEventSignal(Interop.WindowMouseInOutEventSignal.GetSignal(SwigCPtr), false);
469 signal.Ensure()?.Disconnect(windowMouseInOutEventCallback);
470 windowMouseInOutEventCallback = null;
475 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler;
476 private event EventHandler<TouchEventArgs> rootLayerTouchDataEventHandler;
477 private ReturnTypeEventHandler<object, TouchEventArgs, bool> rootLayerInterceptTouchDataEventHandler;
478 private event EventHandler<WheelEventArgs> stageWheelHandler;
479 private event EventHandler<KeyEventArgs> stageKeyHandler;
480 private ReturnTypeEventHandler<object, KeyEventArgs, bool> stageInterceptKeyHandler;
481 private event EventHandler stageEventProcessingFinishedEventHandler;
482 private event EventHandler<ResizedEventArgs> windowResizeEventHandler;
483 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler2;
484 private event EventHandler<TransitionEffectEventArgs> transitionEffectHandler;
485 private event EventHandler<WindowMovedEventArgs> movedHandler;
486 private event EventHandler<WindowOrientationChangedEventArgs> orientationChangedHandler;
487 private event EventHandler keyboardRepeatSettingsChangedHandler;
488 private event EventHandler<AuxiliaryMessageEventArgs> auxiliaryMessageEventHandler;
489 private event EventHandler<MouseInOutEventArgs> windowMouseInOutEventHandler;
492 internal event EventHandler EventProcessingFinished
496 if (stageEventProcessingFinishedEventHandler == null)
498 stageEventProcessingFinishedEventCallbackDelegate = OnEventProcessingFinished;
499 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
500 signal.Ensure()?.Connect(stageEventProcessingFinishedEventCallbackDelegate);
502 stageEventProcessingFinishedEventHandler += value;
506 stageEventProcessingFinishedEventHandler -= value;
507 if (stageEventProcessingFinishedEventHandler == null && stageEventProcessingFinishedEventCallbackDelegate != null)
509 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
510 signal.Ensure()?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
511 stageEventProcessingFinishedEventCallbackDelegate = null;
516 internal event EventHandler ContextLost
520 if (stageContextLostEventHandler == null)
522 stageContextLostEventCallbackDelegate = OnContextLost;
523 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
524 signal.Ensure()?.Connect(stageContextLostEventCallbackDelegate);
526 stageContextLostEventHandler += value;
530 stageContextLostEventHandler -= value;
531 if (stageContextLostEventHandler == null && stageContextLostEventCallbackDelegate != null)
533 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
534 signal.Ensure()?.Disconnect(stageContextLostEventCallbackDelegate);
535 stageContextLostEventCallbackDelegate = null;
540 internal event EventHandler ContextRegained
544 if (stageContextRegainedEventHandler == null)
546 stageContextRegainedEventCallbackDelegate = OnContextRegained;
547 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
548 signal.Ensure()?.Connect(stageContextRegainedEventCallbackDelegate);
550 stageContextRegainedEventHandler += value;
554 stageContextRegainedEventHandler -= value;
555 if (stageContextRegainedEventHandler == null && stageContextRegainedEventCallbackDelegate != null)
557 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
558 signal.Ensure()?.Disconnect(stageContextRegainedEventCallbackDelegate);
559 stageContextRegainedEventCallbackDelegate = null;
564 internal event EventHandler SceneCreated
568 if (stageSceneCreatedEventHandler == null)
570 stageSceneCreatedEventCallbackDelegate = OnSceneCreated;
571 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
572 signal.Ensure()?.Connect(stageSceneCreatedEventCallbackDelegate);
574 stageSceneCreatedEventHandler += value;
578 stageSceneCreatedEventHandler -= value;
579 if (stageSceneCreatedEventHandler == null && stageSceneCreatedEventCallbackDelegate != null)
581 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
582 signal.Ensure()?.Disconnect(stageSceneCreatedEventCallbackDelegate);
583 stageSceneCreatedEventCallbackDelegate = null;
588 internal System.IntPtr GetNativeWindowHandler()
590 System.IntPtr ret = Interop.Window.GetNativeWindowHandler(HandleRef.ToIntPtr(this.SwigCPtr));
591 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
596 /// Disconnect all native signals
598 /// <since_tizen> 5 </since_tizen>
599 internal void DisconnectNativeSignals()
601 if (HasBody() == false)
603 NUILog.Debug($"[Dispose] DisConnectFromSignals() No native body! No need to Disconnect Signals!");
607 if (windowFocusChangedEventCallback != null)
609 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
610 signal?.Disconnect(windowFocusChangedEventCallback);
611 windowFocusChangedEventCallback = null;
614 if (rootLayerTouchDataCallback != null)
616 Interop.ActorSignal.TouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
617 NDalicPINVOKE.ThrowExceptionIfExists();
618 rootLayerTouchDataCallback = null;
621 if (rootLayerInterceptTouchDataCallback != null)
623 Interop.ActorSignal.InterceptTouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
624 NDalicPINVOKE.ThrowExceptionIfExists();
625 rootLayerInterceptTouchDataCallback = null;
628 if (wheelEventCallback != null)
630 Interop.ActorSignal.WheelEventDisconnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
631 NDalicPINVOKE.ThrowExceptionIfExists();
632 wheelEventCallback = null;
635 if (DetentEventCallback != null)
637 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
638 signal?.Disconnect(DetentEventCallback);
639 DetentEventCallback = null;
642 if (stageKeyCallbackDelegate != null)
644 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(GetBaseHandleCPtrHandleRef), false);
645 signal?.Disconnect(stageKeyCallbackDelegate);
646 stageKeyCallbackDelegate = null;
649 if (stageInterceptKeyCallbackDelegate != null)
651 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(GetBaseHandleCPtrHandleRef), false);
652 signal?.Disconnect(stageInterceptKeyCallbackDelegate);
653 stageInterceptKeyCallbackDelegate = null;
656 if (stageEventProcessingFinishedEventCallbackDelegate != null)
658 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
659 signal?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
660 stageEventProcessingFinishedEventCallbackDelegate = null;
663 if (stageContextLostEventCallbackDelegate != null)
665 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
666 signal?.Disconnect(stageContextLostEventCallbackDelegate);
667 stageContextLostEventCallbackDelegate = null;
670 if (stageContextRegainedEventCallbackDelegate != null)
672 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
673 signal?.Disconnect(stageContextRegainedEventCallbackDelegate);
674 stageContextRegainedEventCallbackDelegate = null;
677 if (stageSceneCreatedEventCallbackDelegate != null)
679 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
680 signal?.Disconnect(stageSceneCreatedEventCallbackDelegate);
681 stageSceneCreatedEventCallbackDelegate = null;
684 if (windowResizeEventCallback != null)
686 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(GetBaseHandleCPtrHandleRef), false);
687 signal?.Disconnect(windowResizeEventCallback);
688 windowResizeEventCallback = null;
691 if (windowFocusChangedEventCallback2 != null)
693 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
694 signal?.Disconnect(windowFocusChangedEventCallback2);
695 windowFocusChangedEventCallback2 = null;
698 if (transitionEffectEventCallback != null)
700 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
701 signal?.Disconnect(transitionEffectEventCallback);
702 transitionEffectEventCallback = null;
705 if (movedEventCallback != null)
707 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
708 signal?.Disconnect(movedEventCallback);
709 movedEventCallback = null;
712 if (orientationChangedEventCallback != null)
714 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
715 signal?.Disconnect(orientationChangedEventCallback);
716 orientationChangedEventCallback = null;
719 if (keyboardRepeatSettingsChangedEventCallback != null)
721 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
722 signal?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
723 keyboardRepeatSettingsChangedEventCallback = null;
726 if (auxiliaryMessageEventCallback != null)
728 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(GetBaseHandleCPtrHandleRef), false);
729 signal?.Disconnect(auxiliaryMessageEventCallback);
730 auxiliaryMessageEventCallback = null;
733 if (AccessibilityHighlightEventCallback != null)
735 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
736 signal?.Disconnect(AccessibilityHighlightEventCallback);
737 AccessibilityHighlightEventCallback = null;
740 if (windowMouseInOutEventCallback != null)
742 using WindowMouseInOutEventSignal signal = new WindowMouseInOutEventSignal(Interop.WindowMouseInOutEventSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
743 signal?.Disconnect(windowMouseInOutEventCallback);
744 windowMouseInOutEventCallback = null;
749 private void OnWindowFocusedChanged(IntPtr window, bool focusGained)
751 if (window == IntPtr.Zero)
753 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
757 if (windowFocusChangedEventHandler != null)
759 FocusChangedEventArgs e = new FocusChangedEventArgs();
760 e.FocusGained = focusGained;
761 windowFocusChangedEventHandler(this, e);
765 private bool OnWindowTouch(IntPtr view, IntPtr touchData)
767 if (touchData == global::System.IntPtr.Zero)
769 NUILog.Error("touchData should not be null!");
773 if (rootLayerTouchDataEventHandler != null)
775 TouchEventArgs e = new TouchEventArgs();
776 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
777 rootLayerTouchDataEventHandler(this, e);
782 private bool OnWindowInterceptTouch(IntPtr view, IntPtr touchData)
784 if (touchData == global::System.IntPtr.Zero)
786 NUILog.Error("touchData should not be null!");
790 bool consumed = false;
791 if (rootLayerInterceptTouchDataEventHandler != null)
793 TouchEventArgs e = new TouchEventArgs();
794 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
795 consumed = rootLayerInterceptTouchDataEventHandler(this, e);
800 private bool OnStageWheel(IntPtr rootLayer, IntPtr wheelEvent)
802 if (wheelEvent == global::System.IntPtr.Zero)
804 NUILog.Error("wheelEvent should not be null!");
808 if (stageWheelHandler != null)
810 WheelEventArgs e = new WheelEventArgs();
811 e.Wheel = Tizen.NUI.Wheel.GetWheelFromPtr(wheelEvent);
812 stageWheelHandler(this, e);
817 // Callback for Stage KeyEventsignal
818 private void OnStageKey(IntPtr data)
820 if (stageKeyHandler != null)
822 KeyEventArgs e = new KeyEventArgs();
823 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
824 //here we send all data to user event handlers
825 stageKeyHandler(this, e);
829 // Callback for Stage InterceptKeyEventsignal
830 private bool OnStageInterceptKey(IntPtr data)
832 bool consumed = false;
833 if (stageInterceptKeyHandler != null)
835 KeyEventArgs e = new KeyEventArgs();
836 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
837 //here we send all data to user event handlers
838 consumed = stageInterceptKeyHandler(this, e);
843 // Callback for Stage EventProcessingFinishedSignal
844 private void OnEventProcessingFinished()
846 stageEventProcessingFinishedEventHandler?.Invoke(this, null);
849 // Callback for Stage ContextLostSignal
850 private void OnContextLost()
852 stageContextLostEventHandler?.Invoke(this, null);
855 // Callback for Stage ContextRegainedSignal
856 private void OnContextRegained()
858 stageContextRegainedEventHandler?.Invoke(this, null);
861 // Callback for Stage SceneCreatedSignal
862 private void OnSceneCreated()
864 stageSceneCreatedEventHandler?.Invoke(this, null);
867 private void OnResized(IntPtr window, IntPtr windowSize)
869 if (window == IntPtr.Zero)
871 NUILog.Error("OnResized() Window is null! Do nothing!");
875 if (windowResizeEventHandler != null)
877 ResizedEventArgs e = new ResizedEventArgs();
878 // var val = new Uint16Pair(windowSize, false);
879 // e.WindowSize = new Size2D(val.GetWidth(), val.GetHeight());
882 // Workaround : windowSize should be valid pointer from dali,
883 // but currently it is fixed and is not Uint16Pair class.
884 // will be fixed later.
885 e.WindowSize = this.WindowSize;
886 windowResizeEventHandler(this, e);
890 private void OnWindowFocusedChanged2(IntPtr window, bool focusGained)
892 if (window == IntPtr.Zero)
894 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
898 if (windowFocusChangedEventHandler2 != null)
900 FocusChangedEventArgs e = new FocusChangedEventArgs();
901 e.FocusGained = focusGained;
902 windowFocusChangedEventHandler2(this, e);
906 private void OnTransitionEffect(IntPtr window, int state, int type)
908 if (window == global::System.IntPtr.Zero)
913 if (transitionEffectHandler != null)
915 TransitionEffectEventArgs e = new TransitionEffectEventArgs();
916 e.State = (EffectState)state;
917 e.Type = (EffectType)type;
918 transitionEffectHandler(this, e);
923 private void OnMoved(IntPtr window, IntPtr position)
925 if (window == global::System.IntPtr.Zero)
930 if (movedHandler != null)
932 WindowMovedEventArgs e = new WindowMovedEventArgs();
933 e.WindowPosition = this.WindowPosition;
934 movedHandler(this, e);
939 private void OnOrientationChanged(IntPtr window, int orientation)
941 if (window == global::System.IntPtr.Zero)
946 if (orientationChangedHandler != null)
948 WindowOrientationChangedEventArgs e = new WindowOrientationChangedEventArgs();
949 e.WindowOrientation = (WindowOrientation)orientation;
950 orientationChangedHandler(this, e);
955 private void OnKeyboardRepeatSettingsChanged()
957 keyboardRepeatSettingsChangedHandler?.Invoke(this, null);
961 private void OnWindowMouseInOutEvent(IntPtr view, IntPtr mouseEvent)
963 if (mouseEvent == global::System.IntPtr.Zero)
965 NUILog.Error("mouseEvent should not be null!");
969 if (windowMouseInOutEventHandler != null)
971 MouseInOutEventArgs e = new MouseInOutEventArgs();
972 e.MouseInOut = Tizen.NUI.MouseInOut.GetMouseInOutFromPtr(mouseEvent);
973 windowMouseInOutEventHandler(this, e);
978 /// The focus changed event argument.
980 /// <since_tizen> 3 </since_tizen>
981 public class FocusChangedEventArgs : EventArgs
984 /// FocusGained flag.
986 /// <since_tizen> 3 </since_tizen>
987 public bool FocusGained
995 /// The touch event argument.
997 /// <since_tizen> 3 </since_tizen>
998 public class TouchEventArgs : EventArgs
1000 private Touch touch;
1005 /// <since_tizen> 3 </since_tizen>
1020 /// Wheel event arguments.
1022 /// <since_tizen> 3 </since_tizen>
1023 public class WheelEventArgs : EventArgs
1025 private Wheel wheel;
1030 /// <since_tizen> 3 </since_tizen>
1045 /// Key event arguments.
1047 /// <since_tizen> 3 </since_tizen>
1048 public class KeyEventArgs : EventArgs
1055 /// <since_tizen> 3 </since_tizen>
1070 /// Feeds a key event into the window.
1071 /// This resized event arguments.
1073 /// <since_tizen> 3 </since_tizen>
1074 public class ResizedEventArgs : EventArgs
1079 /// This window size.
1081 /// <since_tizen> 4 </since_tizen>
1082 public Size2D WindowSize
1096 /// MouseInOut evnet arguments.
1098 [EditorBrowsable(EditorBrowsableState.Never)]
1099 public class MouseInOutEventArgs : EventArgs
1101 private MouseInOut mouseEvent;
1104 /// MouseInOut event.
1106 [EditorBrowsable(EditorBrowsableState.Never)]
1107 public MouseInOut MouseInOut
1121 /// Do not use this, that will be deprecated.
1123 /// <since_tizen> 3 </since_tizen>
1124 [Obsolete("Do not use this, that will be deprecated. Use FocusChangedEventArgs instead. " +
1126 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
1127 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
1128 [EditorBrowsable(EditorBrowsableState.Never)]
1129 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
1130 public class WindowFocusChangedEventArgs : EventArgs
1133 /// Do not use this, that will be deprecated.
1135 /// <since_tizen> 3 </since_tizen>
1136 public bool FocusGained
1144 /// Contains and encapsulates Native Window handle.
1146 /// <since_tizen> 4 </since_tizen>
1147 [Obsolete("This has been deprecated in API9 and will be removed in API11. Use Window.NativeHandle instead.")]
1148 public class SafeNativeWindowHandle : SafeHandle
1151 ///Constructor, Native window handle is set to handle.
1153 /// <since_tizen> 4 </since_tizen>
1154 public SafeNativeWindowHandle() : base(IntPtr.Zero, false)
1156 SetHandle(NUIApplication.GetDefaultWindow().GetNativeWindowHandler());
1159 /// Null check if the handle is valid or not.
1161 /// <since_tizen> 4 </since_tizen>
1162 public override bool IsInvalid
1166 return this.handle == IntPtr.Zero;
1170 /// Release handle itself.
1172 /// <returns>true when released successfully.</returns>
1173 /// <since_tizen> 4 </since_tizen>
1174 protected override bool ReleaseHandle()
1181 /// TransitionEffectArgs
1183 [EditorBrowsable(EditorBrowsableState.Never)]
1184 public class TransitionEffectEventArgs : EventArgs
1186 private EffectState state;
1187 private EffectType type;
1192 [EditorBrowsable(EditorBrowsableState.Never)]
1193 public EffectState State
1207 [EditorBrowsable(EditorBrowsableState.Never)]
1208 public EffectType Type
1221 private EventHandler<WheelEventArgs> DetentEventHandler;
1223 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1224 private delegate void DetentEventCallbackType(IntPtr arg1);
1226 private DetentEventCallbackType DetentEventCallback;
1228 private void OnDetentEvent(IntPtr wheelEvent)
1230 WheelEventArgs e = new WheelEventArgs();
1232 if (wheelEvent != global::System.IntPtr.Zero)
1234 e.Wheel = Wheel.GetWheelFromPtr(wheelEvent);
1237 DetentEventHandler?.Invoke(this, e);
1241 /// VisibilityChangedArgs
1243 [EditorBrowsable(EditorBrowsableState.Never)]
1244 public class VisibilityChangedEventArgs : EventArgs
1246 private bool visibility;
1250 [EditorBrowsable(EditorBrowsableState.Never)]
1251 public bool Visibility
1261 private void OnVisibilityChanged(IntPtr window, bool visibility)
1263 if (window == global::System.IntPtr.Zero)
1265 NUILog.Error("[ERR] OnVisibilityChanged() window is null");
1269 VisibilityChangedEventArgs e = new VisibilityChangedEventArgs();
1270 e.Visibility = visibility;
1271 if (VisibilityChangedEventHandler != null)
1273 VisibilityChangedEventHandler.Invoke(this, e);
1277 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1278 private delegate void VisibilityChangedEventCallbackType(IntPtr window, bool visibility);
1279 private VisibilityChangedEventCallbackType VisibilityChangedEventCallback;
1280 private event EventHandler<VisibilityChangedEventArgs> VisibilityChangedEventHandler;
1281 private WindowVisibilityChangedEvent VisibilityChangedEventSignal;
1286 [EditorBrowsable(EditorBrowsableState.Never)]
1287 public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged
1291 if (VisibilityChangedEventHandler == null)
1293 VisibilityChangedEventCallback = OnVisibilityChanged;
1294 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1295 signal.Ensure()?.Connect(VisibilityChangedEventCallback);
1297 VisibilityChangedEventHandler += value;
1301 VisibilityChangedEventHandler -= value;
1302 if (VisibilityChangedEventHandler == null && VisibilityChangedEventCallback != null)
1304 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1305 signal.Ensure()?.Disconnect(VisibilityChangedEventCallback);
1306 VisibilityChangedEventCallback = null;
1312 /// VisibiltyChangedSignalEmit
1314 [EditorBrowsable(EditorBrowsableState.Never)]
1315 public void VisibiltyChangedSignalEmit(bool visibility)
1317 if (VisibilityChangedEventSignal == null)
1319 VisibilityChangedEventSignal = new WindowVisibilityChangedEvent(this);
1321 VisibilityChangedEventSignal.Emit(this, visibility);
1324 private void OnAuxiliaryMessage(IntPtr kData, IntPtr vData, IntPtr optionsArray)
1326 if (kData == IntPtr.Zero || vData == IntPtr.Zero)
1331 using var tmp = new PropertyArray(optionsArray, false);
1332 var size = tmp.Size();
1334 List<string> tmpList = new List<string>();
1336 for (int i = 0; i < size; i++)
1338 string option = "none";
1339 tmp.GetElementAt((uint)i).Get(out option);
1340 tmpList.Add(option);
1345 AuxiliaryMessageEventArgs e = new AuxiliaryMessageEventArgs();
1346 e.Key = StringToVoidSignal.GetResult(kData);
1347 e.Value = StringToVoidSignal.GetResult(vData); ;
1348 e.Options = tmpList;
1350 auxiliaryMessageEventHandler?.Invoke(this, e);
1354 /// Auxiliary message is sent by displayer server when window's auxiliary was changed then display server sent the message.
1355 /// When client application added the window's auxiliary hint and if the auxiliary is changed,
1356 /// display server send the auxiliary message.
1357 /// Auxiliary message has the key, value and options.
1359 [EditorBrowsable(EditorBrowsableState.Never)]
1360 public event EventHandler<AuxiliaryMessageEventArgs> AuxiliaryMessage
1364 if (auxiliaryMessageEventHandler == null)
1366 auxiliaryMessageEventCallback = OnAuxiliaryMessage;
1367 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1368 signal.Ensure()?.Connect(auxiliaryMessageEventCallback);
1370 auxiliaryMessageEventHandler += value;
1374 auxiliaryMessageEventHandler -= value;
1375 if (auxiliaryMessageEventHandler == null && auxiliaryMessageEventCallback != null)
1377 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1378 signal.Ensure()?.Disconnect(auxiliaryMessageEventCallback);
1379 auxiliaryMessageEventCallback = null;
1385 /// AccessibilityHighlightArgs
1387 [EditorBrowsable(EditorBrowsableState.Never)]
1388 public class AccessibilityHighlightEventArgs : EventArgs
1390 private bool accessibilityHighlight;
1392 /// accessibilityHighlight
1394 [EditorBrowsable(EditorBrowsableState.Never)]
1395 public bool AccessibilityHighlight
1397 get => accessibilityHighlight;
1400 accessibilityHighlight = value;
1405 private void OnAccessibilityHighlight(IntPtr window, bool highlight)
1407 if (window == global::System.IntPtr.Zero)
1409 NUILog.Error("[ERR] OnAccessibilityHighlight() window is null");
1413 AccessibilityHighlightEventArgs e = new AccessibilityHighlightEventArgs();
1414 e.AccessibilityHighlight = highlight;
1415 if (AccessibilityHighlightEventHandler != null)
1417 AccessibilityHighlightEventHandler.Invoke(this, e);
1421 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1422 private delegate void AccessibilityHighlightEventCallbackType(IntPtr window, bool highlight);
1423 private AccessibilityHighlightEventCallbackType AccessibilityHighlightEventCallback;
1424 private event EventHandler<AccessibilityHighlightEventArgs> AccessibilityHighlightEventHandler;
1427 /// Emits the event when the window needs to grab or clear highlight.
1429 [EditorBrowsable(EditorBrowsableState.Never)]
1430 public event EventHandler<AccessibilityHighlightEventArgs> AccessibilityHighlight
1434 if (AccessibilityHighlightEventHandler == null)
1436 AccessibilityHighlightEventCallback = OnAccessibilityHighlight;
1437 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
1438 signal.Ensure()?.Connect(AccessibilityHighlightEventCallback);
1440 AccessibilityHighlightEventHandler += value;
1444 AccessibilityHighlightEventHandler -= value;
1445 if (AccessibilityHighlightEventHandler == null && AccessibilityHighlightEventCallback != null)
1447 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
1448 signal.Ensure()?.Disconnect(AccessibilityHighlightEventCallback);
1449 AccessibilityHighlightEventCallback = null;
1458 [EditorBrowsable(EditorBrowsableState.Never)]
1459 public class WindowMovedEventArgs : EventArgs
1461 private Position2D position;
1463 [EditorBrowsable(EditorBrowsableState.Never)]
1464 public Position2D WindowPosition
1478 /// OrientationChangedArgs
1480 [EditorBrowsable(EditorBrowsableState.Never)]
1481 public class WindowOrientationChangedEventArgs : EventArgs
1483 private Window.WindowOrientation orientation;
1485 [EditorBrowsable(EditorBrowsableState.Never)]
1486 public Window.WindowOrientation WindowOrientation
1494 orientation = value;