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 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
54 private delegate void WindowFocusChangedEventCallbackType(IntPtr window, bool focusGained);
55 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
56 private delegate bool RootLayerTouchDataCallbackType(IntPtr view, IntPtr touchData);
57 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
58 private delegate bool WheelEventCallbackType(IntPtr view, IntPtr wheelEvent);
59 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
60 private delegate void WindowResizeEventCallbackType(IntPtr window, IntPtr windowSize);
61 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
62 private delegate void WindowFocusChangedEventCallbackType2(IntPtr window, bool focusGained);
63 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
64 private delegate void TransitionEffectEventCallbackType(IntPtr window, int state, int type);
65 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
66 private delegate void MovedEventCallbackType(IntPtr window, IntPtr position);
67 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
68 private delegate void OrientationChangedEventCallbackType(IntPtr window, int orientation);
69 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
70 private delegate void KeyboardRepeatSettingsChangedEventCallbackType();
71 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
72 private delegate void AuxiliaryMessageEventCallbackType(IntPtr kData, IntPtr vData, IntPtr optionsArray);
73 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
74 private delegate bool InterceptKeyEventDelegateType(IntPtr arg1);
77 /// FocusChanged event.
79 /// <since_tizen> 3 </since_tizen>
80 public event EventHandler<FocusChangedEventArgs> FocusChanged
84 if (windowFocusChangedEventHandler == null)
86 windowFocusChangedEventCallback = OnWindowFocusedChanged;
87 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
88 signal.Ensure()?.Connect(windowFocusChangedEventCallback);
90 windowFocusChangedEventHandler += value;
94 windowFocusChangedEventHandler -= value;
95 if (windowFocusChangedEventHandler == null && windowFocusChangedEventCallback != null)
97 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
98 signal.Ensure()?.Disconnect(windowFocusChangedEventCallback);
99 windowFocusChangedEventCallback = null;
105 /// Emits the event when the screen is touched and when the touch ends.<br />
106 /// If there are multiple touch points then it is emitted when the first touch occurs and
107 /// when the last finger is lifted too.<br />
108 /// Even though incoming events are interrupted, the event occurs.<br />
110 /// <since_tizen> 3 </since_tizen>
111 public event EventHandler<TouchEventArgs> TouchEvent
115 if (rootLayerTouchDataEventHandler == null)
117 rootLayerTouchDataCallback = OnWindowTouch;
118 Interop.ActorSignal.TouchConnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
119 NDalicPINVOKE.ThrowExceptionIfExists();
121 rootLayerTouchDataEventHandler += value;
125 rootLayerTouchDataEventHandler -= value;
126 if (rootLayerTouchDataEventHandler == null && rootLayerTouchDataCallback != null)
128 Interop.ActorSignal.TouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
129 NDalicPINVOKE.ThrowExceptionIfExists();
130 rootLayerTouchDataCallback = null;
136 /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
137 /// The touched signal is emitted when the touch input is received.<br />
138 /// This can receive touch events before child. <br />
139 /// 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 />
141 [EditorBrowsable(EditorBrowsableState.Never)]
142 public event ReturnTypeEventHandler<object, TouchEventArgs, bool> InterceptTouchEvent
146 if (rootLayerInterceptTouchDataEventHandler == null)
148 rootLayerInterceptTouchDataCallback = OnWindowInterceptTouch;
149 Interop.ActorSignal.InterceptTouchConnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
150 NDalicPINVOKE.ThrowExceptionIfExists();
152 rootLayerInterceptTouchDataEventHandler += value;
156 rootLayerInterceptTouchDataEventHandler -= value;
157 if (rootLayerInterceptTouchDataEventHandler == null && rootLayerInterceptTouchDataCallback != null)
159 Interop.ActorSignal.InterceptTouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
160 NDalicPINVOKE.ThrowExceptionIfExists();
161 rootLayerInterceptTouchDataCallback = null;
167 /// Emits the event when the wheel event is received.
169 /// <since_tizen> 3 </since_tizen>
170 public event EventHandler<WheelEventArgs> WheelEvent
174 if (stageWheelHandler == null)
176 wheelEventCallback = OnStageWheel;
177 Interop.ActorSignal.WheelEventConnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
178 NDalicPINVOKE.ThrowExceptionIfExists();
180 stageWheelHandler += value;
182 if (DetentEventHandler == null)
184 DetentEventCallback = OnDetentEvent;
185 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
186 signal.Ensure()?.Connect(DetentEventCallback);
188 DetentEventHandler += value;
192 stageWheelHandler -= value;
193 if (stageWheelHandler == null && wheelEventCallback != null)
195 Interop.ActorSignal.WheelEventDisconnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
196 NDalicPINVOKE.ThrowExceptionIfExists();
197 wheelEventCallback = null;
200 DetentEventHandler -= value;
201 if (DetentEventHandler == null && DetentEventCallback != null)
203 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
204 signal.Ensure()?.Disconnect(DetentEventCallback);
205 DetentEventCallback = null;
211 /// Emits the event when the key event is received.
213 /// <since_tizen> 3 </since_tizen>
214 public event EventHandler<KeyEventArgs> KeyEvent
218 if (stageKeyHandler == null)
220 stageKeyCallbackDelegate = OnStageKey;
221 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
222 signal.Ensure()?.Connect(stageKeyCallbackDelegate);
224 stageKeyHandler += value;
228 stageKeyHandler -= value;
229 if (stageKeyHandler == null && stageKeyCallbackDelegate != null)
231 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
232 signal.Ensure()?.Disconnect(stageKeyCallbackDelegate);
233 stageKeyCallbackDelegate = null;
239 /// Intercepts KeyEvents in the window before dispatching KeyEvents to the child.<br />
240 /// If it returns true(consumed), no KeyEvent is delivered to the child.
242 [EditorBrowsable(EditorBrowsableState.Never)]
243 public event ReturnTypeEventHandler<object, KeyEventArgs, bool> InterceptKeyEvent
247 if (stageInterceptKeyHandler == null)
249 stageInterceptKeyCallbackDelegate = OnStageInterceptKey;
250 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
251 signal.Ensure()?.Connect(stageInterceptKeyCallbackDelegate);
253 stageInterceptKeyHandler += value;
257 stageInterceptKeyHandler -= value;
258 if (stageInterceptKeyHandler == null && stageInterceptKeyCallbackDelegate != null)
260 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
261 signal.Ensure()?.Disconnect(stageInterceptKeyCallbackDelegate);
262 stageInterceptKeyCallbackDelegate = null;
268 /// Emits the event when the window resized.
270 /// <since_tizen> 3 </since_tizen>
271 public event EventHandler<ResizedEventArgs> Resized
275 if (windowResizeEventHandler == null)
277 windowResizeEventCallback = OnResized;
278 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
279 signal.Ensure()?.Connect(windowResizeEventCallback);
282 windowResizeEventHandler += value;
286 windowResizeEventHandler -= value;
287 if (windowResizeEventHandler == null && windowResizeEventCallback != null)
289 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
290 signal.Ensure()?.Disconnect(windowResizeEventCallback);
291 windowResizeEventCallback = null;
297 /// Do not use this, that will be deprecated. Use 'FocusChanged' event instead.
299 /// <since_tizen> 3 </since_tizen>
300 /// Do not use this, that will be deprecated.
301 /// Instead Use FocusChanged.
302 [Obsolete("Do not use this, that will be deprecated. Use FocusChanged instead. " +
304 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
305 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
306 [EditorBrowsable(EditorBrowsableState.Never)]
307 public event EventHandler<FocusChangedEventArgs> WindowFocusChanged
311 if (windowFocusChangedEventHandler2 == null)
313 windowFocusChangedEventCallback2 = OnWindowFocusedChanged2;
314 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
315 signal.Ensure()?.Connect(windowFocusChangedEventCallback2);
317 windowFocusChangedEventHandler2 += value;
321 windowFocusChangedEventHandler2 -= value;
322 if (windowFocusChangedEventHandler2 == null && windowFocusChangedEventCallback2 != null)
324 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
325 signal.Ensure()?.Disconnect(windowFocusChangedEventCallback2);
326 windowFocusChangedEventCallback2 = null;
334 [EditorBrowsable(EditorBrowsableState.Never)]
335 public event EventHandler<TransitionEffectEventArgs> TransitionEffect
339 if (transitionEffectHandler == null)
341 transitionEffectEventCallback = OnTransitionEffect;
342 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
343 signal.Ensure()?.Connect(transitionEffectEventCallback);
345 transitionEffectHandler += value;
349 transitionEffectHandler -= value;
350 if (transitionEffectHandler == null && transitionEffectEventCallback != null)
352 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
353 signal.Ensure()?.Disconnect(transitionEffectEventCallback);
354 transitionEffectEventCallback = null;
362 [EditorBrowsable(EditorBrowsableState.Never)]
363 public event EventHandler<WindowMovedEventArgs> Moved
367 if (movedHandler == null)
369 movedEventCallback = OnMoved;
370 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
371 signal.Ensure()?.Connect(movedEventCallback);
373 movedHandler += value;
377 movedHandler -= value;
378 if (movedHandler == null && movedEventCallback != null)
380 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
381 signal.Ensure()?.Disconnect(movedEventCallback);
382 movedEventCallback = null;
388 /// Window Orientation Changed event
389 /// This event is for per windows
391 [EditorBrowsable(EditorBrowsableState.Never)]
392 public event EventHandler<WindowOrientationChangedEventArgs> OrientationChanged
396 if (orientationChangedHandler == null)
398 orientationChangedEventCallback = OnOrientationChanged;
399 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
400 signal.Ensure()?.Connect(orientationChangedEventCallback);
402 orientationChangedHandler += value;
406 orientationChangedHandler -= value;
407 if (orientationChangedHandler == null && orientationChangedEventCallback != null)
409 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
410 signal.Ensure()?.Disconnect(orientationChangedEventCallback);
411 orientationChangedEventCallback = null;
417 /// Keyboard Repeat Settings Changed
419 [EditorBrowsable(EditorBrowsableState.Never)]
420 public event EventHandler KeyboardRepeatSettingsChanged
424 if (keyboardRepeatSettingsChangedHandler == null)
426 keyboardRepeatSettingsChangedEventCallback = OnKeyboardRepeatSettingsChanged;
427 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
428 signal.Ensure()?.Connect(keyboardRepeatSettingsChangedEventCallback);
430 keyboardRepeatSettingsChangedHandler += value;
434 keyboardRepeatSettingsChangedHandler -= value;
435 if (keyboardRepeatSettingsChangedHandler == null && keyboardRepeatSettingsChangedEventCallback != null)
437 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
438 signal.Ensure()?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
439 keyboardRepeatSettingsChangedEventCallback = null;
444 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler;
445 private event EventHandler<TouchEventArgs> rootLayerTouchDataEventHandler;
446 private ReturnTypeEventHandler<object, TouchEventArgs, bool> rootLayerInterceptTouchDataEventHandler;
447 private event EventHandler<WheelEventArgs> stageWheelHandler;
448 private event EventHandler<KeyEventArgs> stageKeyHandler;
449 private ReturnTypeEventHandler<object, KeyEventArgs, bool> stageInterceptKeyHandler;
450 private event EventHandler stageEventProcessingFinishedEventHandler;
451 private event EventHandler<ResizedEventArgs> windowResizeEventHandler;
452 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler2;
453 private event EventHandler<TransitionEffectEventArgs> transitionEffectHandler;
454 private event EventHandler<WindowMovedEventArgs> movedHandler;
455 private event EventHandler<WindowOrientationChangedEventArgs> orientationChangedHandler;
456 private event EventHandler keyboardRepeatSettingsChangedHandler;
457 private event EventHandler<AuxiliaryMessageEventArgs> auxiliaryMessageEventHandler;
460 internal event EventHandler EventProcessingFinished
464 if (stageEventProcessingFinishedEventHandler == null)
466 stageEventProcessingFinishedEventCallbackDelegate = OnEventProcessingFinished;
467 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
468 signal.Ensure()?.Connect(stageEventProcessingFinishedEventCallbackDelegate);
470 stageEventProcessingFinishedEventHandler += value;
474 stageEventProcessingFinishedEventHandler -= value;
475 if (stageEventProcessingFinishedEventHandler == null && stageEventProcessingFinishedEventCallbackDelegate != null)
477 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
478 signal.Ensure()?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
479 stageEventProcessingFinishedEventCallbackDelegate = null;
484 internal event EventHandler ContextLost
488 if (stageContextLostEventHandler == null)
490 stageContextLostEventCallbackDelegate = OnContextLost;
491 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
492 signal.Ensure()?.Connect(stageContextLostEventCallbackDelegate);
494 stageContextLostEventHandler += value;
498 stageContextLostEventHandler -= value;
499 if (stageContextLostEventHandler == null && stageContextLostEventCallbackDelegate != null)
501 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
502 signal.Ensure()?.Disconnect(stageContextLostEventCallbackDelegate);
503 stageContextLostEventCallbackDelegate = null;
508 internal event EventHandler ContextRegained
512 if (stageContextRegainedEventHandler == null)
514 stageContextRegainedEventCallbackDelegate = OnContextRegained;
515 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
516 signal.Ensure()?.Connect(stageContextRegainedEventCallbackDelegate);
518 stageContextRegainedEventHandler += value;
522 stageContextRegainedEventHandler -= value;
523 if (stageContextRegainedEventHandler == null && stageContextRegainedEventCallbackDelegate != null)
525 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
526 signal.Ensure()?.Disconnect(stageContextRegainedEventCallbackDelegate);
527 stageContextRegainedEventCallbackDelegate = null;
532 internal event EventHandler SceneCreated
536 if (stageSceneCreatedEventHandler == null)
538 stageSceneCreatedEventCallbackDelegate = OnSceneCreated;
539 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
540 signal.Ensure()?.Connect(stageSceneCreatedEventCallbackDelegate);
542 stageSceneCreatedEventHandler += value;
546 stageSceneCreatedEventHandler -= value;
547 if (stageSceneCreatedEventHandler == null && stageSceneCreatedEventCallbackDelegate != null)
549 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
550 signal.Ensure()?.Disconnect(stageSceneCreatedEventCallbackDelegate);
551 stageSceneCreatedEventCallbackDelegate = null;
556 internal System.IntPtr GetNativeWindowHandler()
558 System.IntPtr ret = Interop.Window.GetNativeWindowHandler(HandleRef.ToIntPtr(this.SwigCPtr));
559 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
564 /// Disconnect all native signals
566 /// <since_tizen> 5 </since_tizen>
567 internal void DisconnectNativeSignals()
569 if (HasBody() == false)
571 NUILog.Debug($"[Dispose] DisConnectFromSignals() No native body! No need to Disconnect Signals!");
575 if (windowFocusChangedEventCallback != null)
577 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
578 signal?.Disconnect(windowFocusChangedEventCallback);
579 windowFocusChangedEventCallback = null;
582 if (rootLayerTouchDataCallback != null)
584 Interop.ActorSignal.TouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerTouchDataCallback.ToHandleRef(this));
585 NDalicPINVOKE.ThrowExceptionIfExists();
586 rootLayerTouchDataCallback = null;
589 if (rootLayerInterceptTouchDataCallback != null)
591 Interop.ActorSignal.InterceptTouchDisconnect(Layer.getCPtr(GetRootLayer()), rootLayerInterceptTouchDataCallback.ToHandleRef(this));
592 NDalicPINVOKE.ThrowExceptionIfExists();
593 rootLayerInterceptTouchDataCallback = null;
596 if (wheelEventCallback != null)
598 Interop.ActorSignal.WheelEventDisconnect(Layer.getCPtr(GetRootLayer()), wheelEventCallback.ToHandleRef(this));
599 NDalicPINVOKE.ThrowExceptionIfExists();
600 wheelEventCallback = null;
603 if (DetentEventCallback != null)
605 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
606 signal?.Disconnect(DetentEventCallback);
607 DetentEventCallback = null;
610 if (stageKeyCallbackDelegate != null)
612 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(GetBaseHandleCPtrHandleRef), false);
613 signal?.Disconnect(stageKeyCallbackDelegate);
614 stageKeyCallbackDelegate = null;
617 if (stageInterceptKeyCallbackDelegate != null)
619 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(GetBaseHandleCPtrHandleRef), false);
620 signal?.Disconnect(stageInterceptKeyCallbackDelegate);
621 stageInterceptKeyCallbackDelegate = null;
624 if (stageEventProcessingFinishedEventCallbackDelegate != null)
626 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
627 signal?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
628 stageEventProcessingFinishedEventCallbackDelegate = null;
631 if (stageContextLostEventCallbackDelegate != null)
633 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
634 signal?.Disconnect(stageContextLostEventCallbackDelegate);
635 stageContextLostEventCallbackDelegate = null;
638 if (stageContextRegainedEventCallbackDelegate != null)
640 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
641 signal?.Disconnect(stageContextRegainedEventCallbackDelegate);
642 stageContextRegainedEventCallbackDelegate = null;
645 if (stageSceneCreatedEventCallbackDelegate != null)
647 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
648 signal?.Disconnect(stageSceneCreatedEventCallbackDelegate);
649 stageSceneCreatedEventCallbackDelegate = null;
652 if (windowResizeEventCallback != null)
654 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(GetBaseHandleCPtrHandleRef), false);
655 signal?.Disconnect(windowResizeEventCallback);
656 windowResizeEventCallback = null;
659 if (windowFocusChangedEventCallback2 != null)
661 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
662 signal?.Disconnect(windowFocusChangedEventCallback2);
663 windowFocusChangedEventCallback2 = null;
666 if (transitionEffectEventCallback != null)
668 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
669 signal?.Disconnect(transitionEffectEventCallback);
670 transitionEffectEventCallback = null;
673 if (movedEventCallback != null)
675 using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
676 signal?.Disconnect(movedEventCallback);
677 movedEventCallback = null;
680 if (orientationChangedEventCallback != null)
682 using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
683 signal?.Disconnect(orientationChangedEventCallback);
684 orientationChangedEventCallback = null;
687 if (keyboardRepeatSettingsChangedEventCallback != null)
689 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
690 signal?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
691 keyboardRepeatSettingsChangedEventCallback = null;
694 if (auxiliaryMessageEventCallback != null)
696 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(GetBaseHandleCPtrHandleRef), false);
697 signal?.Disconnect(auxiliaryMessageEventCallback);
698 auxiliaryMessageEventCallback = null;
701 if (AccessibilityHighlightEventCallback != null)
703 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
704 signal?.Disconnect(AccessibilityHighlightEventCallback);
705 AccessibilityHighlightEventCallback = null;
709 private void OnWindowFocusedChanged(IntPtr window, bool focusGained)
711 if (window == IntPtr.Zero)
713 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
717 if (windowFocusChangedEventHandler != null)
719 FocusChangedEventArgs e = new FocusChangedEventArgs();
720 e.FocusGained = focusGained;
721 windowFocusChangedEventHandler(this, e);
725 private bool OnWindowTouch(IntPtr view, IntPtr touchData)
727 if (touchData == global::System.IntPtr.Zero)
729 NUILog.Error("touchData should not be null!");
733 if (rootLayerTouchDataEventHandler != null)
735 TouchEventArgs e = new TouchEventArgs();
736 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
737 rootLayerTouchDataEventHandler(this, e);
742 private bool OnWindowInterceptTouch(IntPtr view, IntPtr touchData)
744 if (touchData == global::System.IntPtr.Zero)
746 NUILog.Error("touchData should not be null!");
750 bool consumed = false;
751 if (rootLayerInterceptTouchDataEventHandler != null)
753 TouchEventArgs e = new TouchEventArgs();
754 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
755 consumed = rootLayerInterceptTouchDataEventHandler(this, e);
760 private bool OnStageWheel(IntPtr rootLayer, IntPtr wheelEvent)
762 if (wheelEvent == global::System.IntPtr.Zero)
764 NUILog.Error("wheelEvent should not be null!");
768 if (stageWheelHandler != null)
770 WheelEventArgs e = new WheelEventArgs();
771 e.Wheel = Tizen.NUI.Wheel.GetWheelFromPtr(wheelEvent);
772 stageWheelHandler(this, e);
777 // Callback for Stage KeyEventsignal
778 private void OnStageKey(IntPtr data)
780 if (stageKeyHandler != null)
782 KeyEventArgs e = new KeyEventArgs();
783 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
784 //here we send all data to user event handlers
785 stageKeyHandler(this, e);
789 // Callback for Stage InterceptKeyEventsignal
790 private bool OnStageInterceptKey(IntPtr data)
792 bool consumed = false;
793 if (stageInterceptKeyHandler != null)
795 KeyEventArgs e = new KeyEventArgs();
796 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
797 //here we send all data to user event handlers
798 consumed = stageInterceptKeyHandler(this, e);
803 // Callback for Stage EventProcessingFinishedSignal
804 private void OnEventProcessingFinished()
806 stageEventProcessingFinishedEventHandler?.Invoke(this, null);
809 // Callback for Stage ContextLostSignal
810 private void OnContextLost()
812 stageContextLostEventHandler?.Invoke(this, null);
815 // Callback for Stage ContextRegainedSignal
816 private void OnContextRegained()
818 stageContextRegainedEventHandler?.Invoke(this, null);
821 // Callback for Stage SceneCreatedSignal
822 private void OnSceneCreated()
824 stageSceneCreatedEventHandler?.Invoke(this, null);
827 private void OnResized(IntPtr window, IntPtr windowSize)
829 if (window == IntPtr.Zero)
831 NUILog.Error("OnResized() Window is null! Do nothing!");
835 if (windowResizeEventHandler != null)
837 ResizedEventArgs e = new ResizedEventArgs();
838 // var val = new Uint16Pair(windowSize, false);
839 // e.WindowSize = new Size2D(val.GetWidth(), val.GetHeight());
842 // Workaround : windowSize should be valid pointer from dali,
843 // but currently it is fixed and is not Uint16Pair class.
844 // will be fixed later.
845 e.WindowSize = this.WindowSize;
846 windowResizeEventHandler(this, e);
850 private void OnWindowFocusedChanged2(IntPtr window, bool focusGained)
852 if (window == IntPtr.Zero)
854 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
858 if (windowFocusChangedEventHandler2 != null)
860 FocusChangedEventArgs e = new FocusChangedEventArgs();
861 e.FocusGained = focusGained;
862 windowFocusChangedEventHandler2(this, e);
866 private void OnTransitionEffect(IntPtr window, int state, int type)
868 if (window == global::System.IntPtr.Zero)
873 if (transitionEffectHandler != null)
875 TransitionEffectEventArgs e = new TransitionEffectEventArgs();
876 e.State = (EffectState)state;
877 e.Type = (EffectType)type;
878 transitionEffectHandler(this, e);
883 private void OnMoved(IntPtr window, IntPtr position)
885 if (window == global::System.IntPtr.Zero)
890 if (movedHandler != null)
892 WindowMovedEventArgs e = new WindowMovedEventArgs();
893 e.WindowPosition = this.WindowPosition;
894 movedHandler(this, e);
899 private void OnOrientationChanged(IntPtr window, int orientation)
901 if (window == global::System.IntPtr.Zero)
906 if (orientationChangedHandler != null)
908 WindowOrientationChangedEventArgs e = new WindowOrientationChangedEventArgs();
909 e.WindowOrientation = (WindowOrientation)orientation;
910 orientationChangedHandler(this, e);
915 private void OnKeyboardRepeatSettingsChanged()
917 keyboardRepeatSettingsChangedHandler?.Invoke(this, null);
922 /// The focus changed event argument.
924 /// <since_tizen> 3 </since_tizen>
925 public class FocusChangedEventArgs : EventArgs
928 /// FocusGained flag.
930 /// <since_tizen> 3 </since_tizen>
931 public bool FocusGained
939 /// The touch event argument.
941 /// <since_tizen> 3 </since_tizen>
942 public class TouchEventArgs : EventArgs
949 /// <since_tizen> 3 </since_tizen>
964 /// Wheel event arguments.
966 /// <since_tizen> 3 </since_tizen>
967 public class WheelEventArgs : EventArgs
974 /// <since_tizen> 3 </since_tizen>
989 /// Key event arguments.
991 /// <since_tizen> 3 </since_tizen>
992 public class KeyEventArgs : EventArgs
999 /// <since_tizen> 3 </since_tizen>
1014 /// Feeds a key event into the window.
1015 /// This resized event arguments.
1017 /// <since_tizen> 3 </since_tizen>
1018 public class ResizedEventArgs : EventArgs
1023 /// This window size.
1025 /// <since_tizen> 4 </since_tizen>
1026 public Size2D WindowSize
1040 /// Do not use this, that will be deprecated.
1042 /// <since_tizen> 3 </since_tizen>
1043 [Obsolete("Do not use this, that will be deprecated. Use FocusChangedEventArgs instead. " +
1045 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
1046 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
1047 [EditorBrowsable(EditorBrowsableState.Never)]
1048 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
1049 public class WindowFocusChangedEventArgs : EventArgs
1052 /// Do not use this, that will be deprecated.
1054 /// <since_tizen> 3 </since_tizen>
1055 public bool FocusGained
1063 /// Contains and encapsulates Native Window handle.
1065 /// <since_tizen> 4 </since_tizen>
1066 [Obsolete("This has been deprecated in API9 and will be removed in API11. Use Window.NativeHandle instead.")]
1067 public class SafeNativeWindowHandle : SafeHandle
1070 ///Constructor, Native window handle is set to handle.
1072 /// <since_tizen> 4 </since_tizen>
1073 public SafeNativeWindowHandle() : base(IntPtr.Zero, false)
1075 SetHandle(NUIApplication.GetDefaultWindow().GetNativeWindowHandler());
1078 /// Null check if the handle is valid or not.
1080 /// <since_tizen> 4 </since_tizen>
1081 public override bool IsInvalid
1085 return this.handle == IntPtr.Zero;
1089 /// Release handle itself.
1091 /// <returns>true when released successfully.</returns>
1092 /// <since_tizen> 4 </since_tizen>
1093 protected override bool ReleaseHandle()
1100 /// TransitionEffectArgs
1102 [EditorBrowsable(EditorBrowsableState.Never)]
1103 public class TransitionEffectEventArgs : EventArgs
1105 private EffectState state;
1106 private EffectType type;
1111 [EditorBrowsable(EditorBrowsableState.Never)]
1112 public EffectState State
1126 [EditorBrowsable(EditorBrowsableState.Never)]
1127 public EffectType Type
1140 private EventHandler<WheelEventArgs> DetentEventHandler;
1142 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1143 private delegate void DetentEventCallbackType(IntPtr arg1);
1145 private DetentEventCallbackType DetentEventCallback;
1147 private void OnDetentEvent(IntPtr wheelEvent)
1149 WheelEventArgs e = new WheelEventArgs();
1151 if (wheelEvent != global::System.IntPtr.Zero)
1153 e.Wheel = Wheel.GetWheelFromPtr(wheelEvent);
1156 DetentEventHandler?.Invoke(this, e);
1160 /// VisibilityChangedArgs
1162 [EditorBrowsable(EditorBrowsableState.Never)]
1163 public class VisibilityChangedEventArgs : EventArgs
1165 private bool visibility;
1169 [EditorBrowsable(EditorBrowsableState.Never)]
1170 public bool Visibility
1180 private void OnVisibilityChanged(IntPtr window, bool visibility)
1182 if (window == global::System.IntPtr.Zero)
1184 NUILog.Error("[ERR] OnVisibilityChanged() window is null");
1188 VisibilityChangedEventArgs e = new VisibilityChangedEventArgs();
1189 e.Visibility = visibility;
1190 if (VisibilityChangedEventHandler != null)
1192 VisibilityChangedEventHandler.Invoke(this, e);
1196 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1197 private delegate void VisibilityChangedEventCallbackType(IntPtr window, bool visibility);
1198 private VisibilityChangedEventCallbackType VisibilityChangedEventCallback;
1199 private event EventHandler<VisibilityChangedEventArgs> VisibilityChangedEventHandler;
1200 private WindowVisibilityChangedEvent VisibilityChangedEventSignal;
1205 [EditorBrowsable(EditorBrowsableState.Never)]
1206 public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged
1210 if (VisibilityChangedEventHandler == null)
1212 VisibilityChangedEventCallback = OnVisibilityChanged;
1213 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1214 signal.Ensure()?.Connect(VisibilityChangedEventCallback);
1216 VisibilityChangedEventHandler += value;
1220 VisibilityChangedEventHandler -= value;
1221 if (VisibilityChangedEventHandler == null && VisibilityChangedEventCallback != null)
1223 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1224 signal.Ensure()?.Disconnect(VisibilityChangedEventCallback);
1225 VisibilityChangedEventCallback = null;
1231 /// VisibiltyChangedSignalEmit
1233 [EditorBrowsable(EditorBrowsableState.Never)]
1234 public void VisibiltyChangedSignalEmit(bool visibility)
1236 if (VisibilityChangedEventSignal == null)
1238 VisibilityChangedEventSignal = new WindowVisibilityChangedEvent(this);
1240 VisibilityChangedEventSignal.Emit(this, visibility);
1243 private void OnAuxiliaryMessage(IntPtr kData, IntPtr vData, IntPtr optionsArray)
1245 if (kData == IntPtr.Zero || vData == IntPtr.Zero)
1250 using var tmp = new PropertyArray(optionsArray, false);
1251 var size = tmp.Size();
1253 List<string> tmpList = new List<string>();
1255 for (int i = 0; i < size; i++)
1257 string option = "none";
1258 tmp.GetElementAt((uint)i).Get(out option);
1259 tmpList.Add(option);
1264 AuxiliaryMessageEventArgs e = new AuxiliaryMessageEventArgs();
1265 e.Key = StringToVoidSignal.GetResult(kData);
1266 e.Value = StringToVoidSignal.GetResult(vData); ;
1267 e.Options = tmpList;
1269 auxiliaryMessageEventHandler?.Invoke(this, e);
1273 /// Auxiliary message is sent by displayer server when window's auxiliary was changed then display server sent the message.
1274 /// When client application added the window's auxiliary hint and if the auxiliary is changed,
1275 /// display server send the auxiliary message.
1276 /// Auxiliary message has the key, value and options.
1278 [EditorBrowsable(EditorBrowsableState.Never)]
1279 public event EventHandler<AuxiliaryMessageEventArgs> AuxiliaryMessage
1283 if (auxiliaryMessageEventHandler == null)
1285 auxiliaryMessageEventCallback = OnAuxiliaryMessage;
1286 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1287 signal.Ensure()?.Connect(auxiliaryMessageEventCallback);
1289 auxiliaryMessageEventHandler += value;
1293 auxiliaryMessageEventHandler -= value;
1294 if (auxiliaryMessageEventHandler == null && auxiliaryMessageEventCallback != null)
1296 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1297 signal.Ensure()?.Disconnect(auxiliaryMessageEventCallback);
1298 auxiliaryMessageEventCallback = null;
1304 /// AccessibilityHighlightArgs
1306 [EditorBrowsable(EditorBrowsableState.Never)]
1307 public class AccessibilityHighlightEventArgs : EventArgs
1309 private bool accessibilityHighlight;
1311 /// accessibilityHighlight
1313 [EditorBrowsable(EditorBrowsableState.Never)]
1314 public bool AccessibilityHighlight
1316 get => accessibilityHighlight;
1319 accessibilityHighlight = value;
1324 private void OnAccessibilityHighlight(IntPtr window, bool highlight)
1326 if (window == global::System.IntPtr.Zero)
1328 NUILog.Error("[ERR] OnAccessibilityHighlight() window is null");
1332 AccessibilityHighlightEventArgs e = new AccessibilityHighlightEventArgs();
1333 e.AccessibilityHighlight = highlight;
1334 if (AccessibilityHighlightEventHandler != null)
1336 AccessibilityHighlightEventHandler.Invoke(this, e);
1340 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1341 private delegate void AccessibilityHighlightEventCallbackType(IntPtr window, bool highlight);
1342 private AccessibilityHighlightEventCallbackType AccessibilityHighlightEventCallback;
1343 private event EventHandler<AccessibilityHighlightEventArgs> AccessibilityHighlightEventHandler;
1346 /// Emits the event when the window needs to grab or clear highlight.
1348 [EditorBrowsable(EditorBrowsableState.Never)]
1349 public event EventHandler<AccessibilityHighlightEventArgs> AccessibilityHighlight
1353 if (AccessibilityHighlightEventHandler == null)
1355 AccessibilityHighlightEventCallback = OnAccessibilityHighlight;
1356 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
1357 signal.Ensure()?.Connect(AccessibilityHighlightEventCallback);
1359 AccessibilityHighlightEventHandler += value;
1363 AccessibilityHighlightEventHandler -= value;
1364 if (AccessibilityHighlightEventHandler == null && AccessibilityHighlightEventCallback != null)
1366 using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
1367 signal.Ensure()?.Disconnect(AccessibilityHighlightEventCallback);
1368 AccessibilityHighlightEventCallback = null;
1377 [EditorBrowsable(EditorBrowsableState.Never)]
1378 public class WindowMovedEventArgs : EventArgs
1380 private Position2D position;
1382 [EditorBrowsable(EditorBrowsableState.Never)]
1383 public Position2D WindowPosition
1397 /// OrientationChangedArgs
1399 [EditorBrowsable(EditorBrowsableState.Never)]
1400 public class WindowOrientationChangedEventArgs : EventArgs
1402 private Window.WindowOrientation orientation;
1404 [EditorBrowsable(EditorBrowsableState.Never)]
1405 public Window.WindowOrientation WindowOrientation
1413 orientation = value;