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:
468 mWidgetContentUpdatedSignal.Emit( handle );
471 case WIDGET_INSTANCE_EVENT_PERIOD_CHANGED:
473 mWidgetUpdatePeriodChangedSignal.Emit( handle );
476 case WIDGET_INSTANCE_EVENT_FAULT:
478 mWidgetFaultedSignal.Emit( handle );
488 bool WidgetView::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
490 Dali::BaseHandle handle( object );
492 bool connected( true );
493 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
495 if( strcmp( signalName.c_str(), SIGNAL_WIDGET_ADDED ) == 0 )
497 widgetView.WidgetAddedSignal().Connect( tracker, functor );
499 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_DELETED ) == 0 )
501 widgetView.WidgetDeletedSignal().Connect( tracker, functor );
503 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CREATION_ABORTED ) == 0 )
505 widgetView.WidgetCreationAbortedSignal().Connect( tracker, functor );
507 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_CONTENT_UPDATED ) == 0 )
509 widgetView.WidgetContentUpdatedSignal().Connect( tracker, functor );
511 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_UPDATE_PERIOD_CHANGED ) == 0 )
513 widgetView.WidgetUpdatePeriodChangedSignal().Connect( tracker, functor );
515 else if( strcmp( signalName.c_str(), SIGNAL_WIDGET_FAULTED ) == 0 )
517 widgetView.WidgetFaultedSignal().Connect( tracker, functor );
521 // signalName does not match any signal
528 bool WidgetView::DoAction( BaseObject* object, const std::string& actionName, const Property::Map& attributes )
532 Dali::BaseHandle handle( object );
533 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( handle );
540 WidgetView& impl = GetImplementation( widgetView );
542 if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_PAUSE_WIDGET ) == 0 )
546 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_RESUME_WIDGET ) == 0 )
550 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_CANCEL_TOUCH_EVENT ) == 0 )
552 impl.CancelTouchEvent();
554 else if( strcmp( actionName.c_str(), ACTION_WIDGETVIEW_ACTIVATE_FAULTED_WIDGET ) == 0 )
556 impl.ActivateFaultedWidget();
566 void WidgetView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
568 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
572 WidgetView& impl = GetImplementation( widgetView );
576 case Dali::WidgetView::WidgetView::Property::PREVIEW:
579 if( value.Get( previewEnabled ) )
581 impl.ShowPreview( previewEnabled );
585 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
588 if( value.Get( textEnabled ) )
590 impl.ShowStateText( textEnabled );
594 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
597 if( value.Get( del ) )
599 impl.SetPermanentDelete( del );
607 Property::Value WidgetView::GetProperty( BaseObject* object, Property::Index index )
609 Property::Value value;
610 Dali::WidgetView::WidgetView widgetView = Dali::WidgetView::WidgetView::DownCast( Dali::BaseHandle( object ) );
614 WidgetView& impl = GetImplementation( widgetView );
618 case Dali::WidgetView::WidgetView::Property::WIDGET_ID:
620 value = impl.GetWidgetId();
623 case Dali::WidgetView::WidgetView::Property::INSTANCE_ID:
625 value = impl.GetInstanceId();
628 case Dali::WidgetView::WidgetView::Property::CONTENT_INFO:
630 value = impl.GetContentInfo();
633 case Dali::WidgetView::WidgetView::Property::TITLE:
635 value = impl.GetTitle();
638 case Dali::WidgetView::WidgetView::Property::UPDATE_PERIOD:
640 value = impl.GetUpdatePeriod();
643 case Dali::WidgetView::WidgetView::Property::PREVIEW:
645 value = impl.IsPreviewVisible();
648 case Dali::WidgetView::WidgetView::Property::LOADING_TEXT:
650 value = impl.IsStateTextVisible();
653 case Dali::WidgetView::WidgetView::Property::WIDGET_STATE_FAULTED:
655 value = impl.IsWidgetFaulted();
658 case Dali::WidgetView::WidgetView::Property::PERMANENT_DELETE:
660 value = impl.IsPermanentDelete();
669 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetAddedSignal()
671 return mWidgetAddedSignal;
674 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetDeletedSignal()
676 return mWidgetDeletedSignal;
679 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetCreationAbortedSignal()
681 return mWidgetCreationAbortedSignal;
684 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetContentUpdatedSignal()
686 return mWidgetContentUpdatedSignal;
689 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetUpdatePeriodChangedSignal()
691 return mWidgetUpdatePeriodChangedSignal;
694 Dali::WidgetView::WidgetView::WidgetViewSignalType& WidgetView::WidgetFaultedSignal()
696 return mWidgetFaultedSignal;
699 void WidgetView::OnInitialize()
701 char* instanceId = NULL;
702 char* previewPath = NULL;
703 std::string previewImage;
704 widget_size_type_e sizeType;
705 screen_connector_watcher_ops ops;
707 int ret = widget_instance_create( mWidgetId.c_str(), &instanceId );
708 if( ret < 0 || !instanceId )
710 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is failed [%s].\n", mWidgetId.c_str() );
714 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_create is called. [widget id = %s, instance id = %s]\n",
715 mWidgetId.c_str(), instanceId );
717 mInstanceId = instanceId;
720 widget_service_get_size_type( mWidth, mHeight, &sizeType );
722 previewPath = widget_service_get_preview_image_path( mWidgetId.c_str(), sizeType );
725 previewImage = previewPath;
730 previewImage = tzplatform_getenv( TZ_SYS_SHARE );
731 previewImage.append( WIDGET_VIEW_RESOURCE_DEFAULT_IMG );
734 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: preview image path = %s\n", previewImage.c_str() );
736 mPreviewImage = Toolkit::ImageView::New( previewImage );
738 mPreviewImage.SetParentOrigin( ParentOrigin::CENTER );
739 mPreviewImage.SetAnchorPoint( AnchorPoint::CENTER );
743 mPreviewImage.SetSize( mWidth, mHeight );
746 Self().SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
747 Self().SetSize( mWidth, mHeight );
749 Self().Add( mPreviewImage );
752 // TODO: use po files
753 mStateText = Toolkit::TextLabel::New( "Loading..." );
755 mStateText.SetParentOrigin( ParentOrigin::CENTER );
756 mStateText.SetAnchorPoint( AnchorPoint::CENTER );
757 mStateText.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
758 mStateText.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
760 mPreviewImage.Add( mStateText );
763 mPid = widget_instance_launch( instanceId, (char *)mContentInfo.c_str(), mWidth, mHeight );
766 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is failed. [%s]\n", mWidgetId.c_str() );
769 Dali::WidgetView::WidgetView handle( GetOwner() );
770 mWidgetCreationAbortedSignal.Emit( handle );
775 ops.change_cb = OnBufferChanged;
776 ops.missing_cb = OnSurfaceMissing;
777 ops.update_cb = OnBufferUpdated;
778 mWatcherHandle = screen_connector_watcher_add(&ops, (char *)mWidgetId.c_str(), this);
779 DALI_LOG_INFO( gWidgetViewLogging, Debug::Verbose, "WidgetView::OnInitialize: widget_instance_launch is called. [%s, mPid = %d]\n", mWidgetId.c_str(), mPid );
783 void WidgetView::OnStageConnection( int depth )
785 Control::OnStageConnection( depth );
788 void WidgetView::OnStageDisconnection()
790 Control::OnStageDisconnection();
793 void WidgetView::OnSizeSet( const Vector3& targetSize )
795 if( mWidgetImageView )
797 mWidgetImageView.SetSize( targetSize );
801 bool WidgetView::IsWidgetImageView()
803 return ( mWidgetImageView )? true: false;
806 void WidgetView::UpdateImageSource( tbm_surface_h source )
808 mImageSource->SetSource( source );
809 Dali::Stage::GetCurrent().KeepRendering( 0.0f );
812 void WidgetView::ConnectSignal( tizen_remote_surface* surface )
814 if( mWidgetImageView && surface )
816 mRemoteSurface = surface;
818 Self().TouchSignal().Connect( this, &WidgetView::OnTouch );
819 Self().WheelEventSignal().Connect( this, &WidgetView::OnWheelEvent );
824 bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchData& event )
826 tizen_remote_surface_event_type type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_NONE;
828 if( event.GetPointCount() == 0 || mRemoteSurface == NULL )
833 switch( event.GetState( 0 ) )
835 case Dali::PointState::UP:
837 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_UP;
840 case Dali::PointState::DOWN:
842 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_DOWN;
845 case Dali::PointState::MOTION:
847 type = TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE;
858 if( type == TIZEN_REMOTE_SURFACE_EVENT_TYPE_MOUSE_MOVE )
863 Vector2 localPos = event.GetLocalPosition( 0 );
865 tizen_remote_surface_transfer_mouse_event( mRemoteSurface,
871 wl_fixed_from_double( event.GetEllipseRadius( 0 ).x ),
872 wl_fixed_from_double( event.GetEllipseRadius( 0 ).y ),
873 wl_fixed_from_double( event.GetPressure( 0 ) ),
874 wl_fixed_from_double( event.GetAngle( 0 ).degree ),
875 TIZEN_INPUT_DEVICE_CLAS_TOUCHSCREEN,
876 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
883 bool WidgetView::OnWheelEvent( Dali::Actor actor, const Dali::WheelEvent& event )
885 if( mRemoteSurface == NULL )
889 //ToDo: We should check TIZEN_INPUT_DEVICE_CLAS_MOUSE
890 tizen_remote_surface_transfer_mouse_wheel( mRemoteSurface,
893 TIZEN_INPUT_DEVICE_CLAS_MOUSE,
894 TIZEN_INPUT_DEVICE_SUBCLAS_NONE,
901 Vector3 WidgetView::GetNaturalSize()
907 if( size.x > 0 && size.y > 0 )
909 size.z = std::min( size.x, size.y );
914 return Control::GetNaturalSize();
918 float WidgetView::GetHeightForWidth( float width )
920 if( mWidth > 0 && mHeight > 0 )
922 return GetHeightForWidthBase( width );
926 return Control::GetHeightForWidthBase( width );
930 float WidgetView::GetWidthForHeight( float height )
932 if( mWidth > 0 && mHeight > 0 )
934 return GetWidthForHeightBase( height );
938 return Control::GetWidthForHeightBase( height );
942 void WidgetView::CloseRemoteSurface()
944 screen_connector_watcher_remove( mWatcherHandle );
945 mRemoteSurface = NULL;
948 } // namespace Internal
950 } // namespace WidgetView