From e5e1378b999370571292915f697083bc8e87877e Mon Sep 17 00:00:00 2001 From: taeyoon Date: Tue, 18 Oct 2016 15:35:01 +0900 Subject: [PATCH] Replace pepper dali with remote surface Change-Id: Ia85e557ff48d2d2d193bb4ea6c06ef9b8f815e27 --- CMakeLists.txt | 3 +- internal/widget_view/widget_view_impl.cpp | 197 ++++++++++++++++++--- internal/widget_view/widget_view_impl.h | 23 ++- .../widget_view_manager_impl.cpp | 53 +----- .../widget_view_manager/widget_view_manager_impl.h | 6 - 5 files changed, 206 insertions(+), 76 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f54d71a..6c9259f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,8 +17,9 @@ pkg_check_modules(viewer_dali REQUIRED capi-system-info dali-adaptor dali-toolkit - pepper-dali cynara-client + ecore-input + tizen-remote-surface-client ) SET(BUILD_SOURCE diff --git a/internal/widget_view/widget_view_impl.cpp b/internal/widget_view/widget_view_impl.cpp index 448e8d9..16006a7 100644 --- a/internal/widget_view/widget_view_impl.cpp +++ b/internal/widget_view/widget_view_impl.cpp @@ -21,11 +21,18 @@ // INTERNAL INCLUDES // EXTERNAL INCLUDES +#include +#include +#include +#include #include #include +#include #include #include #include +#include +#include namespace Dali { @@ -45,6 +52,70 @@ namespace Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" ); #endif +static Eina_Bool OnKeyDown( void* data, int type, void* eventInfo ) +{ + Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo ); + tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data ); + + tizen_remote_surface_transfer_key_event( surface, + TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_DOWN, + event->keycode, + ecore_device_class_get(event->dev), + ecore_device_subclass_get(event->dev), + ecore_device_identifier_get(event->dev), + event->timestamp + ); + + return EINA_TRUE; +} + +static Eina_Bool OnKeyUp(void* data, int type, void* eventInfo) +{ + Ecore_Event_Key *event = static_cast< Ecore_Event_Key* >( eventInfo ); + tizen_remote_surface* surface = static_cast< tizen_remote_surface* >( data ); + + tizen_remote_surface_transfer_key_event( surface, + TIZEN_REMOTE_SURFACE_EVENT_TYPE_KEY_UP, + event->keycode, + ecore_device_class_get(event->dev), + ecore_device_subclass_get(event->dev), + ecore_device_identifier_get(event->dev), + event->timestamp + ); + return EINA_TRUE; +} + +static void OnSurfaceUpdate( struct tizen_remote_surface* surface, wl_buffer* buffer, uint32_t time, void* data ) +{ + Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data ); + + if( widgetView && !widgetView->IsWidgetImageView() ) + { + tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE); + + widgetView->CreateWidgetImageView(); + widgetView->ConnectSignal( surface ); + ecore_event_handler_add( ECORE_EVENT_KEY_DOWN, OnKeyDown, surface ); + ecore_event_handler_add( ECORE_EVENT_KEY_UP, OnKeyUp, surface ); + + } + + //get tbm surface from buffer + tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) ); + widgetView->UpdateImageSource( tbmSurface ); +} + +static void OnSurfaceMissing( struct tizen_remote_surface* surface, void* data ) +{ + //ToDo: WidgetDeletedSignal +} + + +static struct aul_rsm_handler_s remoteSurfaceHandler = { + OnSurfaceUpdate, + OnSurfaceMissing, +}; + } // unnamed namespace Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, double updatePeriod ) @@ -185,13 +256,10 @@ const std::string& WidgetView::GetContentInfo() const std::string& WidgetView::GetTitle() { - if( mObjectView ) + //ToDo: We should add some codes by considering widget_viewer_evas + if( mTitle.empty() ) { - mTitle = mObjectView.GetTitle(); - if( mTitle.empty() ) - { - mTitle = widget_service_get_name( mWidgetId.c_str(), NULL ); - } + mTitle = widget_service_get_name( mWidgetId.c_str(), NULL ); } DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() ); @@ -206,25 +274,26 @@ double WidgetView::GetUpdatePeriod() const void WidgetView::Show() { - if( mObjectView ) + if( mWidgetImageView ) { - mObjectView.Show(); + mWidgetImageView.SetVisible( true ); } } void WidgetView::Hide() { - if( mObjectView ) + if( mWidgetImageView ) { - mObjectView.Hide(); + mWidgetImageView.SetVisible( false ); } } bool WidgetView::CancelTouchEvent() { - if( mObjectView ) + if( mRemoteSurface ) { - return mObjectView.CancelTouchEvent(); + tizen_remote_surface_transfer_touch_cancel( mRemoteSurface ); + return true; } return false; @@ -302,14 +371,19 @@ void WidgetView::SetPermanentDelete( bool permanentDelete ) mPermanentDelete = permanentDelete; } -void WidgetView::AddObjectView( Pepper::ObjectView objectView ) +void WidgetView::CreateWidgetImageView() { - mObjectView = objectView; + Any source; + mImageSource = Dali::NativeImageSource::New( source ); + Dali::NativeImage image = Dali::NativeImage::New( *mImageSource ); + + mWidgetImageView = Dali::Toolkit::ImageView::New( image ); - mObjectView.SetParentOrigin( ParentOrigin::CENTER ); - mObjectView.SetAnchorPoint( AnchorPoint::CENTER ); + mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER ); + mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER ); + mWidgetImageView.SetSize( mWidth, mHeight ); - Self().Add( mObjectView ); + Self().Add( mWidgetImageView ); // Disable preview and text if( mPreviewEnabled ) @@ -346,7 +420,7 @@ void WidgetView::RemoveObjectView() Dali::WidgetView::WidgetView handle( GetOwner() ); mWidgetDeletedSignal.Emit( handle ); - mObjectView.Reset(); + mWidgetImageView.Reset(); DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" ); } @@ -505,15 +579,98 @@ void WidgetView::OnInitialize() return; } + aul_rsm_viewer_set_surface_handler( mInstanceId.c_str(), &remoteSurfaceHandler, this ); + DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid ); + } void WidgetView::OnSizeSet( const Vector3& targetSize ) { - if( mObjectView ) + if( mWidgetImageView ) + { + mWidgetImageView.SetSize( targetSize ); + } +} + +bool WidgetView::IsWidgetImageView() +{ + return ( mWidgetImageView )? true: false; +} + +void WidgetView::UpdateImageSource( tbm_surface_h source ) +{ + mImageSource->SetSource( source ); + Dali::Stage::GetCurrent().KeepRendering( 0.0f ); +} + +void WidgetView::ConnectSignal( tizen_remote_surface* surface ) +{ + if( mWidgetImageView ) + { + mRemoteSurface = surface; + mWidgetImageView.TouchSignal().Connect( this, &WidgetView::OnTouch ); + mWidgetImageView.WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent ); + } + +} + +bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event ) +{ + tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE; + + switch( event.GetState( 0 ) ) { - mObjectView.SetSize( targetSize ); + case Dali::PointState::UP: + { + type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP; + break; + } + case Dali::PointState::DOWN: + { + type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN; + break; + } + case Dali::PointState::MOTION: + { + type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE; + break; + } + default: + { + return false; + } } + + tizen_remote_surface_transfer_mouse_event( mRemoteSurface, + type, + event.GetDeviceId( 0 ), + 1, + event.GetLocalPosition( 0 ).x, + event.GetLocalPosition( 0 ).y, + event.GetEllipseRadius( 0 ).x, + event.GetEllipseRadius( 0 ).y, + event.GetPressure( 0 ), + event.GetAngle( 0 ).degree, + TIZEN_INPUT_DEVICE_CLAS_MOUSE, + TIZEN_INPUT_DEVICE_SUBCLAS_NONE, + "", + event.GetTime() + ); + return true; +} + +bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event ) +{ + tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface, + event.direction, + event.z, + TIZEN_INPUT_DEVICE_CLAS_MOUSE, + TIZEN_INPUT_DEVICE_SUBCLAS_NONE, + "", + event.timeStamp + ); + return true; } } // namespace Internal diff --git a/internal/widget_view/widget_view_impl.h b/internal/widget_view/widget_view_impl.h index b58f1a1..bba069d 100644 --- a/internal/widget_view/widget_view_impl.h +++ b/internal/widget_view/widget_view_impl.h @@ -22,10 +22,12 @@ #include // EXTERNAL INCLUDES +#include #include #include #include -#include +#include +#include #include namespace Dali @@ -131,11 +133,23 @@ public: */ void SetPermanentDelete( bool permanentDelete ); - void AddObjectView( Pepper::ObjectView objectView ); +// ToDo: This funstion will be used for widgetDeletedSignal void RemoveObjectView(); void SendWidgetEvent( int event ); + bool IsWidgetImageView(); + + void UpdateImageSource( tbm_surface_h source ); + + void CreateWidgetImageView(); + + void ConnectSignal( tizen_remote_surface* surface ); + + bool OnTouch( Dali::Actor actor, const Dali::TouchData& event ); + + bool OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event ); + public: //Signals /** @@ -219,9 +233,10 @@ private: private: - Pepper::ObjectView mObjectView; ///< Widget content + Toolkit::ImageView mWidgetImageView; ///< Widget content Toolkit::ImageView mPreviewImage; ///< Preview image Toolkit::TextLabel mStateText; ///< State text + Dali::NativeImageSourcePtr mImageSource; std::string mWidgetId; std::string mInstanceId; @@ -239,6 +254,8 @@ private: bool mStateTextEnabled; bool mPermanentDelete; + tizen_remote_surface* mRemoteSurface; + // Signals Dali::WidgetView::WidgetView::WidgetViewSignalType mWidgetAddedSignal; Dali::WidgetView::WidgetView::WidgetViewSignalType mWidgetDeletedSignal; diff --git a/internal/widget_view_manager/widget_view_manager_impl.cpp b/internal/widget_view_manager/widget_view_manager_impl.cpp index 41092d0..df33581 100644 --- a/internal/widget_view_manager/widget_view_manager_impl.cpp +++ b/internal/widget_view_manager/widget_view_manager_impl.cpp @@ -30,6 +30,7 @@ #include #include #include +#include namespace Dali { @@ -137,6 +138,7 @@ WidgetViewManager::WidgetViewManager() WidgetViewManager::~WidgetViewManager() { + aul_rsm_viewer_fini(); widget_instance_unlisten_event( WidgetViewManager::WidgetEventCallback ); widget_instance_fini(); } @@ -155,11 +157,11 @@ int WidgetViewManager::Initialize( Application application, const std::string& n return WIDGET_ERROR_PERMISSION_DENIED; } - // create compositor - mCompositor = Pepper::Compositor::New( application, name ); - - mCompositor.ObjectViewAddedSignal().Connect( this, &WidgetViewManager::OnObjectViewAdded ); - mCompositor.ObjectViewDeletedSignal().Connect( this, &WidgetViewManager::OnObjectViewDeleted ); + // Binds tizen remote surface manager & connects callback + if( aul_rsm_viewer_init() < 0 ) + { + return WIDGET_ERROR_FAULT; + } // init widget service widget_instance_init( name.c_str() ); @@ -167,8 +169,6 @@ int WidgetViewManager::Initialize( Application application, const std::string& n DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::Initialize: success.\n" ); - setenv("WAYLAND_DISPLAY", mCompositor.GetName().c_str(), 1); - return WIDGET_ERROR_NONE; } @@ -190,45 +190,6 @@ Dali::WidgetView::WidgetView WidgetViewManager::AddWidget( const std::string& wi return widgetView; } -void WidgetViewManager::OnObjectViewAdded( Pepper::Compositor compositor, Pepper::ObjectView objectView ) -{ - std::string appId = objectView.GetAppId(); // widget instance id - - if( mWidgetViewContainer.size() > 0) - { - WidgetViewIter iter = mWidgetViewContainer.find( appId ); - if( iter != mWidgetViewContainer.end() ) - { - Dali::WidgetView::WidgetView widgetView = iter->second; - - Dali::WidgetView::GetImplementation( widgetView ).AddObjectView( objectView ); - } - } - - DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewAdded: ObjectView is added!\n" ); -} - -void WidgetViewManager::OnObjectViewDeleted( Pepper::Compositor compositor, Pepper::ObjectView objectView ) -{ - std::string appId = objectView.GetAppId(); // widget instance id - - // Remove from map - if( mWidgetViewContainer.size() > 0) - { - WidgetViewIter iter = mWidgetViewContainer.find( appId ); - if( iter != mWidgetViewContainer.end() ) - { - Dali::WidgetView::WidgetView widgetView = iter->second; - - Dali::WidgetView::GetImplementation( widgetView ).RemoveObjectView(); - - mWidgetViewContainer.erase( iter ); - } - } - - DALI_LOG_INFO( gWidgetViewManagerLogging, Debug::Verbose, "WidgetViewManager::OnObjectViewDeleted: ObjectView is deleted!\n" ); -} - int WidgetViewManager::WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data ) { WidgetViewManager* widgetViewManager = static_cast< WidgetViewManager* >( data ); diff --git a/internal/widget_view_manager/widget_view_manager_impl.h b/internal/widget_view_manager/widget_view_manager_impl.h index 059f75b..e1b8dd0 100644 --- a/internal/widget_view_manager/widget_view_manager_impl.h +++ b/internal/widget_view_manager/widget_view_manager_impl.h @@ -23,7 +23,6 @@ // EXTERNAL INCLUDES #include -#include #include namespace Dali @@ -69,9 +68,6 @@ private: */ int Initialize( Application application, const std::string& name ); - void OnObjectViewAdded( Pepper::Compositor compositor, Pepper::ObjectView objectView ); - void OnObjectViewDeleted( Pepper::Compositor compositor, Pepper::ObjectView objectView ); - static int WidgetEventCallback( const char* widgetId, const char* instanceId, int event, void* data ); private: @@ -84,8 +80,6 @@ private: private: - Pepper::Compositor mCompositor; - typedef std::map WidgetViewContainer; typedef WidgetViewContainer::iterator WidgetViewIter; -- 2.7.4