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 #define WIDGET_VIEW_RESOURCE_DEFAULT_IMG "/widget_viewer_dali/images/unknown.png"
55 #if defined(DEBUG_ENABLED)
56 Integration::Log::Filter* gWidgetViewLogging = Integration::Log::Filter::New( Debug::Verbose, false, "LOG_WIDGET_VIEW" );
61 return Dali::BaseHandle();
64 // Setup properties, signals and actions using the type-registry.
65 DALI_TYPE_REGISTRATION_BEGIN( Dali::WidgetView::WidgetView, Toolkit::Control, Create );
66 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetId", BOOLEAN, WIDGET_ID )
67 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "instanceId", BOOLEAN, INSTANCE_ID )
68 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "contentInfo", BOOLEAN, CONTENT_INFO )
69 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "title", BOOLEAN, TITLE )
70 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "updatePeriod", BOOLEAN, UPDATE_PERIOD )
71 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "preview", MAP, PREVIEW )
72 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "loadingText", MAP, LOADING_TEXT )
73 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "widgetStateFaulted", BOOLEAN, WIDGET_STATE_FAULTED )
74 DALI_PROPERTY_REGISTRATION( Dali::WidgetView, WidgetView, "permanentDelete", BOOLEAN, PERMANENT_DELETE )
77 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetAdded", SIGNAL_WIDGET_ADDED )
78 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetDeleted", SIGNAL_WIDGET_DELETED )
79 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetCreationAborted", SIGNAL_WIDGET_CREATION_ABORTED )
80 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetContentUpdated", SIGNAL_WIDGET_CONTENT_UPDATED )
81 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetUpdatePeriodChanged", SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED )
82 DALI_SIGNAL_REGISTRATION( Dali::WidgetView, WidgetView, "widgetFaulted", SIGNAL_WIDGET_FAULTED )
85 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "pauseWidget", ACTION_WIDGETVIEW_PAUSE_WIDGET );
86 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "resumeWidget", ACTION_WIDGETVIEW_RESUME_WIDGET );
87 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "cancelTouchEvent", ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT );
88 DALI_ACTION_REGISTRATION( Dali::WidgetView, WidgetView, "activateFaultedWidget", ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET );
90 DALI_TYPE_REGISTRATION_END()
92 struct wl_buffer* preBuffer;
94 static void OnBufferChanged( struct tizen_remote_surface *surface, uint32_t type, struct wl_buffer *buffer,
95 int32_t img_file_fd, uint32_t img_file_size, uint32_t time, struct wl_array *keys, void *data)
97 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
101 if( !widgetView->IsWidgetImageView() )
103 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
105 widgetView->CreateWidgetImageView();
106 widgetView->ConnectSignal( surface );
109 //get tbm surface from buffer
110 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
111 widgetView->UpdateImageSource( tbmSurface );
114 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
116 tizen_remote_surface_release( surface, preBuffer );
121 close( img_file_fd );
124 static void OnBufferUpdated( struct tizen_remote_surface* surface, wl_buffer* buffer, uint32_t time, void* data )
126 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
130 if( !widgetView->IsWidgetImageView() )
132 tizen_remote_surface_transfer_visibility( surface, TIZEN_REMOTE_SURFACE_VISIBILITY_TYPE_VISIBLE);
134 widgetView->CreateWidgetImageView();
135 widgetView->ConnectSignal( surface );
138 //get tbm surface from buffer
139 tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
140 widgetView->UpdateImageSource( tbmSurface );
143 if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
145 tizen_remote_surface_release( surface, preBuffer );
151 static void OnSurfaceMissing( struct tizen_remote_surface* surface, void* data )
153 Dali::WidgetView::Internal::WidgetView* widgetView = static_cast< Dali::WidgetView::Internal::WidgetView* >( data );
157 widgetView->CloseRemoteSurface();
161 } // unnamed namespace
163 Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
165 // Create the implementation, temporarily owned on stack
166 IntrusivePtr< WidgetView > internalWidgetView = new WidgetView( widgetId, contentInfo, width, height, updatePeriod );
168 // Pass ownership to CustomActor
169 Dali::WidgetView::WidgetView widgetView( *internalWidgetView );
171 // Second-phase init of the implementation
172 // This can only be done after the CustomActor connection has been made...
173 internalWidgetView->Initialize();
178 WidgetView::WidgetView()
179 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
187 mUpdatePeriod( 0.0 ),
188 mPreviewVisible( true ),
189 mStateTextVisible( true ),
190 mPermanentDelete( false ),
191 mWatcherHandle( NULL ),
192 mRemoteSurface( NULL )
196 WidgetView::WidgetView( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
197 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS ) ),
198 mWidgetId( widgetId ),
200 mContentInfo( contentInfo ),
205 mUpdatePeriod( updatePeriod ),
206 mPreviewVisible( true ),
207 mStateTextVisible( true ),
208 mPermanentDelete( false ),
209 mWatcherHandle( NULL ),
210 mRemoteSurface( NULL )
214 WidgetView::~WidgetView()
216 if( !mWidgetId.empty() && !mInstanceId.empty() )
218 widget_instance_terminate( mInstanceId.c_str() );
220 if( mPermanentDelete )
222 widget_instance_destroy( mInstanceId.c_str() );
227 bool WidgetView::PauseWidget()
229 int ret = widget_instance_pause( mInstanceId.c_str() );
232 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Fail to pause widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
236 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::PauseWidget: Widget is paused (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
241 bool WidgetView::ResumeWidget()
243 int ret = widget_instance_resume( mInstanceId.c_str() );
246 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Fail to resume widget(%s, %s) [%d]\n", mWidgetId.c_str(), mInstanceId.c_str(), ret );
250 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ResumeWidget: Widget is resumed (%s, %s)\n", mWidgetId.c_str(), mInstanceId.c_str() );
255 const std::string& WidgetView::GetWidgetId() const
260 const std::string& WidgetView::GetInstanceId() const
265 const std::string& WidgetView::GetContentInfo()
267 widget_instance_h instance;
268 char* contentInfo = NULL;
270 mContentInfo.clear();
272 if( mWidgetId.empty() || mInstanceId.empty() )
274 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Widget id (%s) or instance id (%s) is invalid.\n", mWidgetId.c_str(), mInstanceId.c_str() );
278 instance = widget_instance_get_instance( mWidgetId.c_str(), mInstanceId.c_str() );
281 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: widget_instance_get_instance is failed. [%s]\n", mInstanceId.c_str() );
285 if( widget_instance_get_content( instance, &contentInfo ) < 0 )
287 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetContentInfo: Failed to get content of widget. [%s]\n", mInstanceId.c_str() );
291 mContentInfo = reinterpret_cast< char* >( contentInfo );
296 const std::string& WidgetView::GetTitle()
298 //ToDo: We should add some codes by considering widget_viewer_evas
301 mTitle = widget_service_get_name( mWidgetId.c_str(), NULL );
304 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::GetTitle: title = %s\n", mTitle.c_str() );
309 float WidgetView::GetUpdatePeriod() const
311 return mUpdatePeriod;
314 bool WidgetView::CancelTouchEvent()
318 tizen_remote_surface_transfer_touch_cancel( mRemoteSurface );
325 void WidgetView::ShowPreview( bool show )
327 if( mPreviewImage && show != mPreviewVisible )
329 mPreviewVisible = show;
330 mPreviewImage.SetVisible( show );
334 bool WidgetView::IsPreviewVisible()
336 return mPreviewVisible;
339 void WidgetView::ShowStateText( bool show )
341 if( mStateText && mStateTextVisible != show )
343 mStateTextVisible = show;
344 mStateText.SetVisible( show );
348 bool WidgetView::IsStateTextVisible()
350 return mStateTextVisible;
353 void WidgetView::ActivateFaultedWidget()
357 // Esable preview and text
358 if( mPreviewVisible )
360 mPreviewImage.SetVisible( true );
363 if( mStateTextVisible )
365 mStateText.SetVisible( true );
368 // launch widget again
369 mPid = widget_instance_launch( mInstanceId.c_str(), (char *)mContentInfo.c_str(), mWidth, mHeight );
372 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
375 Dali::WidgetView::WidgetView handle( GetOwner() );
376 mWidgetCreationAbortedSignal.Emit( handle );
381 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::ActivateFaultedWidget: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
385 bool WidgetView::IsWidgetFaulted()
387 return mPid < 0 ? true : false;
390 void WidgetView::SetPermanentDelete( bool permanentDelete )
392 mPermanentDelete = permanentDelete;
395 bool WidgetView::IsPermanentDelete()
397 return mPermanentDelete;
400 void WidgetView::CreateWidgetImageView()
403 mImageSource = Dali::NativeImageSource::New( source );
404 Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
406 mWidgetImageView = Dali::Toolkit::ImageView::New( image );
408 mWidgetImageView.SetParentOrigin( ParentOrigin::CENTER );
409 mWidgetImageView.SetAnchorPoint( AnchorPoint::CENTER );
410 mWidgetImageView.SetSize( mWidth, mHeight );
412 Self().Add( mWidgetImageView );
414 //EFL app should be pre multiplied image.
415 mWidgetImageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
417 // Disable preview and text
418 if( mPreviewVisible )
420 mPreviewImage.SetVisible( false );
423 if( mStateTextVisible )
425 mStateText.SetVisible( false );
429 Dali::WidgetView::WidgetView handle( GetOwner() );
430 mWidgetAddedSignal.Emit( handle );
432 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::AddObjectView: ObjectView is added.\n" );
435 void WidgetView::RemoveObjectView()
437 // Enable preview and text
438 if( mPreviewVisible )
440 mPreviewImage.SetVisible( true );
443 if( mStateTextVisible )
445 mStateText.SetVisible( true );
449 Dali::WidgetView::WidgetView handle( GetOwner() );
450 mWidgetDeletedSignal.Emit( handle );
452 mWidgetImageView.Reset();
454 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::RemoveObjectView: ObjectView is removed.\n" );
457 void WidgetView::SendWidgetEvent( int event )
459 Dali::WidgetView::WidgetView handle( GetOwner() );
461 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::SendWidgetEvent: event = %d widget = %s\n", event, mWidgetId.c_str() );
466 case WIDGET_INSTANCE_EVENT_UPDATE:
467 case WIDGET_INSTANCE_EVENT_EXTRA_UPDATED:
469 mWidgetContentUpdatedSignal.Emit( handle );
472 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
474 mWidgetUpdatePeriodChangedSignal.Emit( handle );
477 case WIDGET_INSTANCE_EVENT_FAULT:
479 mWidgetFaultedSignal.Emit( handle );
489 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
491 Dali::BaseHandle handle( object );
493 bool connected( true );
494 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
496 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
498 widgetView.WidgetAddedSignal().Connect( tracker, functor );
500 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
502 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
504 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
506 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
508 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
510 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
512 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
514 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
516 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
518 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
522 // signalName does not match any signal
529 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
533 Dali::BaseHandle handle( object );
534 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
541 WidgetView& impl = GetImplementation( widgetView );
543 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
547 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
551 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
553 impl.CancelTouchEvent();
555 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
557 impl.ActivateFaultedWidget();
567 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
569 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
573 WidgetView& impl = GetImplementation( widgetView );
577 case Dali::WidgetView::WidgetView::Property::PREVIEW:
580 if( value.Get( previewEnabled ) )
582 impl.ShowPreview( previewEnabled );
586 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
589 if( value.Get( textEnabled ) )
591 impl.ShowStateText( textEnabled );
595 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
598 if( value.Get( del ) )
600 impl.SetPermanentDelete( del );
608 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
610 Property::Value value;
611 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
615 WidgetView& impl = GetImplementation( widgetView );
619 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
621 value = impl.GetWidgetId();
624 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
626 value = impl.GetInstanceId();
629 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
631 value = impl.GetContentInfo();
634 case Dali::WidgetView::WidgetView::Property::TITLE:
636 value = impl.GetTitle();
639 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
641 value = impl.GetUpdatePeriod();
644 case Dali::WidgetView::WidgetView::Property::PREVIEW:
646 value = impl.IsPreviewVisible();
649 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
651 value = impl.IsStateTextVisible();
654 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
656 value = impl.IsWidgetFaulted();
659 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
661 value = impl.IsPermanentDelete();
670 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
672 return mWidgetAddedSignal;
675 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
677 return mWidgetDeletedSignal;
680 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
682 return mWidgetCreationAbortedSignal;
685 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
687 return mWidgetContentUpdatedSignal;
690 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
692 return mWidgetUpdatePeriodChangedSignal;
695 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
697 return mWidgetFaultedSignal;
700 void WidgetView::OnInitialize()
702 char* instanceId = NULL;
703 char* previewPath = NULL;
704 std::string previewImage;
705 widget_size_type_e sizeType;
706 screen_connector_watcher_ops ops;
708 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
709 if( ret < 0 || !instanceId )
711 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
715 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
716 mWidgetId.c_str(), instanceId );
718 mInstanceId = instanceId;
721 widget_service_get_size_type( mWidth, mHeight, &sizeType );
723 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
726 previewImage = previewPath;
731 previewImage = tzplatform_getenv( TZ_SYS_SHARE );
732 previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
735 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
737 mPreviewImage = Toolkit::ImageView::New( previewImage );
739 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
740 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
744 mPreviewImage.SetSize( mWidth, mHeight );
747 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
748 Self().SetSize( mWidth, mHeight );
750 Self().Add( mPreviewImage );
753 // TODO: use po files
754 mStateText = Toolkit::TextLabel::New( "Loading..." );
756 mStateText.SetParentOrigin( ParentOrigin::CENTER );
757 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
758 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
759 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
761 mPreviewImage.Add( mStateText );
764 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
767 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
770 Dali::WidgetView::WidgetView handle( GetOwner() );
771 mWidgetCreationAbortedSignal.Emit( handle );
776 ops.change_cb = OnBufferChanged;
777 ops.missing_cb = OnSurfaceMissing;
778 ops.update_cb = OnBufferUpdated;
779 mWatcherHandle = screen_connector_watcher_add(&ops, (char *)mWidgetId.c_str(), this);
780 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
784 void WidgetView::OnStageConnection( int depth )
786 Control::OnStageConnection( depth );
789 void WidgetView::OnStageDisconnection()
791 Control::OnStageDisconnection();
794 void WidgetView::OnSizeSet( const Vector3& targetSize )
796 if( mWidgetImageView )
798 mWidgetImageView.SetSize( targetSize );
802 bool WidgetView::IsWidgetImageView()
804 return ( mWidgetImageView )? true: false;
807 void WidgetView::UpdateImageSource( tbm_surface_h source )
809 mImageSource->SetSource( source );
810 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
813 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
815 if( mWidgetImageView && surface )
817 mRemoteSurface = surface;
819 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
820 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
825 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
827 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
829 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
834 switch( event.GetState( 0 ) )
836 case Dali::PointState::UP:
838 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
841 case Dali::PointState::DOWN:
843 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
846 case Dali::PointState::MOTION:
848 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
859 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
864 Vector2 localPos = event.GetLocalPosition( 0 );
866 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
872 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
873 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
874 wl_fixed_from_double( event.GetPressure( 0 ) ),
875 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
876 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
877 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
884 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
886 if( mRemoteSurface == NULL )
890 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
891 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
894 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
895 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
902 Vector3 WidgetView::GetNaturalSize()
908 if( size.x > 0 && size.y > 0 )
910 size.z = std::min( size.x, size.y );
915 return Control::GetNaturalSize();
919 float WidgetView::GetHeightForWidth( float width )
921 if( mWidth > 0 && mHeight > 0 )
923 return GetHeightForWidthBase( width );
927 return Control::GetHeightForWidthBase( width );
931 float WidgetView::GetWidthForHeight( float height )
933 if( mWidth > 0 && mHeight > 0 )
935 return GetWidthForHeightBase( height );
939 return Control::GetWidthForHeightBase( height );
943 void WidgetView::CloseRemoteSurface()
945 screen_connector_watcher_remove( mWatcherHandle );
946 mRemoteSurface = NULL;
949 } // namespace Internal
951 } // namespace WidgetView