718 |
723 |
719 void SetActive() {iStatus = KRequestPending; CActive::SetActive();}; |
724 void SetActive() {iStatus = KRequestPending; CActive::SetActive();}; |
720 |
725 |
721 void RunL() |
726 void RunL() |
722 { |
727 { |
723 if( iStatus == KErrNone ) |
728 if( iStatus != KErrCancel ) |
724 { |
729 { |
725 SetActive(); |
730 SetActive(); |
726 if( !iPixelSource.DrawFrameL(iStatus, iBufferNumber) ) |
731 if( !iPixelSource.DrawFrameL(iStatus, iBufferNumber) ) |
727 { |
732 { |
728 __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pause"); |
733 __ALFLOGSTRING( "CSurfaceUpdateCallBack::RunL - DrawFrameL returned EFalse -> Pausing"); |
729 TRequestStatus* status = &iStatus; |
734 TRequestStatus* status = &iStatus; |
730 User::RequestComplete(status, KErrNone); |
735 User::RequestComplete(status, KErrCancel); |
731 Cancel(); |
736 Cancel(); |
732 } |
737 } |
733 } |
738 } |
734 else |
|
735 { |
|
736 __ALFLOGSTRING1("CSurfaceUpdateCallBack::RunL %d", iStatus.Int()); |
|
737 iPixelSource.Suspend(); |
|
738 } |
|
739 |
|
740 |
|
741 }; |
739 }; |
742 void DoCancel() { }; |
740 void DoCancel() |
743 |
741 { |
|
742 }; |
|
743 |
744 private: // Data |
744 private: // Data |
745 CAlfCompositionPixelSource& iPixelSource; |
745 CAlfCompositionPixelSource& iPixelSource; |
746 TInt iBufferNumber; |
746 TInt iBufferNumber; |
747 }; |
747 }; |
748 |
748 |
834 // |
836 // |
835 EXPORT_C CAlfCompositionPixelSource* CAlfCompositionPixelSource::NewL(MAlfBufferProvider& aProvider, RWindow* aWindow) |
837 EXPORT_C CAlfCompositionPixelSource* CAlfCompositionPixelSource::NewL(MAlfBufferProvider& aProvider, RWindow* aWindow) |
836 { |
838 { |
837 CAlfCompositionPixelSource* me = new (ELeave) CAlfCompositionPixelSource(); |
839 CAlfCompositionPixelSource* me = new (ELeave) CAlfCompositionPixelSource(); |
838 CleanupStack::PushL(me); |
840 CleanupStack::PushL(me); |
839 me->ConstructL(aProvider, aWindow); |
841 me->ConstructL(aProvider, CActive::EPriorityIdle, aWindow); |
840 CleanupStack::Pop(me); |
842 CleanupStack::Pop(me); |
841 return me; |
843 return me; |
842 } |
844 } |
|
845 |
|
846 // --------------------------------------------------------------------------- |
|
847 // CAlfCompositionPixelSource::NewL |
|
848 // --------------------------------------------------------------------------- |
|
849 // |
|
850 EXPORT_C CAlfCompositionPixelSource* CAlfCompositionPixelSource::NewL(MAlfBufferProvider& aProvider, TInt aPriority, RWindow* aWindow) |
|
851 { |
|
852 CAlfCompositionPixelSource* me = new (ELeave) CAlfCompositionPixelSource(); |
|
853 CleanupStack::PushL(me); |
|
854 me->ConstructL(aProvider, aPriority, aWindow); |
|
855 CleanupStack::Pop(me); |
|
856 return me; |
|
857 } |
|
858 |
843 |
859 |
844 // --------------------------------------------------------------------------- |
860 // --------------------------------------------------------------------------- |
845 // CAlfCompositionPixelSource::ActivateL |
861 // CAlfCompositionPixelSource::ActivateL |
846 // --------------------------------------------------------------------------- |
862 // --------------------------------------------------------------------------- |
847 // |
863 // |
871 |
887 |
872 if( iData->iSourceStatus != CAlfCompositionPixelSourceData::EActive ) |
888 if( iData->iSourceStatus != CAlfCompositionPixelSourceData::EActive ) |
873 { |
889 { |
874 if( !iData->iSurfaceUpdateWaiter ) |
890 if( !iData->iSurfaceUpdateWaiter ) |
875 { |
891 { |
876 iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, CActive::EPriorityIdle ); |
892 iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority ); |
877 } |
893 } |
878 |
894 |
879 iData->iSurfaceUpdateWaiter->SetActive(); |
895 iData->iSurfaceUpdateWaiter->SetActive(); |
880 TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus; |
896 TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus; |
881 User::RequestComplete(status, KErrNone); |
897 User::RequestComplete(status, KErrNone); |
884 iData->iSourceStatus = CAlfCompositionPixelSourceData::EActive; |
900 iData->iSourceStatus = CAlfCompositionPixelSourceData::EActive; |
885 } |
901 } |
886 |
902 |
887 // do nothing if content was already active |
903 // do nothing if content was already active |
888 } |
904 } |
889 |
905 |
|
906 // --------------------------------------------------------------------------- |
|
907 // CAlfCompositionPixelSource::ActivateSyncL |
|
908 // --------------------------------------------------------------------------- |
|
909 // |
|
910 EXPORT_C void CAlfCompositionPixelSource::ActivateSyncL() |
|
911 { |
|
912 if( !iData->iWindow && iData->iSurfaceId.IsNull() ) |
|
913 { |
|
914 User::Leave(KErrNotReady); |
|
915 } |
|
916 TBool pause = EFalse; |
|
917 if( iData->iSourceStatus == CAlfCompositionPixelSourceData::ESuspended ) |
|
918 { |
|
919 MAlfBufferProvider::TBufferCreationAttributes& creationAttribs = iData->iProvider.BufferAttributes(); |
|
920 |
|
921 iData->iSurfaceRect = TRect(TPoint(0,0), TSize(creationAttribs.iWidth, creationAttribs.iHeight)); |
|
922 |
|
923 ConstructSurfaceL(creationAttribs); |
|
924 |
|
925 User::LeaveIfError( iData->iSurfaceUpdateSession.Connect() ); |
|
926 |
|
927 // update surface buffer before setting surface as background surface |
|
928 if( !iData->iSurfaceUpdateWaiter ) |
|
929 { |
|
930 iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority ); |
|
931 } |
|
932 |
|
933 iData->iSurfaceUpdateWaiter->SetActive(); |
|
934 pause = !DrawFrameL(iData->iSurfaceUpdateWaiter->iStatus ,0); |
|
935 if(pause && iData->iSurfaceUpdateWaiter->IsActive()) |
|
936 { |
|
937 TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus; |
|
938 User::RequestComplete(status, KErrCancel); |
|
939 iData->iSurfaceUpdateWaiter->Cancel(); |
|
940 } |
|
941 |
|
942 iData->iWindow->SetBackgroundSurface(iData->iSurfaceId); |
|
943 |
|
944 TInt array[] = { 0, iData->iWindow->ClientHandle(), iData->iWindow->WindowGroupId() }; |
|
945 TInt handle = SendEvent(KAlfCompOpCreateSource, array, sizeof(array)); |
|
946 CAlfCompositionClientBase::SetHandleL( handle ); |
|
947 } |
|
948 |
|
949 if( iData->iSourceStatus != CAlfCompositionPixelSourceData::EActive && !pause ) |
|
950 { |
|
951 |
|
952 if( !iData->iSurfaceUpdateWaiter ) |
|
953 { |
|
954 iData->iSurfaceUpdateWaiter = new (ELeave) CSurfaceUpdateCallback( *this, 0, iData->iWaiterAoPriority ); |
|
955 } |
|
956 |
|
957 if(!iData->iSurfaceUpdateWaiter->IsActive()) |
|
958 { |
|
959 iData->iSurfaceUpdateWaiter->SetActive(); |
|
960 TRequestStatus* status = &iData->iSurfaceUpdateWaiter->iStatus; |
|
961 User::RequestComplete(status, KErrNone); |
|
962 } |
|
963 iData->iProvider.OnActivation(); |
|
964 iData->iSourceStatus = CAlfCompositionPixelSourceData::EActive; |
|
965 } |
|
966 |
|
967 // do nothing if content was already active and running |
|
968 } |
|
969 |
890 // --------------------------------------------------------------------------- |
970 // --------------------------------------------------------------------------- |
891 // CAlfCompositionPixelSource::Suspend |
971 // CAlfCompositionPixelSource::Suspend |
892 // --------------------------------------------------------------------------- |
972 // --------------------------------------------------------------------------- |
893 // |
973 // |
894 EXPORT_C void CAlfCompositionPixelSource::Suspend() |
974 EXPORT_C void CAlfCompositionPixelSource::Suspend() |
959 |
1039 |
960 // --------------------------------------------------------------------------- |
1040 // --------------------------------------------------------------------------- |
961 // CAlfCompositionPixelSource::ConstructL |
1041 // CAlfCompositionPixelSource::ConstructL |
962 // --------------------------------------------------------------------------- |
1042 // --------------------------------------------------------------------------- |
963 // |
1043 // |
964 void CAlfCompositionPixelSource::ConstructL(MAlfBufferProvider& aProvider, RWindow* aWindow) |
1044 void CAlfCompositionPixelSource::ConstructL(MAlfBufferProvider& aProvider, TInt aPriority, RWindow* aWindow) |
965 { |
1045 { |
966 iData = CAlfCompositionPixelSourceData::NewL( aProvider ); |
1046 iData = CAlfCompositionPixelSourceData::NewL( aProvider ); |
|
1047 iData->iWaiterAoPriority = aPriority; |
|
1048 |
967 TInt screenNumber = KErrNotFound; |
1049 TInt screenNumber = KErrNotFound; |
968 if( aWindow ) |
1050 if( aWindow ) |
969 { |
1051 { |
970 iData->iWindow = aWindow; |
1052 iData->iWindow = aWindow; |
971 screenNumber = aWindow->ScreenNumber(); |
1053 screenNumber = aWindow->ScreenNumber(); |