diff -r ebd48d2de13c -r ecbabf52600f textinput/peninputarc/src/peninputserverapp/peninputserver.cpp --- a/textinput/peninputarc/src/peninputserverapp/peninputserver.cpp Tue Aug 31 15:31:50 2010 +0300 +++ b/textinput/peninputarc/src/peninputserverapp/peninputserver.cpp Wed Sep 01 12:23:33 2010 +0100 @@ -47,6 +47,7 @@ #include #include "peninputcrpclient.h" +#include //#define __WND_TEST_ // CONSTANTS @@ -56,6 +57,11 @@ const TInt KWsSessionFlushPerioid = 50000;//50ms const TInt KInvalidValue = -1; +// Layout UID for portrait FSQ. Used for distinguish between +// landscape and portrait FSQ for EPluginInputModeFSQ, which +// is used for both orientation in Pen Input server side code. +const TInt KPenInputSrvPrtFsqUiId = 0x20026837; + enum TActivationFlag { @@ -186,6 +192,7 @@ //iDispMode = iDispModeForMask= CCoeEnv::Static()->WsSession().GetDefModeMaxNumColors(col,grey); iPreNonGloebalNotesWndGrpId = -1; iNoNeedClean = EFalse; + iEnablePriorityChangeOnOriChange = ETrue; } @@ -211,9 +218,7 @@ void CPeninputServer::ConstructL( ) { #ifdef RD_TACTILE_FEEDBACK - //KS: QUICK FIX FOR EGSN-7BCBWS FeatureManager::InitializeLibL(); - //KS: QUICK FIX FOR EGSN-7BCBWS iSupportFeedback = FeatureManager::FeatureSupported( KFeatureIdTactileFeedback ); #endif //RD_TACTILE_FEEDBACK @@ -264,6 +269,19 @@ iCurScrMode = CCoeEnv::Static()->ScreenDevice()->CurrentScreenMode(); iCrpService = CPenInputCrpServiceClient::NewL(); iSensorRepository = CRepository::NewL(KCRUidSensorSettings); + User::LeaveIfError(iDiscreetPopProperty.Attach(KPSUidAvkonDomain, + KAknGlobalDiscreetPopupNumChanged)); + iDiscreetPopSubscriber = new (ELeave) CSubscriber( + TCallBack( DiscreetPopChangeNotification, this), + iDiscreetPopProperty); + iDiscreetPopSubscriber->SubscribeL(); + // Get the pop area + User::LeaveIfError(iAknUiSrv.Connect()); + iDiscreetPopArea = iAknUiSrv.GetInUseGlobalDiscreetPopupRect(); + if(iDiscreetPopArea.Size().iWidth > 0) + { + HandleDiscreetPopNotification(); + } } void CPeninputServer::CleanAll() @@ -319,9 +337,7 @@ #ifdef RD_TACTILE_FEEDBACK - //KS: QUICK FIX FOR EGSN-7BCBWS FeatureManager::UnInitializeLib(); - //KS: QUICK FIX FOR EGSN-7BCBWS iFeedbackAreaArray.Close(); #endif // RD_TACTILE_FEEDBACK delete iPenUiCtrl; @@ -332,6 +348,13 @@ #ifdef __LOG_WNDGROU__ iLogFile.Close(); #endif + if (iDiscreetPopSubscriber) + { + iDiscreetPopSubscriber->StopSubscribe(); + } + iDiscreetPopProperty.Close(); + delete iDiscreetPopSubscriber; + iAknUiSrv.Close(); delete iAnimObj; iAnimObj = NULL; @@ -410,17 +433,50 @@ // void CPeninputServer::ActivateSpriteInGlobalNotesL() { + TBool notDraw = EFalse; + + if(iUiLayout) + { + iUiLayout->HandleCommand( ECmdPeninputDisableLayoutDrawing, + (unsigned char*)¬Draw ); + } + + // [[[ temporary solution for Virtual keyboard becomes corrupted after several rotations + if(!iUiLayout) + { + return; + } + + // we should not be able to activate and show pen ui if this mode is disabled currently + TInt inputType = iUiLayout->PenInputType(); + if( inputType == EPluginInputModeFSQ && iLayoutId.iUid == KPenInputSrvPrtFsqUiId ) + { + inputType = EPluginInputModePortraitFSQ; + } + if( inputType & DisabledByOrientation() ) + + { + // we have activate the animation otherwise we will see the penui but not reponse + // when clicking on it in the case we rotating the screen quickly and continously + if(iAnimObj) + { + iAnimObj->AddActivationCmd(ECmdActivate,EFalse); + } + return; + } + // ]]] temporary solution for Virtual keyboard becomes corrupted after several rotations + if(iActive) { - if(iUseWindowCtrl) - { + if(iUseWindowCtrl) + { /* RWsSession &ws = CCoeEnv::Static()->WsSession(); TInt wgId =ws.GetFocusWindowGroup(); //TInt wgHandle = ws.GetWindowGroupHandle(wgId); - TInt priority; - //TInt pos; + TInt priority; + //TInt pos; //wg.Construct(wgHandle); //pos = wg.FullOrdinalPosition(); priority = ws.GetWindowGroupOrdinalPriority(wgId);*/ @@ -429,57 +485,57 @@ ActivatePenUiLayout(EFalse); iDimmed = EFalse; iPenUiCtrl->ShowPenUiL(iDimmed); - } - return; + } + return; } - TBool bNeedWait = AnimOpNeedWaiting(ESignalPenUiActivated); - //add animation command + TBool bNeedWait = AnimOpNeedWaiting(ESignalPenUiActivated); + //add animation command - /* - if(iAnimObj->AddActivationCmd(ECmdActivate,bNeedWait)) - { - if(bNeedWait) - iForegroundUiHandler->AddDelayedCmd(); - //iUiLayout->OnActivate(); - ActivatePenUiLayout(); - - DrawSprite(); - - iEventBufferQueue->GetEvent(); - - iActive = ETrue; - - if(iUseWindowCtrl) - iPenUiCtrl->ShowPenUi(); - } - */ - if(ActivatePenUiLayout(bNeedWait)) + /* + if(iAnimObj->AddActivationCmd(ECmdActivate,bNeedWait)) { - if(bNeedWait) - iForegroundUiHandler->AddDelayedCmd(); - - DrawSprite(); - - iActive = ETrue; - - if(iUseWindowCtrl) - { - /*RWsSession &ws = CCoeEnv::Static()->WsSession(); - TInt wgId =ws.GetFocusWindowGroup(); - //TInt wgHandle = ws.GetWindowGroupHandle(wgId); + if(bNeedWait) + iForegroundUiHandler->AddDelayedCmd(); + //iUiLayout->OnActivate(); + ActivatePenUiLayout(); + + DrawSprite(); + + iEventBufferQueue->GetEvent(); + + iActive = ETrue; + + if(iUseWindowCtrl) + iPenUiCtrl->ShowPenUi(); + } + */ + if(ActivatePenUiLayout(bNeedWait)) + { + if(bNeedWait) + iForegroundUiHandler->AddDelayedCmd(); + + DrawSprite(); + + iActive = ETrue; + + if(iUseWindowCtrl) + { + /*RWsSession &ws = CCoeEnv::Static()->WsSession(); + TInt wgId =ws.GetFocusWindowGroup(); + //TInt wgHandle = ws.GetWindowGroupHandle(wgId); - - TInt priority; - //TInt pos; - //wg.Construct(wgHandle); - //pos = wg.FullOrdinalPosition(); - priority = ws.GetWindowGroupOrdinalPriority(wgId);*/ - //wg.Close(); - iPenUiCtrl->ShowPenUiL(iDimmed); - } + TInt priority; + //TInt pos; + //wg.Construct(wgHandle); + //pos = wg.FullOrdinalPosition(); + priority = ws.GetWindowGroupOrdinalPriority(wgId);*/ + //wg.Close(); + iPenUiCtrl->ShowPenUiL(iDimmed); } } + } + // --------------------------------------------------------------------------- // CPeninputServer::ActivateSprite // Activate sprite @@ -512,6 +568,29 @@ if(!iUiLayout) return; + // [[[ temporary solution for Virtual keyboard becomes corrupted after several rotations + // we should not be able to activate and show pen ui if this mode is disabled currently + TInt inputType = iUiLayout->PenInputType(); + if( inputType == EPluginInputModeFSQ && iLayoutId.iUid == KPenInputSrvPrtFsqUiId ) + { + inputType = EPluginInputModePortraitFSQ; + } + if( inputType & DisabledByOrientation() ) + { + // we have activate the animation otherwise we will see the penui but not reponse + // when clicking on it in the case we rotating the screen quickly and continously + if(iAnimObj) + { + iAnimObj->AddActivationCmd(ECmdActivate,EFalse); + } + + return; + } + // ]]] temporary solution for Virtual keyboard becomes corrupted after several rotations + + TBool notDraw = EFalse; + iUiLayout->HandleCommand(ECmdPeninputDisableLayoutDrawing,(unsigned char*)¬Draw); + // move it out from if(!iActive) to make sure that msg bubble can be // shown if fast swap from other application to msg application. TBool bNeedWait = AnimOpNeedWaiting(ESignalPenUiActivated); @@ -533,51 +612,73 @@ /* if(iAnimObj->AddActivationCmd(ECmdActivate,bNeedWait)) - { - if(bNeedWait) - iForegroundUiHandler->AddDelayedCmd(); - //iUiLayout->OnActivate(); + { + if(bNeedWait) + iForegroundUiHandler->AddDelayedCmd(); + //iUiLayout->OnActivate(); ActivatePenUiLayout(); - - DrawSprite(); - - iEventBufferQueue->GetEvent(); - - iActive = ETrue; - - if(iUseWindowCtrl) + + DrawSprite(); + + iEventBufferQueue->GetEvent(); + + iActive = ETrue; + + if(iUseWindowCtrl) iPenUiCtrl->ShowPenUi(); } */ if(ActivatePenUiLayout(bNeedWait, ETrue)) { - if(bNeedWait) - iForegroundUiHandler->AddDelayedCmd(); - - DrawSprite(); - - iActive = ETrue; - - if(iUseWindowCtrl) - { - TRAP_IGNORE( iPenUiCtrl->ShowPenUiL(iDimmed) ); - - if (iPreNonGloebalNotesWndGrpId != focusApp.iUid && - IsGlobalNotesApp(focusApp) && !iInGlobalEditorState ) - { - iDimmed = ETrue; - DimPenUi(); - } - } + if(bNeedWait) + iForegroundUiHandler->AddDelayedCmd(); + + DrawSprite(); + + iActive = ETrue; + + if(iUseWindowCtrl) + { + TRAP_IGNORE( iPenUiCtrl->ShowPenUiL(iDimmed) ); + + if (iPreNonGloebalNotesWndGrpId != focusApp.iUid && + IsGlobalNotesApp(focusApp) && !iInGlobalEditorState ) + { + iDimmed = ETrue; + DimPenUi(); + } + } } + iIsLayoutReDrawAllowWhenActive = EFalse; } else { //actived but dimmed by global notes if(iUseWindowCtrl) { - ActivatePenUiLayout(EFalse); + /** + * 1. IF THE GLOBAL NOTES HAS BEEN OPENED UP, WE NEED TO REDRAW THE LAYOUT + * 2. IF iIsLayoutReDrawAllowWhenActive was set to be ETrue. + * if we did not put this condition guard, the layout + * redraw will be executed even if the layout is active. But if this flag is + * set to be ture, layout redraw will be carried out even if the layout is active, so + * it will leave this for layout to decide if it need set this flag to be ture or false + * in some special cases: for example for entering and exiting the spell mode. + * + */ + if(iInGlobalNotesApp || iInGlobalEditorState || iIsLayoutReDrawAllowWhenActive ) + { + ActivatePenUiLayout(EFalse); + if(iIsLayoutReDrawAllowWhenActive) + { + iIsLayoutReDrawAllowWhenActive = EFalse; + } + } + else + { + ActivatePenUiLayout(EFalse,ETrue); + } if (iDimmed && (iInGlobalNotesApp || iInGlobalEditorState)) { @@ -588,7 +689,7 @@ TRAP_IGNORE( iPenUiCtrl->ShowPenUiL(iDimmed) ); iDimmed = EFalse; } - } + } } // --------------------------------------------------------------------------- @@ -647,14 +748,20 @@ if(aFlag) { iEventBufferQueue->Cancel(); - iUiLayout->OnDeActivate(); + if( iUiLayout ) + { + iUiLayout->OnDeActivate(); + } if(iUseWindowCtrl) iPenUiCtrl->OnDeactivate(); //disable non fading } else { iEventBufferQueue->GetEvent(); - iUiLayout->OnActivate(); + if( iUiLayout ) + { + iUiLayout->OnActivate(); + } if(iUseWindowCtrl) iPenUiCtrl->OnActivate(CPenUiWndCtrl::ENoremalEditor); //disable non fading } @@ -1093,13 +1200,31 @@ break; case EPeninputRequestSupportInputMode: { - TInt supportMode = GetSupportModeL(); - - TPckg msg(supportMode); - + TInt language = 0; + TPckg msgLanguage( language ); + aMessage.ReadL( 1, msgLanguage ); + TInt supportMode = GetSupportModeByLanguageL( language ); + TPckg msg(supportMode); aMessage.WriteL(0,msg); } break; + + case EPeninputRequestSetInputLanguage: + { + TPckg msg(iInputLanguage); + aMessage.ReadL(0,msg); + if(iUiLayout) + { + iUiLayout->HandleCommand(ECmdPenInputLanguage, + (unsigned char*)&iInputLanguage); + } + } + break; + case EPeninputEnablePriorityChangeOnOriChange: + { + TPckg enablePriority( iEnablePriorityChangeOnOriChange ); + aMessage.ReadL( 0, enablePriority ); + } default: //Let user pluging handling the user command break; } @@ -1171,9 +1296,19 @@ iUILayoutReady = EFalse; if(iUiLayout) { - ClearSpriteGc(); + //if(!iUseWindowCtrl) + //{ + //ClearSpriteGc(); + //} DeactivateSprite(); iDestroyingLayout = ETrue; + if(iUseWindowCtrl) + { + if(iPenUiCtrl) + { + iPenUiCtrl->Clean(); + } + } iUiLayout->Destroy(); iUiLayout = NULL; iDestroyingLayout = EFalse; @@ -1277,8 +1412,12 @@ iUseWindowCtrl = ETrue; if(iUseWindowCtrl) - { - iPenUiCtrl->SetExtent(layoutRect.iTl,layoutSize); + { +#ifdef FIX_FOR_NGA + TBool flag = ETrue; + iUiLayout->HandleCommand(ECmdPeninputEnableOwnBitmap,reinterpret_cast(&flag)); +#endif + iPenUiCtrl->SetExtent(layoutRect.iTl,layoutSize); if(iAnimObj) { iAnimObj->AddEnalbeSpriteCmd(EFalse); @@ -1501,7 +1640,7 @@ void CPeninputServer::DrawSprite() { - if(!iUiLayout) + if(!iUiLayout || iActive) return; ClearSpriteGc(); @@ -1547,7 +1686,11 @@ if(iUseWindowCtrl) { - iPenUiCtrl->Invalidate(aRect,EFalse); +#ifdef FIX_FOR_NGA + iPenUiCtrl->Invalidate(TRect( TPoint(0,0), LayoutRect().Size()),EFalse); +#else + iPenUiCtrl->Invalidate(aRect,EFalse); +#endif return; } @@ -1626,7 +1769,10 @@ } else { - ActivateSprite(); + if(!iActive) + { + ActivateSprite(); + } } } @@ -1862,16 +2008,19 @@ } } break; + case ESignalEnableLayoutRedrawWhenActive: + { + TUint16* buf = const_cast( aEventData.Ptr() ); + TBool* retVal = reinterpret_cast< TBool* > ( buf ); + iIsLayoutReDrawAllowWhenActive = *retVal; + } + break; - case ESignalPopupWndClosed: - { - if(iUseWindowCtrl) + default: + if(iUseWindowCtrl) { - iPenUiCtrl->ClosePopup(); + iPenUiCtrl->HandleNGASpecificSignal(aEventType, aEventData); } - } - break; - default: break; } } @@ -1974,12 +2123,87 @@ // --------------------------------------------------------------------------- // void CPeninputServer::HandleResourceChange(TInt aType) - { - if(iUiLayout && !(iUiLayout->PenInputType() & DisabledByOrientation()) ) + { + // Update the cursor color when resource is changed + iPenUiCtrl->SetCursorColor(); + + #ifdef FIX_FOR_NGA + // iEnablePriorityChangeOnOriChange will be set to be EFalse, if some dialog in FEP end were opened and + // not close after rotation for example: Symbol Table, Writing Language list and Match Dialog on ITI + if(iUiLayout && iActive && iEnablePriorityChangeOnOriChange && aType == KEikDynamicLayoutVariantSwitch) { - //hide the layout if it's already shown + TPixelsTwipsAndRotation size; + CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation(size); + + TBool isPortrait = ( size.iPixelSize.iWidth < size.iPixelSize.iHeight ); + + TBool needToLiftUp = EFalse; + TInt inputMode = 0; + inputMode = iUiLayout->PenInputType(); - iUiLayout->OnResourceChange(aType); + // If input mode is either ITU-T or portrait FSQ, and if orientation + // is changed to landscape, highest priority is given to Pen UI to avoid + // flickering problem while drawing landscape FSQ layout. + if( inputMode == EPluginInputModeItut || + ( inputMode == EPluginInputModeFSQ && + iLayoutId.iUid == KPenInputSrvPrtFsqUiId ) ) + { + if(!isPortrait) + { + needToLiftUp = ETrue; + } + } + else if(inputMode == EPluginInputModeFSQ) + { + if(isPortrait) + { + needToLiftUp = ETrue; + } + } + + else if(inputMode == EPluginInputModeFingerHwr) + { + ClearSpriteGc(); + //Close the UI immediately, without notify UI handler + DeactivateSprite(ETrue, ETrue); + } + if(needToLiftUp) + { + if(iPenUiCtrl) + { + + // must lift up the wnd group priority otherwise when rotating screen, the underling application will show first and then + // our PEN UI, but we should keep an eye on this issue. If NGA will fix the fliker assigned on them, we will check if it will + // work if we remove this line of code. + iPenUiCtrl->LiftUpPriority(); + } + } + } + #endif + if( iUiLayout ) + { + TInt inputType = iUiLayout->PenInputType(); + if( inputType == EPluginInputModeFSQ && iLayoutId.iUid == KPenInputSrvPrtFsqUiId ) + { + inputType = EPluginInputModePortraitFSQ; + } + if( !( inputType & DisabledByOrientation() ) ) + { + //hide the layout if it's already shown + + if ( iActive ) + { + iUiLayout->OnActivate(); + } + + iUiLayout->OnResourceChange(aType); + + if(iUseWindowCtrl) + { + iPenUiCtrl->DrawNow(); + } + } + //show the layout if it's active } } @@ -2079,15 +2303,52 @@ } return; } -*/ if(iActive && !iPrevActive && - iUiLayout->PenInputType() != EPluginInputModeFSQ && - iBackgroudDefaultOri == CAknAppUiBase::EAppUiOrientationUnspecified ) +*/ + TInt inputMode = iUiLayout ? iUiLayout->PenInputType() : EPluginInputModeNone; + + TBool isArabicFingerInput = (inputMode == EPluginInputModeFingerHwr && iInputLanguage == ELangArabic); + + if(isArabicFingerInput) + { + return; + } + + // Both landscape and portrait FSQs are handled as EPluginInputModeFSQ + // in Pen Input server. iLayoutId can be used to check it's landscape or + // portrait. + TBool isLandscapeFSQ = + ( inputMode == EPluginInputModeFSQ && + iLayoutId.iUid != KPenInputSrvPrtFsqUiId ) + ? ETrue : EFalse; + + if ( iActive && !iPrevActive && !isLandscapeFSQ && + iBackgroudDefaultOri == CAknAppUiBase::EAppUiOrientationUnspecified ) { - + #ifdef FIX_FOR_NGA + if(inputMode == EPluginInputModeFingerHwr) + { + iPrevActive = ETrue; + ClearSpriteGc(); + //Close the UI immediately, without notify UI handler + DeactivateSprite(ETrue, ETrue); + } + else + {// for other input mode: we are not going to cose UI, since it will cause + // serious fliker: which will have the mixed ui(with other app ui) on pen input ui + + if(iUiLayout) + { + //TBool notDraw = ETrue; + //iUiLayout->HandleCommand(ECmdPeninputDisableLayoutDrawing,(unsigned char*)¬Draw); + iUiLayout->OnDeActivate(); + } + } + #else iPrevActive = ETrue; ClearSpriteGc(); - //Close the UI immediately, without notify UI handler - DeactivateSprite(ETrue, ETrue); + //Close the UI immediately, without notify UI handler + DeactivateSprite(ETrue, ETrue); + #endif } } @@ -2100,16 +2361,7 @@ { // No spcified logic now, so just store the disabled layout in the CFepUiLayoutBase class. TInt allowedPlugin = EPluginInputModeNone;// EPluginInputModeHwr | EPluginInputModeVkb | EPluginInputModeItut | EPluginInputModeFSc; - - CRepository* repository = NULL; - TRAPD(ret, repository = CRepository::NewL(KCRUidAknFep)); - if (ret != KErrNone) - { - return EPluginInputModeAll; - } - TInt curLanguage ; - repository->Get(KAknFepInputTxtLang, curLanguage); - delete repository; + TInt curLanguage = iInputLanguage; if (curLanguage == 401) curLanguage = 102; if (curLanguage == 402) curLanguage = 103; @@ -2220,13 +2472,14 @@ if(iActive) { if( aEvent.Type() == TRawEvent::ENone && - aEvent.IsTip() && - iCrpService->IsDsaActive() ) + aEvent.IsTip() + && iCrpService && iCrpService->IsDsaActive() ) { SignalOwner( ESignalLayoutClosed, KNullDesC ); } - TBool handled = iUiLayout->HandleEventL(ERawEvent,&aEvent); + TBool handled = iUiLayout ? iUiLayout->HandleEventL(ERawEvent,&aEvent) + : EFalse; if (TRawEvent::EButton1Down == aEvent.Type()) { @@ -2290,28 +2543,32 @@ break; } */ - if(IsGlobalNotesApp(focusApp)) - { - iInGlobalNotesState = ETrue; - break; - } + if( IsGlobalNotesApp(focusApp) ) + { + iInGlobalNotesState = ETrue; + // add this to enable global dim + DeactivatePenUiLayout(EFalse); + break; + } /* else if (focusApp.iUid == 0x102750f0) { DeactivateSprite(); } -*/ else +*/ else { - if(iInGlobalNotesState) - { - //fix for fast swap case + if(iInGlobalNotesState) + { + //fix for fast swap case iInGlobalNotesState = EFalse; - if(iPreNonGloebalNotesWndGrpId != focusApp.iUid) + if(iPreNonGloebalNotesWndGrpId != focusApp.iUid ) { - iPreNonGloebalNotesWndGrpId = focusApp.iUid; - + iPreNonGloebalNotesWndGrpId = focusApp.iUid; DeactivateSprite(ETrue);//hide pen ui immediately if switched to another application - iForegroundSession = NULL; + // Notify FEP to close touch input window. + // Under this case, touch input window can't be closed without norifying FEP side. + // After close touch input window, FEP must change some states. + SignalOwner( ESignalDeactivateSprite, KNullDesC ); } } else @@ -2319,7 +2576,7 @@ DeactivateSprite(ETrue); } } - break; + break; } DeactivateSprite(ETrue);//hide pen ui immediately } @@ -2419,7 +2676,7 @@ } if(iForegroundUiHandler) { - TInt uiType = iUiLayout->PenInputType(); + TInt uiType = iUiLayout ? iUiLayout->PenInputType() : EPluginInputModeNone; bNeedWait = iForegroundUiHandler->SignalUiActivationObserver( aSignalCode,uiType); } @@ -2447,6 +2704,11 @@ void CPeninputServer::RecoverButtonEventState() { + if(!iUiLayout) + { + return; + } + if (TRawEvent::EButton1Down == iLastRawEvent.Type()) { iLastRawEvent.Set(TRawEvent::EButton1Up);//,iLastSimulatedKeyEvent.ScanCode() @@ -2673,7 +2935,14 @@ } if( size.iPixelSize.iWidth > size.iPixelSize.iHeight ) { - return disabled |= EPluginInputModeItut; + // Portrait input modes which are ITU-T and Portrait FSQ + // should be disabled in portrait orientation. + // Note: no need to check feature flag because if it is not + // turned on, EPluginInputModePortraitFSQ will not be handled + // at all so adding it to "disabled" will take no effect. + disabled |= EPluginInputModeItut | EPluginInputModePortraitFSQ; + + return disabled; } } } @@ -2683,16 +2952,7 @@ TInt CPeninputServer::GetSupportModeL() { - CRepository* repository = NULL; - TRAPD(ret, repository = CRepository::NewL(KCRUidAknFep)); - if (ret != KErrNone) - { - return ret; - } - TInt curLanguage ; - repository->Get(KAknFepInputTxtLang, curLanguage); - delete repository; - repository = NULL; + TInt curLanguage = iInputLanguage; if (curLanguage == 401) curLanguage = 102; if (curLanguage == 402) curLanguage = 103; @@ -2714,7 +2974,63 @@ } return supportMode; } + +TInt CPeninputServer::GetSupportModeByLanguageL( TInt aInputLanguage ) + { + TInt curLanguage = aInputLanguage; + if ( curLanguage == 401 ) + { + curLanguage = 102; + } + if (curLanguage == 402) + { + curLanguage = 103; + } + TInt supportMode = EPluginInputModeNone; + TInt tempMode = EPluginInputModeHwr; + + iLayoutEng->InitializeL(); + + while ( tempMode < EPluginInputModeAll ) + { + if ( iLayoutEng->IsSupportPluginMode( ( TLanguage )curLanguage, + ( TPluginInputMode )tempMode ) ) + { + supportMode |= tempMode; + } + tempMode<<=1; + } + return supportMode; + } + +// --------------------------------------------------------------------------- +// CPeninputServer::DiscreetPopChangeNotification +// handle notification of discreept pop changing +// --------------------------------------------------------------------------- +// +TInt CPeninputServer::DiscreetPopChangeNotification(TAny* aObj) + { + if (aObj) + { + static_cast(aObj)->HandleDiscreetPopNotification(); + return KErrNone; + } + else + { + return KErrArgument; + } + } +// --------------------------------------------------------------------------- +// CPeninputServer::HandleDiscreetPopNotification +// handle notification of discreept pop changing +// --------------------------------------------------------------------------- +// +void CPeninputServer::HandleDiscreetPopNotification() + { + iDiscreetPopArea = iAknUiSrv.GetInUseGlobalDiscreetPopupRect(); + iAnimObj->SetDiscreetPopArea(iDiscreetPopArea); + } // ======== class CEventQueue======== // // --------------------------------------------------------------------------- @@ -2924,5 +3240,47 @@ { User::Panic( KPeninputServerName, aPanic ); } + +// ======== class CSubscriber======== +// +CSubscriber::CSubscriber(TCallBack aCallBack, RProperty& aProperty) + : + CActive(EPriorityNormal), iCallBack(aCallBack), iProperty(aProperty) + { + CActiveScheduler::Add(this); + } + +CSubscriber::~CSubscriber() + { + Cancel(); + } + +void CSubscriber::SubscribeL() + { + if (!IsActive()) + { + iProperty.Subscribe(iStatus); + SetActive(); + } + } + +void CSubscriber::StopSubscribe() + { + Cancel(); + } + +void CSubscriber::RunL() + { + if (iStatus.Int() == KErrNone) + { + iCallBack.CallBack(); + SubscribeL(); + } + } + +void CSubscriber::DoCancel() + { + iProperty.Cancel(); + } // End of File