[Tizen] Add GlWindow
[platform/core/uifw/dali-adaptor.git] / dali / internal / window-system / common / event-handler.cpp
index f8c8fc0..25fc86f 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@
 #include <cstring>
 #include <sys/time.h>
 
-#include <dali/public-api/events/touch-point.h>
+#include <dali/devel-api/events/touch-point.h>
 #include <dali/public-api/events/key-event.h>
 #include <dali/public-api/events/wheel-event.h>
 #include <dali/integration-api/debug.h>
@@ -52,7 +52,7 @@ Integration::Log::Filter* gSelectionEventLogFilter = Integration::Log::Filter::N
 } // unnamed namespace
 #endif
 
-#if 0 and defined DALI_ELDBUS_AVAILABLE
+#ifdef DALI_ELDBUS_AVAILABLE
 namespace
 {
 
@@ -95,28 +95,25 @@ static uint32_t GetCurrentMilliSeconds(void)
 } // unnamed namespace
 #endif
 
-EventHandler::EventHandler( WindowRenderSurface* surface, DamageObserver& damageObserver )
+EventHandler::EventHandler( WindowBase* windowBase, DamageObserver& damageObserver )
 : mStyleMonitor( StyleMonitor::Get() ),
   mDamageObserver( damageObserver ),
+  mAccessibilityAdaptor( AccessibilityAdaptor::Get() ),
   mClipboardEventNotifier( ClipboardEventNotifier::Get() ),
   mClipboard( Clipboard::Get() ),
   mPaused( false )
 {
-  if( surface )
-  {
-    WindowBase* windowBase = surface->GetWindowBase();
-
-    // Connect signals
-    windowBase->WindowDamagedSignal().Connect( this, &EventHandler::OnWindowDamaged );
-    windowBase->FocusChangedSignal().Connect( this, &EventHandler::OnFocusChanged );
-    windowBase->RotationSignal().Connect( this, &EventHandler::OnRotation );
-    windowBase->TouchEventSignal().Connect( this, &EventHandler::OnTouchEvent );
-    windowBase->WheelEventSignal().Connect( this, &EventHandler::OnWheelEvent );
-    windowBase->KeyEventSignal().Connect( this, &EventHandler::OnKeyEvent );
-    windowBase->SelectionDataSendSignal().Connect( this, &EventHandler::OnSelectionDataSend );
-    windowBase->SelectionDataReceivedSignal().Connect( this, &EventHandler::OnSelectionDataReceived );
-    windowBase->StyleChangedSignal().Connect( this, &EventHandler::OnStyleChanged );
-  }
+  // Connect signals
+  windowBase->WindowDamagedSignal().Connect( this, &EventHandler::OnWindowDamaged );
+  windowBase->FocusChangedSignal().Connect( this, &EventHandler::OnFocusChanged );
+  windowBase->RotationSignal().Connect( this, &EventHandler::OnRotation );
+  windowBase->TouchEventSignal().Connect( this, &EventHandler::OnTouchEvent );
+  windowBase->WheelEventSignal().Connect( this, &EventHandler::OnWheelEvent );
+  windowBase->KeyEventSignal().Connect( this, &EventHandler::OnKeyEvent );
+  windowBase->SelectionDataSendSignal().Connect( this, &EventHandler::OnSelectionDataSend );
+  windowBase->SelectionDataReceivedSignal().Connect( this, &EventHandler::OnSelectionDataReceived );
+  windowBase->StyleChangedSignal().Connect( this, &EventHandler::OnStyleChanged );
+  windowBase->AccessibilitySignal().Connect( this, &EventHandler::OnAccessibilityNotification );
 }
 
 EventHandler::~EventHandler()
@@ -152,13 +149,11 @@ void EventHandler::OnTouchEvent( Integration::Point& point, uint32_t timeStamp )
   }
 }
 
-void EventHandler::OnWheelEvent( WheelEvent& wheelEvent )
+void EventHandler::OnWheelEvent( Integration::WheelEvent& wheelEvent )
 {
-  Integration::WheelEvent event( static_cast< Integration::WheelEvent::Type >(wheelEvent.type), wheelEvent.direction, wheelEvent.modifiers, wheelEvent.point, wheelEvent.z, wheelEvent.timeStamp );
-
   for ( ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter )
   {
-    (*iter)->OnWheelEvent( event );
+    (*iter)->OnWheelEvent( wheelEvent );
   }
 }
 
@@ -244,6 +239,260 @@ void EventHandler::OnStyleChanged( StyleChange::Type styleChange )
   SendEvent( styleChange );
 }
 
+void EventHandler::OnAccessibilityNotification( const WindowBase::AccessibilityInfo& info )
+{
+#ifdef DALI_ELDBUS_AVAILABLE
+  if( mPaused )
+  {
+    return;
+  }
+
+  if( !mAccessibilityAdaptor )
+  {
+    DALI_LOG_ERROR( "Invalid accessibility adaptor\n" );
+    return;
+  }
+
+  AccessibilityAdaptor* accessibilityAdaptor( &AccessibilityAdaptor::GetImplementation( mAccessibilityAdaptor ) );
+  if( !accessibilityAdaptor )
+  {
+    DALI_LOG_ERROR( "Cannot access accessibility adaptor\n" );
+    return;
+  }
+
+  // Create a touch point object.
+  PointState::Type touchPointState( PointState::DOWN );
+  if( info.state == 0 )
+  {
+    touchPointState = PointState::DOWN; // Mouse down.
+  }
+  else if( info.state == 1 )
+  {
+    touchPointState = PointState::MOTION; // Mouse move.
+  }
+  else if( info.state == 2 )
+  {
+    touchPointState = PointState::UP; // Mouse up.
+  }
+  else
+  {
+    touchPointState = PointState::INTERRUPTED; // Error.
+  }
+
+  // Send touch event to accessibility adaptor.
+  TouchPoint point( 0, touchPointState, static_cast< float >( info.startX ), static_cast< float >( info.startY ) );
+
+  // Perform actions based on received gestures.
+  // Note: This is seperated from the reading so we can have other input readers without changing the below code.
+  switch( info.gestureValue )
+  {
+    case 0: // OneFingerHover
+    {
+      // Focus, read out.
+      accessibilityAdaptor->HandleActionReadEvent( static_cast< unsigned int >( info.startX ), static_cast< unsigned int >( info.startY ), true /* allow read again */ );
+      break;
+    }
+    case 1: // TwoFingersHover
+    {
+      // In accessibility mode, scroll action should be handled when the currently focused actor is contained in scrollable control
+      accessibilityAdaptor->HandleActionScrollEvent( point, GetCurrentMilliSeconds() );
+      break;
+    }
+    case 2: // ThreeFingersHover
+    {
+      // Read from top item on screen continuously.
+      accessibilityAdaptor->HandleActionReadFromTopEvent();
+      break;
+    }
+    case 3: // OneFingerFlickLeft
+    {
+      // Move to previous item.
+      accessibilityAdaptor->HandleActionReadPreviousEvent();
+      break;
+    }
+    case 4: // OneFingerFlickRight
+    {
+      // Move to next item.
+      accessibilityAdaptor->HandleActionReadNextEvent();
+      break;
+    }
+    case 5: // OneFingerFlickUp
+    {
+      // Move to previous item.
+      accessibilityAdaptor->HandleActionPreviousEvent();
+      break;
+    }
+    case 6: // OneFingerFlickDown
+    {
+      // Move to next item.
+      accessibilityAdaptor->HandleActionNextEvent();
+      break;
+    }
+    case 7: // TwoFingersFlickUp
+    {
+      // Scroll up the list.
+      accessibilityAdaptor->HandleActionScrollUpEvent();
+      break;
+    }
+    case 8: // TwoFingersFlickDown
+    {
+      // Scroll down the list.
+      accessibilityAdaptor->HandleActionScrollDownEvent();
+      break;
+    }
+    case 9: // TwoFingersFlickLeft
+    {
+      // Scroll left to the previous page
+      accessibilityAdaptor->HandleActionPageLeftEvent();
+      break;
+    }
+    case 10: // TwoFingersFlickRight
+    {
+      // Scroll right to the next page
+      accessibilityAdaptor->HandleActionPageRightEvent();
+      break;
+    }
+    case 11: // ThreeFingersFlickLeft
+    {
+      // Not exist yet
+      break;
+    }
+    case 12: // ThreeFingersFlickRight
+    {
+      // Not exist yet
+      break;
+    }
+    case 13: // ThreeFingersFlickUp
+    {
+      // Not exist yet
+      break;
+    }
+    case 14: // ThreeFingersFlickDown
+    {
+      // Not exist yet
+      break;
+    }
+    case 15: // OneFingerSingleTap
+    {
+      // Focus, read out.
+      accessibilityAdaptor->HandleActionReadEvent( static_cast< unsigned int >( info.startX ), static_cast< unsigned int >( info.startY ), true /* allow read again */ );
+      break;
+    }
+    case 16: // OneFingerDoubleTap
+    {
+      // Activate selected item / active edit mode.
+      accessibilityAdaptor->HandleActionActivateEvent();
+      break;
+    }
+    case 17: // OneFingerTripleTap
+    {
+      // Zoom
+      accessibilityAdaptor->HandleActionZoomEvent();
+      break;
+    }
+    case 18: // TwoFingersSingleTap
+    {
+      // Pause/Resume current speech
+      accessibilityAdaptor->HandleActionReadPauseResumeEvent();
+      break;
+    }
+    case 19: // TwoFingersDoubleTap
+    {
+      // Start/Stop current action
+      accessibilityAdaptor->HandleActionStartStopEvent();
+      break;
+    }
+    case 20: // TwoFingersTripleTap
+    {
+      // Read information from indicator
+      // Not supported
+      break;
+    }
+    case 21: // ThreeFingersSingleTap
+    {
+      // Read from top item on screen continuously.
+      accessibilityAdaptor->HandleActionReadFromTopEvent();
+      break;
+    }
+    case 22: // ThreeFingersDoubleTap
+    {
+      // Read from next item continuously.
+      accessibilityAdaptor->HandleActionReadFromNextEvent();
+      break;
+    }
+    case 23: // ThreeFingersTripleTap
+    {
+      // Not exist yet
+      break;
+    }
+    case 24: // OneFingerFlickLeftReturn
+    {
+      // Scroll up to the previous page
+      accessibilityAdaptor->HandleActionPageUpEvent();
+      break;
+    }
+    case 25: // OneFingerFlickRightReturn
+    {
+      // Scroll down to the next page
+      accessibilityAdaptor->HandleActionPageDownEvent();
+      break;
+    }
+    case 26: // OneFingerFlickUpReturn
+    {
+      // Move to the first item on screen
+      accessibilityAdaptor->HandleActionMoveToFirstEvent();
+      break;
+    }
+    case 27: // OneFingerFlickDownReturn
+    {
+      // Move to the last item on screen
+      accessibilityAdaptor->HandleActionMoveToLastEvent();
+      break;
+    }
+    case 28: // TwoFingersFlickLeftReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 29: // TwoFingersFlickRightReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 30: // TwoFingersFlickUpReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 31: // TwoFingersFlickDownReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 32: // ThreeFingersFlickLeftReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 33: // ThreeFingersFlickRightReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 34: // ThreeFingersFlickUpReturn
+    {
+      // Not exist yet
+      break;
+    }
+    case 35: // ThreeFingersFlickDownReturn
+    {
+      // Not exist yet
+      break;
+    }
+  }
+#endif
+}
+
 void EventHandler::AddObserver( Observer& observer )
 {
   ObserverContainer::iterator match ( find(mObservers.begin(), mObservers.end(), &observer) );