3 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
5 * Licensed under the Flora License, Version 1.1 (the License);
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an AS IS BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include <internal/widget_view/widget_view_impl.h>
24 #include <dali/public-api/common/stage.h>
25 #include <dali/public-api/events/touch-data.h>
26 #include <dali/public-api/events/wheel-event.h>
27 #include <dali/public-api/images/native-image.h>
28 #include <dali/public-api/object/type-registry.h>
29 #include <dali/public-api/object/type-registry-helper.h>
30 #include <dali-toolkit/public-api/visuals/visual-properties.h>
31 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
32 #include <dali/integration-api/debug.h>
34 #include <Ecore_Input.h>
35 #include <widget_service.h>
36 #include <widget_instance.h>
37 #include <tzplatform_config.h>
38 #include <wayland-extension/tizen-extension-client-protocol.h>
53 #if defined(DEBUG_ENABLED)
54 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
59 return Dali::BaseHandle();
62 // Setup properties, signals and actions using the type-registry.
63 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
64 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
65 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
66 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
75 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
76 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
77 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
83 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
84 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
85 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
88 DALI_TYPE_REGISTRATION_END()
90 struct wl_buffer* preBuffer;
92 static void OnBufferUpdated( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
93 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys,
94 const char *appid, const char *instance_id, const int pid, void *data)
96 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
100 if( !widgetView->IsWidgetImageView() )
102 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
104 widgetView->CreateWidgetImageView();
105 widgetView->ConnectSignal( surface );
108 //get tbm surface from buffer
109 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
110 widgetView->UpdateImageSource( tbmSurface );
113 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
115 tizen_remote_surface_release( surface, preBuffer );
120 close( img_file_fd );
123 static void OnBufferAdded( const char *appid, const char *instance_id, const int pid, void *data )
127 static void OnSurfaceRemoved( const char *appid, const char *instance_id, const int pid, void *data )
129 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
133 widgetView->CloseRemoteSurface();
137 } // unnamed namespace
139 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
141 // Create the implementation, temporarily owned on stack
142 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
144 // Pass ownership to CustomActor
145 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
147 // Second-phase init of the implementation
148 // This can only be done after the CustomActor connection has been made...
149 internalWidgetView->Initialize();
154 WidgetView::WidgetView()
155 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
163 mUpdatePeriod( 0.0 ),
164 mPreviewVisible( true ),
165 mStateTextVisible( true ),
166 mPermanentDelete( false ),
167 mWatcherHandle( NULL ),
168 mRemoteSurface( NULL )
172 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
173 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
174 mWidgetId( widgetId ),
176 mContentInfo( contentInfo ),
181 mUpdatePeriod( updatePeriod ),
182 mPreviewVisible( true ),
183 mStateTextVisible( true ),
184 mPermanentDelete( false ),
185 mWatcherHandle( NULL ),
186 mRemoteSurface( NULL )
190 WidgetView::~WidgetView()
192 if( !mWidgetId.empty() && !mInstanceId.empty() )
194 widget_instance_terminate( mInstanceId.c_str() );
196 if( mPermanentDelete )
198 widget_instance_destroy( mInstanceId.c_str() );
203 bool WidgetView::PauseWidget()
205 int ret = widget_instance_pause( mInstanceId.c_str() );
208 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
212 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
217 bool WidgetView::ResumeWidget()
219 int ret = widget_instance_resume( mInstanceId.c_str() );
222 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
226 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
231 const std::string& WidgetView::GetWidgetId() const
236 const std::string& WidgetView::GetInstanceId() const
241 const std::string& WidgetView::GetContentInfo()
243 widget_instance_h instance;
244 char* contentInfo = NULL;
246 mContentInfo.clear();
248 if( mWidgetId.empty() || mInstanceId.empty() )
250 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
254 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
257 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
261 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
263 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
267 mContentInfo = reinterpret_cast< char* >( contentInfo );
272 const std::string& WidgetView::GetTitle()
274 //ToDo: We should add some codes by considering widget_viewer_evas
277 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
280 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
285 float WidgetView::GetUpdatePeriod() const
287 return mUpdatePeriod;
290 bool WidgetView::CancelTouchEvent()
294 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
301 void WidgetView::ShowPreview( bool show )
303 if( mPreviewImage && show != mPreviewVisible )
305 mPreviewVisible = show;
306 mPreviewImage.SetVisible( show );
310 bool WidgetView::IsPreviewVisible()
312 return mPreviewVisible;
315 void WidgetView::ShowStateText( bool show )
317 if( mStateText && mStateTextVisible != show )
319 mStateTextVisible = show;
320 mStateText.SetVisible( show );
324 bool WidgetView::IsStateTextVisible()
326 return mStateTextVisible;
329 void WidgetView::ActivateFaultedWidget()
333 // Esable preview and text
334 if( mPreviewVisible )
336 mPreviewImage.SetVisible( true );
339 if( mStateTextVisible )
341 mStateText.SetVisible( true );
344 // launch widget again
345 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
348 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
351 Dali::WidgetView::WidgetView handle( GetOwner() );
352 mWidgetCreationAbortedSignal.Emit( handle );
357 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
361 bool WidgetView::IsWidgetFaulted()
363 return mPid < 0 ? true : false;
366 void WidgetView::SetPermanentDelete( bool permanentDelete )
368 mPermanentDelete = permanentDelete;
371 bool WidgetView::IsPermanentDelete()
373 return mPermanentDelete;
376 void WidgetView::CreateWidgetImageView()
379 mImageSource = Dali::NativeImageSource::New( source );
380 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
382 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
384 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
385 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
386 mWidgetImageView.SetSize( mWidth, mHeight );
388 Self().Add( mWidgetImageView );
390 //EFL app should be pre multiplied image.
391 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
393 // Disable preview and text
394 if( mPreviewVisible )
396 mPreviewImage.SetVisible( false );
399 if( mStateTextVisible )
401 mStateText.SetVisible( false );
405 Dali::WidgetView::WidgetView handle( GetOwner() );
406 mWidgetAddedSignal.Emit( handle );
408 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
411 void WidgetView::RemoveObjectView()
413 // Enable preview and text
414 if( mPreviewVisible )
416 mPreviewImage.SetVisible( true );
419 if( mStateTextVisible )
421 mStateText.SetVisible( true );
425 Dali::WidgetView::WidgetView handle( GetOwner() );
426 mWidgetDeletedSignal.Emit( handle );
428 mWidgetImageView.Reset();
430 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
433 void WidgetView::SendWidgetEvent( int event )
435 Dali::WidgetView::WidgetView handle( GetOwner() );
437 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
442 case WIDGET_INSTANCE_EVENT_UPDATE:
443 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
445 mWidgetContentUpdatedSignal.Emit( handle );
448 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
450 mWidgetUpdatePeriodChangedSignal.Emit( handle );
453 case WIDGET_INSTANCE_EVENT_FAULT:
455 mWidgetFaultedSignal.Emit( handle );
465 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
467 Dali::BaseHandle handle( object );
469 bool connected( true );
470 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
472 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
474 widgetView.WidgetAddedSignal().Connect( tracker, functor );
476 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
478 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
480 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
482 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
484 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
486 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
488 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
490 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
492 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
494 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
498 // signalName does not match any signal
505 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
509 Dali::BaseHandle handle( object );
510 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
517 WidgetView& impl = GetImplementation( widgetView );
519 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
523 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
527 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
529 impl.CancelTouchEvent();
531 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
533 impl.ActivateFaultedWidget();
543 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
545 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
549 WidgetView& impl = GetImplementation( widgetView );
553 case Dali::WidgetView::WidgetView::Property::PREVIEW:
556 if( value.Get( previewEnabled ) )
558 impl.ShowPreview( previewEnabled );
562 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
565 if( value.Get( textEnabled ) )
567 impl.ShowStateText( textEnabled );
571 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
574 if( value.Get( del ) )
576 impl.SetPermanentDelete( del );
584 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
586 Property::Value value;
587 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
591 WidgetView& impl = GetImplementation( widgetView );
595 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
597 value = impl.GetWidgetId();
600 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
602 value = impl.GetInstanceId();
605 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
607 value = impl.GetContentInfo();
610 case Dali::WidgetView::WidgetView::Property::TITLE:
612 value = impl.GetTitle();
615 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
617 value = impl.GetUpdatePeriod();
620 case Dali::WidgetView::WidgetView::Property::PREVIEW:
622 value = impl.IsPreviewVisible();
625 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
627 value = impl.IsStateTextVisible();
630 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
632 value = impl.IsWidgetFaulted();
635 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
637 value = impl.IsPermanentDelete();
646 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
648 return mWidgetAddedSignal;
651 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
653 return mWidgetDeletedSignal;
656 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
658 return mWidgetCreationAbortedSignal;
661 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
663 return mWidgetContentUpdatedSignal;
666 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
668 return mWidgetUpdatePeriodChangedSignal;
671 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
673 return mWidgetFaultedSignal;
676 void WidgetView::OnInitialize()
678 char* instanceId = NULL;
679 char* previewPath = NULL;
680 std::string previewImage;
681 widget_size_type_e sizeType;
682 screen_connector_toolkit_ops ops;
684 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
685 if( ret < 0 || !instanceId )
687 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
691 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
692 mWidgetId.c_str(), instanceId );
694 mInstanceId = instanceId;
697 widget_service_get_size_type( mWidth, mHeight, &sizeType );
699 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
702 previewImage = previewPath;
707 previewImage = WIDGET_VIEW_RESOURCE_DEFAULT_IMG;
710 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
712 mPreviewImage = Toolkit::ImageView::New( previewImage );
714 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
715 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
719 mPreviewImage.SetSize( mWidth, mHeight );
722 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
723 Self().SetSize( mWidth, mHeight );
725 Self().Add( mPreviewImage );
728 // TODO: use po files
729 mStateText = Toolkit::TextLabel::New( "Loading..." );
731 mStateText.SetParentOrigin( ParentOrigin::CENTER );
732 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
733 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
734 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
736 mPreviewImage.Add( mStateText );
739 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
742 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
745 Dali::WidgetView::WidgetView handle( GetOwner() );
746 mWidgetCreationAbortedSignal.Emit( handle );
751 ops.updated_cb = OnBufferUpdated;
752 ops.removed_cb = OnSurfaceRemoved;
753 ops.added_cb = OnBufferAdded;
754 mWatcherHandle = screen_connector_toolkit_add(&ops, (char *)instanceId, SCREEN_CONNECTOR_SCREEEN_TYPE_WIDGET, this);
755 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
759 void WidgetView::OnStageConnection( int depth )
761 Control::OnStageConnection( depth );
764 void WidgetView::OnStageDisconnection()
766 Control::OnStageDisconnection();
769 void WidgetView::OnSizeSet( const Vector3& targetSize )
771 if( mWidgetImageView )
773 mWidgetImageView.SetSize( targetSize );
777 bool WidgetView::IsWidgetImageView()
779 return ( mWidgetImageView )? true: false;
782 void WidgetView::UpdateImageSource( tbm_surface_h source )
784 mImageSource->SetSource( source );
785 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
788 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
790 if( mWidgetImageView && surface )
792 mRemoteSurface = surface;
794 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
795 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
800 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
802 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
804 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
809 switch( event.GetState( 0 ) )
811 case Dali::PointState::UP:
813 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
816 case Dali::PointState::DOWN:
818 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
821 case Dali::PointState::MOTION:
823 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
834 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
839 Vector2 localPos = event.GetLocalPosition( 0 );
841 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
847 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
848 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
849 wl_fixed_from_double( event.GetPressure( 0 ) ),
850 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
851 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
852 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
859 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
861 if( mRemoteSurface == NULL )
865 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
866 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
869 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
870 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
877 Vector3 WidgetView::GetNaturalSize()
883 if( size.x > 0 && size.y > 0 )
885 size.z = std::min( size.x, size.y );
890 return Control::GetNaturalSize();
894 float WidgetView::GetHeightForWidth( float width )
896 if( mWidth > 0 && mHeight > 0 )
898 return GetHeightForWidthBase( width );
902 return Control::GetHeightForWidthBase( width );
906 float WidgetView::GetWidthForHeight( float height )
908 if( mWidth > 0 && mHeight > 0 )
910 return GetWidthForHeightBase( height );
914 return Control::GetWidthForHeightBase( height );
918 void WidgetView::CloseRemoteSurface()
920 screen_connector_toolkit_remove( mWatcherHandle );
921 mRemoteSurface = NULL;
924 } // namespace Internal
926 } // namespace WidgetView