[NUI] Connect NUI.Window touch event to dali root layer touch event (#285)
authordongsug-song <35130733+dongsug-song@users.noreply.github.com>
Thu, 7 Jun 2018 07:33:06 +0000 (16:33 +0900)
committerGitHub <noreply@github.com>
Thu, 7 Jun 2018 07:33:06 +0000 (16:33 +0900)
src/Tizen.NUI/src/public/Window.cs

index 74dd355..960194e 100755 (executable)
@@ -728,6 +728,14 @@ namespace Tizen.NUI
             return ret;
         }
 
+        internal TouchDataSignal TouchDataSignal()
+        {
+            TouchDataSignal ret = new TouchDataSignal(NDalicPINVOKE.Actor_TouchSignal(Layer.getCPtr(GetRootLayer())), false);
+            if (NDalicPINVOKE.SWIGPendingException.Pending)
+                throw NDalicPINVOKE.SWIGPendingException.Retrieve();
+            return ret;
+        }
+
         private StageWheelSignal WheelEventSignal()
         {
             StageWheelSignal ret = new StageWheelSignal(NDalicPINVOKE.Stage_WheelEventSignal(stageCPtr), false);
@@ -975,9 +983,11 @@ namespace Tizen.NUI
             }
         }
 
-        private event EventHandler<TouchEventArgs> _stageTouchHandler;
-        private EventCallbackDelegateType1 _stageTouchCallbackDelegate;
 
+        private event EventHandler<TouchEventArgs> _rootLayerTouchDataEventHandler;
+        [UnmanagedFunctionPointer(CallingConvention.StdCall)]
+        private delegate bool RootLayerTouchDataCallbackType(IntPtr view, IntPtr touchData);
+        private RootLayerTouchDataCallbackType _rootLayerTouchDataCallback;
         /// <summary>
         /// This event is emitted when the screen is touched and when the touch ends.<br />
         /// If there are multiple touch points, then this will be emitted when the first touch occurs and
@@ -989,39 +999,40 @@ namespace Tizen.NUI
         {
             add
             {
-                lock (this)
+                if (_rootLayerTouchDataEventHandler == null)
                 {
-                    _stageTouchHandler += value;
-                    _stageTouchCallbackDelegate = OnStageTouch;
-                    this.TouchSignal().Connect(_stageTouchCallbackDelegate);
+                    _rootLayerTouchDataCallback = OnWindowTouch;
+                    this.TouchDataSignal().Connect(_rootLayerTouchDataCallback);
                 }
+                _rootLayerTouchDataEventHandler += value;
             }
             remove
             {
-                lock (this)
+                _rootLayerTouchDataEventHandler -= value;
+                if (_rootLayerTouchDataEventHandler == null && TouchSignal().Empty() == false)
                 {
-                    if (_stageTouchHandler != null)
-                    {
-                        this.TouchSignal().Disconnect(_stageTouchCallbackDelegate);
-                    }
-                    _stageTouchHandler -= value;
+                    this.TouchDataSignal().Disconnect(_rootLayerTouchDataCallback);
                 }
             }
         }
 
-        private void OnStageTouch(IntPtr data)
+        private bool OnWindowTouch(IntPtr view, IntPtr touchData)
         {
-            TouchEventArgs e = new TouchEventArgs();
-
-            if (data != null)
+            if (touchData == global::System.IntPtr.Zero)
             {
-                e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(data);
+                NUILog.Error("touchData should not be null!");
+                return false;
             }
 
-            if (_stageTouchHandler != null)
+            TouchEventArgs e = new TouchEventArgs();
+
+            e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
+
+            if (_rootLayerTouchDataEventHandler != null)
             {
-                _stageTouchHandler(this, e);
+                _rootLayerTouchDataEventHandler(this, e);
             }
+            return false;
         }
 
         /// <summary>