[NUI] Fix signal bugs in View and Window
authorJiyun Yang <ji.yang@samsung.com>
Wed, 29 Mar 2023 10:31:03 +0000 (19:31 +0900)
committerJiyun Yang <ji.yang@samsung.com>
Fri, 31 Mar 2023 03:57:58 +0000 (12:57 +0900)
* Do not try to disconnect callback unless the callback is not null.
* Ensure a signal has valid cptr before calling Connect/Disconnect.

Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
src/Tizen.NUI/src/internal/Common/Disposable.cs
src/Tizen.NUI/src/public/BaseComponents/ViewEvent.cs
src/Tizen.NUI/src/public/Window/WindowEvent.cs

index 453e7d2..7884c30 100644 (file)
@@ -195,4 +195,12 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected internal bool Disposed => disposed;
     }
+
+    internal static class DisposableExtension
+    {
+        internal static T Ensure<T>(this T caller) where T : Disposable
+        {
+            return (caller.SwigCPtr.Handle == System.IntPtr.Zero ? null : caller);
+        }
+    }
 }
index 24ff8ab..6b8c9d4 100755 (executable)
@@ -113,7 +113,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     keyInputFocusGainedCallback = OnKeyInputFocusGained;
                     using KeyInputFocusSignal signal = new KeyInputFocusSignal(Interop.ViewSignal.KeyInputFocusGainedSignal(SwigCPtr), false);
-                    signal?.Connect(keyInputFocusGainedCallback);
+                    signal.Ensure()?.Connect(keyInputFocusGainedCallback);
                 }
                 keyInputFocusGainedEventHandler += value;
             }
@@ -121,18 +121,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 keyInputFocusGainedEventHandler -= value;
-                if (keyInputFocusGainedEventHandler == null)
+                if (keyInputFocusGainedEventHandler == null && keyInputFocusGainedCallback != null)
                 {
                     using KeyInputFocusSignal signal = new KeyInputFocusSignal(Interop.ViewSignal.KeyInputFocusGainedSignal(SwigCPtr), false);
-
-                    if (keyInputFocusGainedCallback != null)
-                    {
-                        signal?.Disconnect(keyInputFocusGainedCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            keyInputFocusGainedCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(keyInputFocusGainedCallback);
+                    keyInputFocusGainedCallback = null;
                 }
             }
         }
@@ -150,7 +143,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     keyInputFocusLostCallback = OnKeyInputFocusLost;
                     using KeyInputFocusSignal signal = new KeyInputFocusSignal(Interop.ViewSignal.KeyInputFocusLostSignal(SwigCPtr), false);
-                    signal?.Connect(keyInputFocusLostCallback);
+                    signal.Ensure()?.Connect(keyInputFocusLostCallback);
                 }
                 keyInputFocusLostEventHandler += value;
             }
@@ -158,18 +151,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 keyInputFocusLostEventHandler -= value;
-                if (keyInputFocusLostEventHandler == null)
+                if (keyInputFocusLostEventHandler == null && keyInputFocusLostCallback != null)
                 {
                     using KeyInputFocusSignal signal = new KeyInputFocusSignal(Interop.ViewSignal.KeyInputFocusLostSignal(SwigCPtr), false);
-
-                    if (keyInputFocusLostCallback != null)
-                    {
-                        signal?.Disconnect(keyInputFocusLostCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            keyInputFocusLostCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(keyInputFocusLostCallback);
+                    keyInputFocusLostCallback = null;
                 }
             }
         }
@@ -187,7 +173,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     keyCallback = OnKeyEvent;
                     using ControlKeySignal signal = new ControlKeySignal(Interop.ViewSignal.KeyEventSignal(SwigCPtr), false);
-                    signal?.Connect(keyCallback);
+                    signal.Ensure()?.Connect(keyCallback);
                 }
                 keyEventHandler += value;
             }
@@ -195,17 +181,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 keyEventHandler -= value;
-                if (keyEventHandler == null)
+                if (keyEventHandler == null && keyCallback != null)
                 {
                     using ControlKeySignal signal = new ControlKeySignal(Interop.ViewSignal.KeyEventSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(keyCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            keyCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(keyCallback);
+                    keyCallback = null;
                 }
             }
         }
@@ -223,7 +203,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     onRelayoutEventCallback = OnRelayout;
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOnRelayoutSignal(SwigCPtr), false);
-                    signal?.Connect(onRelayoutEventCallback);
+                    signal.Ensure()?.Connect(onRelayoutEventCallback);
                 }
                 onRelayoutEventHandler += value;
             }
@@ -231,17 +211,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 onRelayoutEventHandler -= value;
-                if (onRelayoutEventHandler == null)
+                if (onRelayoutEventHandler == null && onRelayoutEventCallback != null)
                 {
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOnRelayoutSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(onRelayoutEventCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            onRelayoutEventCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(onRelayoutEventCallback);
+                    onRelayoutEventCallback = null;
                 }
             }
         }
@@ -261,7 +235,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     interceptTouchDataCallback = OnInterceptTouch;
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(SwigCPtr), false);
-                    signal?.Connect(interceptTouchDataCallback);
+                    signal.Ensure()?.Connect(interceptTouchDataCallback);
                 }
                 interceptTouchDataEventHandler += value;
             }
@@ -269,17 +243,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 interceptTouchDataEventHandler -= value;
-                if (interceptTouchDataEventHandler == null)
+                if (interceptTouchDataEventHandler == null && interceptTouchDataCallback != null)
                 {
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(interceptTouchDataCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            interceptTouchDataCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(interceptTouchDataCallback);
+                    interceptTouchDataCallback = null;
                 }
             }
         }
@@ -310,7 +278,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     touchDataCallback = OnTouch;
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(SwigCPtr), false);
-                    signal.Connect(touchDataCallback);
+                    signal.Ensure()?.Connect(touchDataCallback);
                 }
                 touchDataEventHandler += value;
             }
@@ -318,17 +286,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 touchDataEventHandler -= value;
-                if (touchDataEventHandler == null)
+                if (touchDataEventHandler == null && touchDataCallback != null)
                 {
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(SwigCPtr), false);
-                    if (signal.Empty() == false)
-                    {
-                        signal.Disconnect(touchDataCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            touchDataCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(touchDataCallback);
+                    touchDataCallback = null;
                 }
             }
         }
@@ -346,7 +308,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     hoverEventCallback = OnHoverEvent;
                     using HoverSignal signal = new HoverSignal(Interop.ActorSignal.ActorHoveredSignal(SwigCPtr), false);
-                    signal?.Connect(hoverEventCallback);
+                    signal.Ensure()?.Connect(hoverEventCallback);
                 }
                 hoverEventHandler += value;
             }
@@ -354,17 +316,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 hoverEventHandler -= value;
-                if (hoverEventHandler == null)
+                if (hoverEventHandler == null && hoverEventCallback != null)
                 {
                     using HoverSignal signal = new HoverSignal(Interop.ActorSignal.ActorHoveredSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(hoverEventCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            hoverEventCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(hoverEventCallback);
+                    hoverEventCallback = null;
                 }
             }
         }
@@ -382,7 +338,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     wheelEventCallback = OnWheelEvent;
                     using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(SwigCPtr), false);
-                    signal?.Connect(wheelEventCallback);
+                    signal.Ensure()?.Connect(wheelEventCallback);
                 }
                 wheelEventHandler += value;
             }
@@ -390,17 +346,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 wheelEventHandler -= value;
-                if (wheelEventHandler == null)
+                if (wheelEventHandler == null && wheelEventCallback != null)
                 {
                     using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(wheelEventCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            wheelEventCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(wheelEventCallback);
+                    wheelEventCallback = null;
                 }
             }
         }
@@ -418,7 +368,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     onWindowEventCallback = OnWindow;
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOnSceneSignal(SwigCPtr), false);
-                    signal?.Connect(onWindowEventCallback);
+                    signal.Ensure()?.Connect(onWindowEventCallback);
                 }
                 onWindowEventHandler += value;
             }
@@ -426,17 +376,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 onWindowEventHandler -= value;
-                if (onWindowEventHandler == null)
+                if (onWindowEventHandler == null && onWindowEventCallback != null)
                 {
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOnSceneSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(onWindowEventCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            onWindowEventCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(onWindowEventCallback);
+                    onWindowEventCallback = null;
                 }
             }
         }
@@ -454,7 +398,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     offWindowEventCallback = OffWindow;
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOffSceneSignal(SwigCPtr), false);
-                    signal?.Connect(offWindowEventCallback);
+                    signal.Ensure()?.Connect(offWindowEventCallback);
                 }
                 offWindowEventHandler += value;
             }
@@ -462,17 +406,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 offWindowEventHandler -= value;
-                if (offWindowEventHandler == null)
+                if (offWindowEventHandler == null && offWindowEventCallback != null)
                 {
                     using ViewSignal signal = new ViewSignal(Interop.ActorSignal.ActorOffSceneSignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(offWindowEventCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            offWindowEventCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(offWindowEventCallback);
+                    offWindowEventCallback = null;
                 }
             }
         }
@@ -489,7 +427,7 @@ namespace Tizen.NUI.BaseComponents
                 if (visibilityChangedEventHandler == null)
                 {
                     visibilityChangedEventCallback = OnVisibilityChanged;
-                    VisibilityChangedSignal(this).Connect(visibilityChangedEventCallback);
+                    VisibilityChangedSignal(this).Ensure()?.Connect(visibilityChangedEventCallback);
                 }
 
                 visibilityChangedEventHandler += value;
@@ -499,13 +437,10 @@ namespace Tizen.NUI.BaseComponents
             {
                 visibilityChangedEventHandler -= value;
 
-                if (visibilityChangedEventHandler == null && VisibilityChangedSignal(this).Empty() == false)
+                if (visibilityChangedEventHandler == null && visibilityChangedEventCallback != null)
                 {
-                    VisibilityChangedSignal(this).Disconnect(visibilityChangedEventCallback);
-                    if (VisibilityChangedSignal(this).Empty() == true)
-                    {
-                        visibilityChangedEventCallback = null;
-                    }
+                    VisibilityChangedSignal(this).Ensure()?.Disconnect(visibilityChangedEventCallback);
+                    visibilityChangedEventCallback = null;
                 }
             }
         }
@@ -532,13 +467,10 @@ namespace Tizen.NUI.BaseComponents
             {
                 layoutDirectionChangedEventHandler -= value;
 
-                if (layoutDirectionChangedEventHandler == null && LayoutDirectionChangedSignal(this).Empty() == false)
+                if (layoutDirectionChangedEventHandler == null && layoutDirectionChangedEventCallback != null)
                 {
-                    LayoutDirectionChangedSignal(this).Disconnect(layoutDirectionChangedEventCallback);
-                    if (LayoutDirectionChangedSignal(this).Empty() == true)
-                    {
-                        layoutDirectionChangedEventCallback = null;
-                    }
+                    LayoutDirectionChangedSignal(this).Ensure()?.Disconnect(layoutDirectionChangedEventCallback);
+                    layoutDirectionChangedEventCallback = null;
                 }
             }
         }
@@ -556,7 +488,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     ResourcesLoadedCallback = OnResourcesLoaded;
                     using ViewSignal signal = new ViewSignal(Interop.View.ResourceReadySignal(SwigCPtr), false);
-                    signal?.Connect(ResourcesLoadedCallback);
+                    signal.Ensure()?.Connect(ResourcesLoadedCallback);
                 }
                 resourcesLoadedEventHandler += value;
             }
@@ -564,17 +496,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 resourcesLoadedEventHandler -= value;
-                if (resourcesLoadedEventHandler == null)
+                if (resourcesLoadedEventHandler == null && ResourcesLoadedCallback != null)
                 {
                     using ViewSignal signal = new ViewSignal(Interop.View.ResourceReadySignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(ResourcesLoadedCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            ResourcesLoadedCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(ResourcesLoadedCallback);
+                    ResourcesLoadedCallback = null;
                 }
             }
         }
@@ -619,7 +545,7 @@ namespace Tizen.NUI.BaseComponents
                 {
                     backgroundResourceLoadedCallback = OnBackgroundResourceLoaded;
                     using ViewSignal signal = new ViewSignal(Interop.View.ResourceReadySignal(SwigCPtr), false);
-                    signal?.Connect(backgroundResourceLoadedCallback);
+                    signal.Ensure()?.Connect(backgroundResourceLoadedCallback);
                 }
                 backgroundResourceLoadedEventHandler += value;
             }
@@ -627,17 +553,11 @@ namespace Tizen.NUI.BaseComponents
             remove
             {
                 backgroundResourceLoadedEventHandler -= value;
-                if (backgroundResourceLoadedEventHandler == null)
+                if (backgroundResourceLoadedEventHandler == null && backgroundResourceLoadedCallback != null)
                 {
                     using ViewSignal signal = new ViewSignal(Interop.View.ResourceReadySignal(SwigCPtr), false);
-                    if (signal?.Empty() == false)
-                    {
-                        signal?.Disconnect(backgroundResourceLoadedCallback);
-                        if (signal?.Empty() == true)
-                        {
-                            backgroundResourceLoadedCallback = null;
-                        }
-                    }
+                    signal.Ensure()?.Disconnect(backgroundResourceLoadedCallback);
+                    backgroundResourceLoadedCallback = null;
                 }
             }
         }
index 5b462c6..f853c62 100755 (executable)
@@ -88,7 +88,7 @@ namespace Tizen.NUI
                 {
                     windowFocusChangedEventCallback = OnWindowFocusedChanged;
                     using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
-                    signal?.Connect(windowFocusChangedEventCallback);
+                    signal.Ensure()?.Connect(windowFocusChangedEventCallback);
                 }
                 windowFocusChangedEventHandler += value;
             }
@@ -98,11 +98,8 @@ namespace Tizen.NUI
                 if (windowFocusChangedEventHandler == null && windowFocusChangedEventCallback != null)
                 {
                     using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
-                    signal?.Disconnect(windowFocusChangedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        windowFocusChangedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(windowFocusChangedEventCallback);
+                    windowFocusChangedEventCallback = null;
                 }
             }
         }
@@ -122,7 +119,7 @@ namespace Tizen.NUI
                 {
                     rootLayerTouchDataCallback = OnWindowTouch;
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(Layer.getCPtr(GetRootLayer())), false);
-                    signal?.Connect(rootLayerTouchDataCallback);
+                    signal.Ensure()?.Connect(rootLayerTouchDataCallback);
                 }
                 rootLayerTouchDataEventHandler += value;
             }
@@ -132,11 +129,8 @@ namespace Tizen.NUI
                 if (rootLayerTouchDataEventHandler == null && rootLayerTouchDataCallback != null)
                 {
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorTouchSignal(Layer.getCPtr(GetRootLayer())), false);
-                    signal?.Disconnect(rootLayerTouchDataCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        rootLayerTouchDataCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(rootLayerTouchDataCallback);
+                    rootLayerTouchDataCallback = null;
                 }
             }
         }
@@ -156,7 +150,7 @@ namespace Tizen.NUI
                 {
                     rootLayerInterceptTouchDataCallback = OnWindowInterceptTouch;
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(Layer.getCPtr(GetRootLayer())), false);
-                    signal?.Connect(rootLayerInterceptTouchDataCallback);
+                    signal.Ensure()?.Connect(rootLayerInterceptTouchDataCallback);
                 }
                 rootLayerInterceptTouchDataEventHandler += value;
             }
@@ -166,11 +160,8 @@ namespace Tizen.NUI
                 if (rootLayerInterceptTouchDataEventHandler == null && rootLayerInterceptTouchDataCallback != null)
                 {
                     using TouchDataSignal signal = new TouchDataSignal(Interop.ActorSignal.ActorInterceptTouchSignal(Layer.getCPtr(GetRootLayer())), false);
-                    signal?.Disconnect(rootLayerInterceptTouchDataCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        rootLayerInterceptTouchDataCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(rootLayerInterceptTouchDataCallback);
+                    rootLayerInterceptTouchDataCallback = null;
                 }
             }
         }
@@ -187,7 +178,7 @@ namespace Tizen.NUI
                 {
                     wheelEventCallback = OnStageWheel;
                     using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(Layer.getCPtr(this.GetRootLayer())), false);
-                    signal?.Connect(wheelEventCallback);
+                    signal.Ensure()?.Connect(wheelEventCallback);
                 }
                 stageWheelHandler += value;
 
@@ -195,7 +186,7 @@ namespace Tizen.NUI
                 {
                     DetentEventCallback = OnDetentEvent;
                     using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
-                    signal?.Connect(DetentEventCallback);
+                    signal.Ensure()?.Connect(DetentEventCallback);
                 }
                 DetentEventHandler += value;
             }
@@ -205,22 +196,16 @@ namespace Tizen.NUI
                 if (stageWheelHandler == null && wheelEventCallback != null)
                 {
                     using WheelSignal signal = new WheelSignal(Interop.ActorSignal.ActorWheelEventSignal(Layer.getCPtr(this.GetRootLayer())), false);
-                    signal?.Disconnect(wheelEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        wheelEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(wheelEventCallback);
+                    wheelEventCallback = null;
                 }
 
                 DetentEventHandler -= value;
                 if (DetentEventHandler == null && DetentEventCallback != null)
                 {
                     using StageWheelSignal signal = new StageWheelSignal(Interop.StageSignal.WheelEventSignal(stageCPtr), false);
-                    signal?.Disconnect(DetentEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        DetentEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(DetentEventCallback);
+                    DetentEventCallback = null;
                 }
             }
         }
@@ -237,7 +222,7 @@ namespace Tizen.NUI
                 {
                     stageKeyCallbackDelegate = OnStageKey;
                     using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
-                    signal?.Connect(stageKeyCallbackDelegate);
+                    signal.Ensure()?.Connect(stageKeyCallbackDelegate);
                 }
                 stageKeyHandler += value;
             }
@@ -247,11 +232,8 @@ namespace Tizen.NUI
                 if (stageKeyHandler == null && stageKeyCallbackDelegate != null)
                 {
                     using KeyEventSignal signal = new KeyEventSignal(Interop.Window.KeyEventSignal(SwigCPtr), false);
-                    signal?.Disconnect(stageKeyCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageKeyCallbackDelegate = null;
-                    }
+                    signal.Ensure()?.Disconnect(stageKeyCallbackDelegate);
+                    stageKeyCallbackDelegate = null;
                 }
             }
         }
@@ -269,7 +251,7 @@ namespace Tizen.NUI
                 {
                     stageInterceptKeyCallbackDelegate = OnStageInterceptKey;
                     using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
-                    signal?.Connect(stageInterceptKeyCallbackDelegate);
+                    signal.Ensure()?.Connect(stageInterceptKeyCallbackDelegate);
                 }
                 stageInterceptKeyHandler += value;
             }
@@ -279,11 +261,8 @@ namespace Tizen.NUI
                 if (stageInterceptKeyHandler == null && stageInterceptKeyCallbackDelegate != null)
                 {
                     using KeyEventSignal signal = new KeyEventSignal(Interop.Window.InterceptKeyEventSignal(SwigCPtr), false);
-                    signal?.Disconnect(stageInterceptKeyCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageInterceptKeyCallbackDelegate = null;
-                    }
+                    signal.Ensure()?.Disconnect(stageInterceptKeyCallbackDelegate);
+                    stageInterceptKeyCallbackDelegate = null;
                 }
             }
         }
@@ -300,7 +279,7 @@ namespace Tizen.NUI
                 {
                     windowResizeEventCallback = OnResized;
                     using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
-                    signal?.Connect(windowResizeEventCallback);
+                    signal.Ensure()?.Connect(windowResizeEventCallback);
                 }
 
                 windowResizeEventHandler += value;
@@ -311,11 +290,8 @@ namespace Tizen.NUI
                 if (windowResizeEventHandler == null && windowResizeEventCallback != null)
                 {
                     using ResizeSignal signal = new ResizeSignal(Interop.Window.ResizeSignal(SwigCPtr), false);
-                    signal?.Disconnect(windowResizeEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        windowResizeEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(windowResizeEventCallback);
+                    windowResizeEventCallback = null;
                 }
             }
         }
@@ -339,7 +315,7 @@ namespace Tizen.NUI
                 {
                     windowFocusChangedEventCallback2 = OnWindowFocusedChanged2;
                     using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
-                    signal?.Connect(windowFocusChangedEventCallback2);
+                    signal.Ensure()?.Connect(windowFocusChangedEventCallback2);
                 }
                 windowFocusChangedEventHandler2 += value;
             }
@@ -349,11 +325,8 @@ namespace Tizen.NUI
                 if (windowFocusChangedEventHandler2 == null && windowFocusChangedEventCallback2 != null)
                 {
                     using WindowFocusSignalType signal = new WindowFocusSignalType(Interop.Window.FocusChangedSignal(SwigCPtr), false);
-                    signal?.Disconnect(windowFocusChangedEventCallback2);
-                    if (signal?.Empty() == true)
-                    {
-                        windowFocusChangedEventCallback2 = null;
-                    }
+                    signal.Ensure()?.Disconnect(windowFocusChangedEventCallback2);
+                    windowFocusChangedEventCallback2 = null;
                 }
             }
         }
@@ -370,7 +343,7 @@ namespace Tizen.NUI
                 {
                     transitionEffectEventCallback = OnTransitionEffect;
                     using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(transitionEffectEventCallback);
+                    signal.Ensure()?.Connect(transitionEffectEventCallback);
                 }
                 transitionEffectHandler += value;
             }
@@ -380,11 +353,8 @@ namespace Tizen.NUI
                 if (transitionEffectHandler == null && transitionEffectEventCallback != null)
                 {
                     using WindowTransitionEffectSignal signal = new WindowTransitionEffectSignal(Interop.WindowTransitionEffectSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(transitionEffectEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        transitionEffectEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(transitionEffectEventCallback);
+                    transitionEffectEventCallback = null;
                 }
             }
         }
@@ -401,7 +371,7 @@ namespace Tizen.NUI
                 {
                     movedEventCallback = OnMoved;
                     using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(movedEventCallback);
+                    signal.Ensure()?.Connect(movedEventCallback);
                 }
                 movedHandler += value;
             }
@@ -411,11 +381,8 @@ namespace Tizen.NUI
                 if (movedHandler == null && movedEventCallback != null)
                 {
                     using WindowMovedSignal signal = new WindowMovedSignal(Interop.WindowMovedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(movedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        movedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(movedEventCallback);
+                    movedEventCallback = null;
                 }
             }
         }
@@ -433,7 +400,7 @@ namespace Tizen.NUI
                 {
                     orientationChangedEventCallback = OnOrientationChanged;
                     using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(orientationChangedEventCallback);
+                    signal.Ensure()?.Connect(orientationChangedEventCallback);
                 }
                 orientationChangedHandler += value;
             }
@@ -443,11 +410,8 @@ namespace Tizen.NUI
                 if (orientationChangedHandler == null && orientationChangedEventCallback != null)
                 {
                     using WindowOrientationChangedSignal signal = new WindowOrientationChangedSignal(Interop.WindowOrientationChangedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(orientationChangedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        orientationChangedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(orientationChangedEventCallback);
+                    orientationChangedEventCallback = null;
                 }
             }
         }
@@ -464,7 +428,7 @@ namespace Tizen.NUI
                 {
                     keyboardRepeatSettingsChangedEventCallback = OnKeyboardRepeatSettingsChanged;
                     using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(keyboardRepeatSettingsChangedEventCallback);
+                    signal.Ensure()?.Connect(keyboardRepeatSettingsChangedEventCallback);
                 }
                 keyboardRepeatSettingsChangedHandler += value;
             }
@@ -474,11 +438,8 @@ namespace Tizen.NUI
                 if (keyboardRepeatSettingsChangedHandler == null && keyboardRepeatSettingsChangedEventCallback != null)
                 {
                     using KeyboardRepeatSettingsChangedSignal signal = new KeyboardRepeatSettingsChangedSignal(Interop.KeyboardRepeatSettingsChangedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        keyboardRepeatSettingsChangedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(keyboardRepeatSettingsChangedEventCallback);
+                    keyboardRepeatSettingsChangedEventCallback = null;
                 }
             }
         }
@@ -497,7 +458,7 @@ namespace Tizen.NUI
                 {
                     viewAddedEventCallback = OnViewAdded;
                     using WindowViewAddedSignal signal = new WindowViewAddedSignal(Interop.WindowViewAddedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(viewAddedEventCallback);
+                    signal.Ensure()?.Connect(viewAddedEventCallback);
                 }
                 viewAddedHandler += value;
             }
@@ -507,11 +468,8 @@ namespace Tizen.NUI
                 if (viewAddedHandler == null && viewAddedEventCallback != null)
                 {
                     using WindowViewAddedSignal signal = new WindowViewAddedSignal(Interop.WindowViewAddedSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(viewAddedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        viewAddedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(viewAddedEventCallback);
+                    viewAddedEventCallback = null;
                 }
             }
         }
@@ -541,7 +499,7 @@ namespace Tizen.NUI
                 {
                     stageEventProcessingFinishedEventCallbackDelegate = OnEventProcessingFinished;
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
-                    signal?.Connect(stageEventProcessingFinishedEventCallbackDelegate);
+                    signal.Ensure()?.Connect(stageEventProcessingFinishedEventCallbackDelegate);
                 }
                 stageEventProcessingFinishedEventHandler += value;
             }
@@ -551,12 +509,8 @@ namespace Tizen.NUI
                 if (stageEventProcessingFinishedEventHandler == null && stageEventProcessingFinishedEventCallbackDelegate != null)
                 {
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.EventProcessingFinishedSignal(stageCPtr), false);
-                    signal?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageEventProcessingFinishedEventCallbackDelegate = null;
-                    }
-
+                    signal.Ensure()?.Disconnect(stageEventProcessingFinishedEventCallbackDelegate);
+                    stageEventProcessingFinishedEventCallbackDelegate = null;
                 }
             }
         }
@@ -569,7 +523,7 @@ namespace Tizen.NUI
                 {
                     stageContextLostEventCallbackDelegate = OnContextLost;
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
-                    signal?.Connect(stageContextLostEventCallbackDelegate);
+                    signal.Ensure()?.Connect(stageContextLostEventCallbackDelegate);
                 }
                 stageContextLostEventHandler += value;
             }
@@ -579,11 +533,8 @@ namespace Tizen.NUI
                 if (stageContextLostEventHandler == null && stageContextLostEventCallbackDelegate != null)
                 {
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextLostSignal(stageCPtr), false);
-                    signal?.Disconnect(stageContextLostEventCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageContextLostEventCallbackDelegate = null;
-                    }
+                    signal.Ensure()?.Disconnect(stageContextLostEventCallbackDelegate);
+                    stageContextLostEventCallbackDelegate = null;
                 }
             }
         }
@@ -596,7 +547,7 @@ namespace Tizen.NUI
                 {
                     stageContextRegainedEventCallbackDelegate = OnContextRegained;
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
-                    signal?.Connect(stageContextRegainedEventCallbackDelegate);
+                    signal.Ensure()?.Connect(stageContextRegainedEventCallbackDelegate);
                 }
                 stageContextRegainedEventHandler += value;
             }
@@ -606,11 +557,8 @@ namespace Tizen.NUI
                 if (stageContextRegainedEventHandler == null && stageContextRegainedEventCallbackDelegate != null)
                 {
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.ContextRegainedSignal(stageCPtr), false);
-                    signal?.Disconnect(stageContextRegainedEventCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageContextRegainedEventCallbackDelegate = null;
-                    }
+                    signal.Ensure()?.Disconnect(stageContextRegainedEventCallbackDelegate);
+                    stageContextRegainedEventCallbackDelegate = null;
                 }
             }
         }
@@ -623,7 +571,7 @@ namespace Tizen.NUI
                 {
                     stageSceneCreatedEventCallbackDelegate = OnSceneCreated;
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
-                    signal?.Connect(stageSceneCreatedEventCallbackDelegate);
+                    signal.Ensure()?.Connect(stageSceneCreatedEventCallbackDelegate);
                 }
                 stageSceneCreatedEventHandler += value;
             }
@@ -633,11 +581,8 @@ namespace Tizen.NUI
                 if (stageSceneCreatedEventHandler == null && stageSceneCreatedEventCallbackDelegate != null)
                 {
                     using VoidSignal signal = new VoidSignal(Interop.StageSignal.SceneCreatedSignal(stageCPtr), false);
-                    signal?.Disconnect(stageSceneCreatedEventCallbackDelegate);
-                    if (signal?.Empty() == true)
-                    {
-                        stageSceneCreatedEventCallbackDelegate = null;
-                    }
+                    signal.Ensure()?.Disconnect(stageSceneCreatedEventCallbackDelegate);
+                    stageSceneCreatedEventCallbackDelegate = null;
                 }
             }
         }
@@ -1323,7 +1268,7 @@ namespace Tizen.NUI
                 {
                     VisibilityChangedEventCallback = OnVisibilityChanged;
                     using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
-                    signal?.Connect(VisibilityChangedEventCallback);
+                    signal.Ensure()?.Connect(VisibilityChangedEventCallback);
                 }
                 VisibilityChangedEventHandler += value;
             }
@@ -1333,11 +1278,8 @@ namespace Tizen.NUI
                 if (VisibilityChangedEventHandler == null && VisibilityChangedEventCallback != null)
                 {
                     using WindowVisibilityChangedEvent signal = new WindowVisibilityChangedEvent(Interop.WindowVisibilityChangedSignal.GetSignal(Window.getCPtr(this)), false);
-                    signal?.Disconnect(VisibilityChangedEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        VisibilityChangedEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(VisibilityChangedEventCallback);
+                    VisibilityChangedEventCallback = null;
                 }
             }
         }
@@ -1399,7 +1341,7 @@ namespace Tizen.NUI
                 {
                     auxiliaryMessageEventCallback = OnAuxiliaryMessage;
                     using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
-                    signal?.Connect(auxiliaryMessageEventCallback);
+                    signal.Ensure()?.Connect(auxiliaryMessageEventCallback);
                 }
                 auxiliaryMessageEventHandler += value;
             }
@@ -1409,11 +1351,8 @@ namespace Tizen.NUI
                 if (auxiliaryMessageEventHandler == null && auxiliaryMessageEventCallback != null)
                 {
                     using WindowAuxiliaryMessageSignal signal = new WindowAuxiliaryMessageSignal(Interop.WindowAuxiliaryMessageSignalType.Get(SwigCPtr), false);
-                    signal?.Disconnect(auxiliaryMessageEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        auxiliaryMessageEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(auxiliaryMessageEventCallback);
+                    auxiliaryMessageEventCallback = null;
                 }
             }
         }
@@ -1472,7 +1411,7 @@ namespace Tizen.NUI
                 {
                     AccessibilityHighlightEventCallback = OnAccessibilityHighlight;
                     using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
-                    signal?.Connect(AccessibilityHighlightEventCallback);
+                    signal.Ensure()?.Connect(AccessibilityHighlightEventCallback);
                 }
                 AccessibilityHighlightEventHandler += value;
             }
@@ -1482,11 +1421,8 @@ namespace Tizen.NUI
                 if (AccessibilityHighlightEventHandler == null && AccessibilityHighlightEventCallback != null)
                 {
                     using WindowAccessibilityHighlightEvent signal = new WindowAccessibilityHighlightEvent(Interop.WindowAccessibilityHighlightSignal.GetSignal(SwigCPtr), false);
-                    signal?.Disconnect(AccessibilityHighlightEventCallback);
-                    if (signal?.Empty() == true)
-                    {
-                        AccessibilityHighlightEventCallback = null;
-                    }
+                    signal.Ensure()?.Disconnect(AccessibilityHighlightEventCallback);
+                    AccessibilityHighlightEventCallback = null;
                 }
             }
         }