2 * Copyright(c) 2021 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 WindowTransitionEffectSignal transitionEffectSignal;
50 private KeyboardRepeatSettingsChangedEventCallbackType keyboardRepeatSettingsChangedEventCallback;
51 private KeyboardRepeatSettingsChangedSignal keyboardRepeatSettingsChangedSignal;
52 private KeyEventSignal interceptKeyEventSignal;
53 private AuxiliaryMessageEventCallbackType auxiliaryMessageEventCallback;
55 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
56 private delegate void WindowFocusChangedEventCallbackType(IntPtr window, bool focusGained);
57 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
58 private delegate bool RootLayerTouchDataCallbackType(IntPtr view, IntPtr touchData);
59 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
60 private delegate bool WheelEventCallbackType(IntPtr view, IntPtr wheelEvent);
61 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
62 private delegate void WindowResizeEventCallbackType(IntPtr window, IntPtr windowSize);
63 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
64 private delegate void WindowFocusChangedEventCallbackType2(IntPtr window, bool focusGained);
65 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
66 private delegate void TransitionEffectEventCallbackType(IntPtr window, int state, int type);
67 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
68 private delegate void KeyboardRepeatSettingsChangedEventCallbackType();
69 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
70 private delegate void AuxiliaryMessageEventCallbackType(IntPtr kData, IntPtr vData, IntPtr optionsArray);
71 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
72 private delegate bool InterceptKeyEventDelegateType(IntPtr arg1);
75 /// FocusChanged event.
77 /// <since_tizen> 3 </since_tizen>
78 public event EventHandler<FocusChangedEventArgs> FocusChanged
82 if (windowFocusChangedEventHandler == null)
84 windowFocusChangedEventCallback = OnWindowFocusedChanged;
85 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
86 signal?.Connect(windowFocusChangedEventCallback);
88 windowFocusChangedEventHandler += value;
92 windowFocusChangedEventHandler -= value;
93 if (windowFocusChangedEventHandler == null && windowFocusChangedEventCallback != null)
95 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
96 signal?.Disconnect(windowFocusChangedEventCallback);
97 if (signal?.Empty() == true)
99 windowFocusChangedEventCallback = null;
106 /// Emits the event when the screen is touched and when the touch ends.<br />
107 /// If there are multiple touch points then it is emitted when the first touch occurs and
108 /// when the last finger is lifted too.<br />
109 /// Even though incoming events are interrupted, the event occurs.<br />
111 /// <since_tizen> 3 </since_tizen>
112 public event EventHandler<TouchEventArgs> TouchEvent
116 if (rootLayerTouchDataEventHandler == null)
118 rootLayerTouchDataCallback = OnWindowTouch;
119 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(Layer.getCPtr(GetRootLayer())), false);
120 signal?.Connect(rootLayerTouchDataCallback);
122 rootLayerTouchDataEventHandler += value;
126 rootLayerTouchDataEventHandler -= value;
127 if (rootLayerTouchDataEventHandler == null && rootLayerTouchDataCallback != null)
129 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(Layer.getCPtr(GetRootLayer())), false);
130 signal?.Disconnect(rootLayerTouchDataCallback);
131 if (signal?.Empty() == true)
133 rootLayerTouchDataCallback = null;
140 /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
141 /// The touched signal is emitted when the touch input is received.<br />
142 /// This can receive touch events before child. <br />
143 /// 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 />
145 [EditorBrowsable(EditorBrowsableState.Never)]
146 public event ReturnTypeEventHandler<object, TouchEventArgs, bool> InterceptTouchEvent
150 if (rootLayerInterceptTouchDataEventHandler == null)
152 rootLayerInterceptTouchDataCallback = OnWindowInterceptTouch;
153 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(Layer.getCPtr(GetRootLayer())), false);
154 signal?.Connect(rootLayerInterceptTouchDataCallback);
156 rootLayerInterceptTouchDataEventHandler += value;
160 rootLayerInterceptTouchDataEventHandler -= value;
161 if (rootLayerInterceptTouchDataEventHandler == null && rootLayerInterceptTouchDataCallback != null)
163 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(Layer.getCPtr(GetRootLayer())), false);
164 signal?.Disconnect(rootLayerInterceptTouchDataCallback);
165 if (signal?.Empty() == true)
167 rootLayerInterceptTouchDataCallback = null;
174 /// Emits the event when the wheel event is received.
176 /// <since_tizen> 3 </since_tizen>
177 public event EventHandler<WheelEventArgs> WheelEvent
181 if (stageWheelHandler == null)
183 wheelEventCallback = OnStageWheel;
184 using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(Layer.getCPtr(this.GetRootLayer())), false);
185 signal?.Connect(wheelEventCallback);
187 stageWheelHandler += value;
189 if (DetentEventHandler == null)
191 DetentEventCallback = OnDetentEvent;
192 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
193 signal?.Connect(DetentEventCallback);
195 DetentEventHandler += value;
199 stageWheelHandler -= value;
200 if (stageWheelHandler == null && wheelEventCallback != null)
202 using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(Layer.getCPtr(this.GetRootLayer())), false);
203 signal?.Disconnect(wheelEventCallback);
204 if (signal?.Empty() == true)
206 wheelEventCallback = null;
210 DetentEventHandler -= value;
211 if (DetentEventHandler == null && DetentEventCallback != null)
213 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
214 signal?.Disconnect(DetentEventCallback);
215 if (signal?.Empty() == true)
217 DetentEventCallback = null;
224 /// Emits the event when the key event is received.
226 /// <since_tizen> 3 </since_tizen>
227 public event EventHandler<KeyEventArgs> KeyEvent
231 if (stageKeyHandler == null)
233 stageKeyCallbackDelegate = OnStageKey;
234 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
235 signal?.Connect(stageKeyCallbackDelegate);
237 stageKeyHandler += value;
241 stageKeyHandler -= value;
242 if (stageKeyHandler == null && stageKeyCallbackDelegate != null)
244 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
245 signal?.Disconnect(stageKeyCallbackDelegate);
246 if (signal?.Empty() == true)
248 stageKeyCallbackDelegate = null;
255 /// Intercepts KeyEvents in the window before dispatching KeyEvents to the child.<br />
256 /// If it returns true(consumed), no KeyEvent is delivered to the child.
258 [EditorBrowsable(EditorBrowsableState.Never)]
259 public event ReturnTypeEventHandler<object, KeyEventArgs, bool> InterceptKeyEvent
263 if (stageInterceptKeyHandler == null)
265 stageInterceptKeyCallbackDelegate = OnStageInterceptKey;
266 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
267 signal?.Connect(stageInterceptKeyCallbackDelegate);
269 stageInterceptKeyHandler += value;
273 stageInterceptKeyHandler -= value;
274 if (stageInterceptKeyHandler == null && stageInterceptKeyCallbackDelegate != null)
276 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
277 signal?.Disconnect(stageInterceptKeyCallbackDelegate);
278 if (signal?.Empty() == true)
280 stageInterceptKeyCallbackDelegate = null;
287 /// Emits the event when the window resized.
289 /// <since_tizen> 3 </since_tizen>
290 public event EventHandler<ResizedEventArgs> Resized
294 if (windowResizeEventHandler == null)
296 windowResizeEventCallback = OnResized;
297 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
298 signal?.Connect(windowResizeEventCallback);
301 windowResizeEventHandler += value;
305 windowResizeEventHandler -= value;
306 if (windowResizeEventHandler == null && windowResizeEventCallback != null)
308 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
309 signal?.Disconnect(windowResizeEventCallback);
310 if (signal?.Empty() == true)
312 windowResizeEventCallback = null;
319 /// Do not use this, that will be deprecated. Use 'FocusChanged' event instead.
321 /// <since_tizen> 3 </since_tizen>
322 /// Do not use this, that will be deprecated.
323 /// Instead Use FocusChanged.
324 [Obsolete("Do not use this, that will be deprecated. Use FocusChanged instead. " +
326 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
327 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
328 [EditorBrowsable(EditorBrowsableState.Never)]
329 public event EventHandler<FocusChangedEventArgs> WindowFocusChanged
333 if (windowFocusChangedEventHandler2 == null)
335 windowFocusChangedEventCallback2 = OnWindowFocusedChanged2;
336 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
337 signal?.Connect(windowFocusChangedEventCallback2);
339 windowFocusChangedEventHandler2 += value;
343 windowFocusChangedEventHandler2 -= value;
344 if (windowFocusChangedEventHandler2 == null && windowFocusChangedEventCallback2 != null)
346 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
347 signal?.Disconnect(windowFocusChangedEventCallback2);
348 if (signal?.Empty() == true)
350 windowFocusChangedEventCallback2 = null;
359 [EditorBrowsable(EditorBrowsableState.Never)]
360 public event EventHandler<TransitionEffectEventArgs> TransitionEffect
364 if (transitionEffectHandler == null)
366 transitionEffectEventCallback = OnTransitionEffect;
367 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
368 signal?.Connect(transitionEffectEventCallback);
370 transitionEffectHandler += value;
374 transitionEffectHandler -= value;
375 if (transitionEffectHandler == null && transitionEffectEventCallback != null)
377 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
378 signal?.Disconnect(transitionEffectEventCallback);
379 if (signal?.Empty() == true)
381 transitionEffectEventCallback = null;
388 /// Keyboard Repeat Settings Changed
390 [EditorBrowsable(EditorBrowsableState.Never)]
391 public event EventHandler KeyboardRepeatSettingsChanged
395 if (keyboardRepeatSettingsChangedHandler == null)
397 keyboardRepeatSettingsChangedEventCallback = OnKeyboardRepeatSettingsChanged;
398 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
399 signal?.Connect(keyboardRepeatSettingsChangedEventCallback);
401 keyboardRepeatSettingsChangedHandler += value;
405 keyboardRepeatSettingsChangedHandler -= value;
406 if (keyboardRepeatSettingsChangedHandler == null && keyboardRepeatSettingsChangedEventCallback != null)
408 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
409 signal?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
410 if (signal?.Empty() == true)
412 keyboardRepeatSettingsChangedEventCallback = null;
419 /// ViewAdded will be triggered when the view added on Window
421 /// <since_tizen> 6 </since_tizen>
422 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
423 [EditorBrowsable(EditorBrowsableState.Never)]
424 public event EventHandler ViewAdded;
425 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler;
426 private event EventHandler<TouchEventArgs> rootLayerTouchDataEventHandler;
427 private ReturnTypeEventHandler<object, TouchEventArgs, bool> rootLayerInterceptTouchDataEventHandler;
428 private event EventHandler<WheelEventArgs> stageWheelHandler;
429 private event EventHandler<KeyEventArgs> stageKeyHandler;
430 private ReturnTypeEventHandler<object, KeyEventArgs, bool> stageInterceptKeyHandler;
431 private event EventHandler stageEventProcessingFinishedEventHandler;
432 private event EventHandler<ResizedEventArgs> windowResizeEventHandler;
433 private event EventHandler<FocusChangedEventArgs> windowFocusChangedEventHandler2;
434 private event EventHandler<TransitionEffectEventArgs> transitionEffectHandler;
435 private event EventHandler keyboardRepeatSettingsChangedHandler;
436 private event EventHandler<AuxiliaryMessageEventArgs> auxiliaryMessageEventHandler;
438 internal void SendViewAdded(View view)
440 ViewAdded?.Invoke(view, EventArgs.Empty);
443 internal event EventHandler EventProcessingFinished
447 if (stageEventProcessingFinishedEventHandler == null)
449 stageEventProcessingFinishedEventCallbackDelegate = OnEventProcessingFinished;
450 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
451 signal?.Connect(stageEventProcessingFinishedEventCallbackDelegate);
453 stageEventProcessingFinishedEventHandler += value;
457 stageEventProcessingFinishedEventHandler -= value;
458 if (stageEventProcessingFinishedEventHandler == null && stageEventProcessingFinishedEventCallbackDelegate != null)
460 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
461 signal?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
462 if (signal?.Empty() == true)
464 stageEventProcessingFinishedEventCallbackDelegate = null;
470 internal event EventHandler ContextLost
474 if (stageContextLostEventHandler == null)
476 stageContextLostEventCallbackDelegate = OnContextLost;
477 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
478 signal?.Connect(stageContextLostEventCallbackDelegate);
480 stageContextLostEventHandler += value;
484 stageContextLostEventHandler -= value;
485 if (stageContextLostEventHandler == null && stageContextLostEventCallbackDelegate != null)
487 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
488 signal?.Disconnect(stageContextLostEventCallbackDelegate);
489 if (signal?.Empty() == true)
491 stageContextLostEventCallbackDelegate = null;
497 internal event EventHandler ContextRegained
501 if (stageContextRegainedEventHandler == null)
503 stageContextRegainedEventCallbackDelegate = OnContextRegained;
504 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
505 signal?.Connect(stageContextRegainedEventCallbackDelegate);
507 stageContextRegainedEventHandler += value;
511 stageContextRegainedEventHandler -= value;
512 if (stageContextRegainedEventHandler == null && stageContextRegainedEventCallbackDelegate != null)
514 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
515 signal?.Disconnect(stageContextRegainedEventCallbackDelegate);
516 if (signal?.Empty() == true)
518 stageContextRegainedEventCallbackDelegate = null;
524 internal event EventHandler SceneCreated
528 if (stageSceneCreatedEventHandler == null)
530 stageSceneCreatedEventCallbackDelegate = OnSceneCreated;
531 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
532 signal?.Connect(stageSceneCreatedEventCallbackDelegate);
534 stageSceneCreatedEventHandler += value;
538 stageSceneCreatedEventHandler -= value;
539 if (stageSceneCreatedEventHandler == null && stageSceneCreatedEventCallbackDelegate != null)
541 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
542 signal?.Disconnect(stageSceneCreatedEventCallbackDelegate);
543 if (signal?.Empty() == true)
545 stageSceneCreatedEventCallbackDelegate = null;
551 internal System.IntPtr GetNativeWindowHandler()
553 System.IntPtr ret = Interop.Window.GetNativeWindowHandler(HandleRef.ToIntPtr(this.SwigCPtr));
554 if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
559 /// Disconnect all native signals
561 /// <since_tizen> 5 </since_tizen>
562 internal void DisconnectNativeSignals()
564 if (HasBody() == false)
566 NUILog.Debug($"[Dispose] DisConnectFromSignals() No native body! No need to Disconnect Signals!");
570 if (windowFocusChangedEventCallback != null)
572 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
573 signal?.Disconnect(windowFocusChangedEventCallback);
574 windowFocusChangedEventCallback = null;
577 if (rootLayerTouchDataCallback != null)
579 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(Layer.getCPtr(GetRootLayer())), false);
580 signal?.Disconnect(rootLayerTouchDataCallback);
581 rootLayerTouchDataCallback = null;
584 if (rootLayerInterceptTouchDataCallback != null)
586 using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(Layer.getCPtr(GetRootLayer())), false);
587 signal?.Disconnect(rootLayerInterceptTouchDataCallback);
588 rootLayerInterceptTouchDataCallback = null;
591 if (wheelEventCallback != null)
593 using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(Layer.getCPtr(this.GetRootLayer())), false);
594 signal?.Disconnect(wheelEventCallback);
595 wheelEventCallback = null;
598 if (DetentEventCallback != null)
600 using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
601 signal?.Disconnect(DetentEventCallback);
602 DetentEventCallback = null;
605 if (stageKeyCallbackDelegate != null)
607 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(GetBaseHandleCPtrHandleRef), false);
608 signal?.Disconnect(stageKeyCallbackDelegate);
609 stageKeyCallbackDelegate = null;
612 if (stageInterceptKeyCallbackDelegate != null)
614 using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(GetBaseHandleCPtrHandleRef), false);
615 signal?.Disconnect(stageInterceptKeyCallbackDelegate);
616 stageInterceptKeyCallbackDelegate = null;
619 if (stageEventProcessingFinishedEventCallbackDelegate != null)
621 using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
622 signal?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
623 stageEventProcessingFinishedEventCallbackDelegate = null;
626 if (stageContextLostEventCallbackDelegate != null)
628 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
629 signal?.Disconnect(stageContextLostEventCallbackDelegate);
630 stageContextLostEventCallbackDelegate = null;
633 if (stageContextRegainedEventCallbackDelegate != null)
635 using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
636 signal?.Disconnect(stageContextRegainedEventCallbackDelegate);
637 stageContextRegainedEventCallbackDelegate = null;
640 if (stageSceneCreatedEventCallbackDelegate != null)
642 using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
643 signal?.Disconnect(stageSceneCreatedEventCallbackDelegate);
644 stageSceneCreatedEventCallbackDelegate = null;
647 if (windowResizeEventCallback != null)
649 using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(GetBaseHandleCPtrHandleRef), false);
650 signal?.Disconnect(windowResizeEventCallback);
651 windowResizeEventCallback = null;
654 if (windowFocusChangedEventCallback2 != null)
656 using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(GetBaseHandleCPtrHandleRef), false);
657 signal?.Disconnect(windowFocusChangedEventCallback2);
658 windowFocusChangedEventCallback2 = null;
661 if (transitionEffectEventCallback != null)
663 using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
664 signal?.Disconnect(transitionEffectEventCallback);
665 transitionEffectEventCallback = null;
668 if (keyboardRepeatSettingsChangedEventCallback != null)
670 using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(GetBaseHandleCPtrHandleRef), false);
671 signal?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
672 keyboardRepeatSettingsChangedEventCallback = null;
675 if (auxiliaryMessageEventCallback != null)
677 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(GetBaseHandleCPtrHandleRef), false);
678 signal?.Disconnect(auxiliaryMessageEventCallback);
679 auxiliaryMessageEventCallback = null;
683 private void OnWindowFocusedChanged(IntPtr window, bool focusGained)
685 if (window == IntPtr.Zero)
687 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
691 if (windowFocusChangedEventHandler != null)
693 FocusChangedEventArgs e = new FocusChangedEventArgs();
694 e.FocusGained = focusGained;
695 windowFocusChangedEventHandler(this, e);
699 private bool OnWindowTouch(IntPtr view, IntPtr touchData)
701 if (touchData == global::System.IntPtr.Zero)
703 NUILog.Error("touchData should not be null!");
707 if (rootLayerTouchDataEventHandler != null)
709 TouchEventArgs e = new TouchEventArgs();
710 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
711 rootLayerTouchDataEventHandler(this, e);
716 private bool OnWindowInterceptTouch(IntPtr view, IntPtr touchData)
718 if (touchData == global::System.IntPtr.Zero)
720 NUILog.Error("touchData should not be null!");
724 bool consumed = false;
725 if (rootLayerInterceptTouchDataEventHandler != null)
727 TouchEventArgs e = new TouchEventArgs();
728 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
729 consumed = rootLayerInterceptTouchDataEventHandler(this, e);
734 private bool OnStageWheel(IntPtr rootLayer, IntPtr wheelEvent)
736 if (wheelEvent == global::System.IntPtr.Zero)
738 NUILog.Error("wheelEvent should not be null!");
742 if (stageWheelHandler != null)
744 WheelEventArgs e = new WheelEventArgs();
745 e.Wheel = Tizen.NUI.Wheel.GetWheelFromPtr(wheelEvent);
746 stageWheelHandler(this, e);
751 // Callback for Stage KeyEventsignal
752 private void OnStageKey(IntPtr data)
754 if (stageKeyHandler != null)
756 KeyEventArgs e = new KeyEventArgs();
757 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
758 //here we send all data to user event handlers
759 stageKeyHandler(this, e);
763 // Callback for Stage InterceptKeyEventsignal
764 private bool OnStageInterceptKey(IntPtr data)
766 bool consumed = false;
767 if (stageInterceptKeyHandler != null)
769 KeyEventArgs e = new KeyEventArgs();
770 e.Key = Tizen.NUI.Key.GetKeyFromPtr(data);
771 //here we send all data to user event handlers
772 consumed = stageInterceptKeyHandler(this, e);
777 // Callback for Stage EventProcessingFinishedSignal
778 private void OnEventProcessingFinished()
780 stageEventProcessingFinishedEventHandler?.Invoke(this, null);
783 // Callback for Stage ContextLostSignal
784 private void OnContextLost()
786 stageContextLostEventHandler?.Invoke(this, null);
789 // Callback for Stage ContextRegainedSignal
790 private void OnContextRegained()
792 stageContextRegainedEventHandler?.Invoke(this, null);
795 // Callback for Stage SceneCreatedSignal
796 private void OnSceneCreated()
798 stageSceneCreatedEventHandler?.Invoke(this, null);
801 private void OnResized(IntPtr window, IntPtr windowSize)
803 if (window == IntPtr.Zero)
805 NUILog.Error("OnResized() Window is null! Do nothing!");
809 if (windowResizeEventHandler != null)
811 ResizedEventArgs e = new ResizedEventArgs();
812 // var val = new Uint16Pair(windowSize, false);
813 // e.WindowSize = new Size2D(val.GetWidth(), val.GetHeight());
816 // Workaround : windowSize should be valid pointer from dali,
817 // but currently it is fixed and is not Uint16Pair class.
818 // will be fixed later.
819 e.WindowSize = this.WindowSize;
820 windowResizeEventHandler(this, e);
824 private void OnWindowFocusedChanged2(IntPtr window, bool focusGained)
826 if (window == IntPtr.Zero)
828 NUILog.Error("OnWindowFocusedChanged() Window is null! Do nothing!");
832 if (windowFocusChangedEventHandler2 != null)
834 FocusChangedEventArgs e = new FocusChangedEventArgs();
835 e.FocusGained = focusGained;
836 windowFocusChangedEventHandler2(this, e);
840 private void OnTransitionEffect(IntPtr window, int state, int type)
842 if (window == global::System.IntPtr.Zero)
847 if (transitionEffectHandler != null)
849 TransitionEffectEventArgs e = new TransitionEffectEventArgs();
850 e.State = (EffectState)state;
851 e.Type = (EffectType)type;
852 transitionEffectHandler(this, e);
857 private void OnKeyboardRepeatSettingsChanged()
859 keyboardRepeatSettingsChangedHandler?.Invoke(this, null);
864 /// The focus changed event argument.
866 /// <since_tizen> 3 </since_tizen>
867 public class FocusChangedEventArgs : EventArgs
870 /// FocusGained flag.
872 /// <since_tizen> 3 </since_tizen>
873 public bool FocusGained
881 /// The touch event argument.
883 /// <since_tizen> 3 </since_tizen>
884 public class TouchEventArgs : EventArgs
891 /// <since_tizen> 3 </since_tizen>
906 /// Wheel event arguments.
908 /// <since_tizen> 3 </since_tizen>
909 public class WheelEventArgs : EventArgs
916 /// <since_tizen> 3 </since_tizen>
931 /// Key event arguments.
933 /// <since_tizen> 3 </since_tizen>
934 public class KeyEventArgs : EventArgs
941 /// <since_tizen> 3 </since_tizen>
956 /// Feeds a key event into the window.
957 /// This resized event arguments.
959 /// <since_tizen> 3 </since_tizen>
960 public class ResizedEventArgs : EventArgs
965 /// This window size.
967 /// <since_tizen> 4 </since_tizen>
968 public Size2D WindowSize
982 /// Do not use this, that will be deprecated.
984 /// <since_tizen> 3 </since_tizen>
985 [Obsolete("Do not use this, that will be deprecated. Use FocusChangedEventArgs instead. " +
987 "NUIApplication.GetDefaultWindow().FocusChanged = OnFocusChanged; " +
988 "private void OnFocusChanged(object source, Window.FocusChangedEventArgs args) {...}")]
989 [EditorBrowsable(EditorBrowsableState.Never)]
990 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
991 public class WindowFocusChangedEventArgs : EventArgs
994 /// Do not use this, that will be deprecated.
996 /// <since_tizen> 3 </since_tizen>
997 public bool FocusGained
1005 /// Contains and encapsulates Native Window handle.
1007 /// <since_tizen> 4 </since_tizen>
1008 [Obsolete("This has been deprecated in API9 and will be removed in API11. Use Window.NativeHandle instead.")]
1009 public class SafeNativeWindowHandle : SafeHandle
1012 ///Constructor, Native window handle is set to handle.
1014 /// <since_tizen> 4 </since_tizen>
1015 public SafeNativeWindowHandle() : base(IntPtr.Zero, false)
1017 SetHandle(NUIApplication.GetDefaultWindow().GetNativeWindowHandler());
1020 /// Null check if the handle is valid or not.
1022 /// <since_tizen> 4 </since_tizen>
1023 public override bool IsInvalid
1027 return this.handle == IntPtr.Zero;
1031 /// Release handle itself.
1033 /// <returns>true when released successfully.</returns>
1034 /// <since_tizen> 4 </since_tizen>
1035 protected override bool ReleaseHandle()
1042 /// TransitionEffectArgs
1044 [EditorBrowsable(EditorBrowsableState.Never)]
1045 public class TransitionEffectEventArgs : EventArgs
1047 private EffectState state;
1048 private EffectType type;
1053 [EditorBrowsable(EditorBrowsableState.Never)]
1054 public EffectState State
1068 [EditorBrowsable(EditorBrowsableState.Never)]
1069 public EffectType Type
1082 private EventHandler<WheelEventArgs> DetentEventHandler;
1084 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1085 private delegate void DetentEventCallbackType(IntPtr arg1);
1087 private DetentEventCallbackType DetentEventCallback;
1089 private void OnDetentEvent(IntPtr wheelEvent)
1091 WheelEventArgs e = new WheelEventArgs();
1093 if (wheelEvent != global::System.IntPtr.Zero)
1095 e.Wheel = Wheel.GetWheelFromPtr(wheelEvent);
1098 DetentEventHandler?.Invoke(this, e);
1102 /// VisibilityChangedArgs
1104 [EditorBrowsable(EditorBrowsableState.Never)]
1105 public class VisibilityChangedEventArgs : EventArgs
1107 private bool visibility;
1111 [EditorBrowsable(EditorBrowsableState.Never)]
1112 public bool Visibility
1122 private void OnVisibilityChanged(IntPtr window, bool visibility)
1124 if (window == global::System.IntPtr.Zero)
1126 NUILog.Error("[ERR] OnVisibilityChanged() window is null");
1130 VisibilityChangedEventArgs e = new VisibilityChangedEventArgs();
1131 e.Visibility = visibility;
1132 if (VisibilityChangedEventHandler != null)
1134 VisibilityChangedEventHandler.Invoke(this, e);
1138 [UnmanagedFunctionPointer(CallingConvention.StdCall)]
1139 private delegate void VisibilityChangedEventCallbackType(IntPtr window, bool visibility);
1140 private VisibilityChangedEventCallbackType VisibilityChangedEventCallback;
1141 private event EventHandler<VisibilityChangedEventArgs> VisibilityChangedEventHandler;
1142 private WindowVisibilityChangedEvent VisibilityChangedEventSignal;
1147 [EditorBrowsable(EditorBrowsableState.Never)]
1148 public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged
1152 if (VisibilityChangedEventHandler == null)
1154 VisibilityChangedEventCallback = OnVisibilityChanged;
1155 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1156 signal?.Connect(VisibilityChangedEventCallback);
1158 VisibilityChangedEventHandler += value;
1162 VisibilityChangedEventHandler -= value;
1163 if (VisibilityChangedEventHandler == null && VisibilityChangedEventCallback != null)
1165 using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
1166 signal?.Disconnect(VisibilityChangedEventCallback);
1167 if (signal?.Empty() == true)
1169 VisibilityChangedEventCallback = null;
1176 /// VisibiltyChangedSignalEmit
1178 [EditorBrowsable(EditorBrowsableState.Never)]
1179 public void VisibiltyChangedSignalEmit(bool visibility)
1181 if (VisibilityChangedEventSignal == null)
1183 VisibilityChangedEventSignal = new WindowVisibilityChangedEvent(this);
1185 VisibilityChangedEventSignal.Emit(this, visibility);
1188 private void OnAuxiliaryMessage(IntPtr kData, IntPtr vData, IntPtr optionsArray)
1190 if (kData == IntPtr.Zero || vData == IntPtr.Zero)
1195 using var tmp = new PropertyArray(optionsArray, false);
1196 var size = tmp.Size();
1198 List<string> tmpList = new List<string>();
1200 for (int i = 0; i < size; i++)
1202 string option = "none";
1203 tmp.GetElementAt((uint)i).Get(out option);
1204 tmpList.Add(option);
1209 AuxiliaryMessageEventArgs e = new AuxiliaryMessageEventArgs();
1210 e.Key = StringToVoidSignal.GetResult(kData);
1211 e.Value = StringToVoidSignal.GetResult(vData); ;
1212 e.Options = tmpList;
1214 auxiliaryMessageEventHandler?.Invoke(this, e);
1218 /// Auxiliary message is sent by displayer server when window's auxiliary was changed then display server sent the message.
1219 /// When client application added the window's auxiliary hint and if the auxiliary is changed,
1220 /// display server send the auxiliary message.
1221 /// Auxiliary message has the key, value and options.
1223 [EditorBrowsable(EditorBrowsableState.Never)]
1224 public event EventHandler<AuxiliaryMessageEventArgs> AuxiliaryMessage
1228 if (auxiliaryMessageEventHandler == null)
1230 auxiliaryMessageEventCallback = OnAuxiliaryMessage;
1231 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1232 signal?.Connect(auxiliaryMessageEventCallback);
1234 auxiliaryMessageEventHandler += value;
1238 auxiliaryMessageEventHandler -= value;
1239 if (auxiliaryMessageEventHandler == null && auxiliaryMessageEventCallback != null)
1241 using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
1242 signal?.Disconnect(auxiliaryMessageEventCallback);
1243 if (signal?.Empty() == true)
1245 auxiliaryMessageEventCallback = null;