X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Fx11%2Fimf-manager-impl-x.cpp;h=1d9294fdec9fc386231008a109b75fa04b5c3a3d;hb=2bcf10a589372e038ffd026de5c352845715a951;hp=6d9d2a20f42c9ded9c838da93148868c2bf2c1a6;hpb=5a86921c3fbd5a36aa8ed2f8b7b0cb43223f2bb2;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/adaptors/x11/imf-manager-impl-x.cpp b/adaptors/x11/imf-manager-impl-x.cpp old mode 100644 new mode 100755 index 6d9d2a2..1d9294f --- a/adaptors/x11/imf-manager-impl-x.cpp +++ b/adaptors/x11/imf-manager-impl-x.cpp @@ -122,6 +122,19 @@ void ImfDeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *even } // unnamed namespace +void ImfManager::Finalize() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Finalize\n" ); + if ( mInited ) + { + VirtualKeyboard::DisconnectCallbacks( mIMFContext ); + DisconnectCallbacks(); + DeleteContext(); + ecore_imf_shutdown(); + mInited = false; + } +} + bool ImfManager::IsAvailable() { bool available( false ); @@ -138,6 +151,7 @@ bool ImfManager::IsAvailable() Dali::ImfManager ImfManager::Get() { Dali::ImfManager manager; + ImfManager *imfManager = NULL; Dali::SingletonService service( SingletonService::Get() ); if ( service ) @@ -147,7 +161,8 @@ Dali::ImfManager ImfManager::Get() if( handle ) { // If so, downcast the handle - manager = Dali::ImfManager( dynamic_cast< ImfManager* >( handle.GetObjectPtr() ) ); + imfManager = dynamic_cast< ImfManager* >( handle.GetObjectPtr() ); + manager = Dali::ImfManager( imfManager ); } else if ( Adaptor::IsAvailable() ) { @@ -158,14 +173,14 @@ Dali::ImfManager ImfManager::Get() // The Ecore_X_Window needs to use the ImfManager. // Only when the render surface is window, we can get the Ecore_X_Window. - Ecore_X_Window ecoreXwin( AnyCast(nativeWindow) ); - if (ecoreXwin) + Ecore_X_Window *ecoreXwin( AnyCast< Ecore_X_Window* >( nativeWindow ) ); + if ( ecoreXwin ) { // If we fail to get Ecore_X_Window, we can't use the ImfManager correctly. // Thus you have to call "ecore_imf_context_client_window_set" somewhere. // In EvasPlugIn, this function is called in EvasPlugin::ConnectEcoreEvent(). - - manager = Dali::ImfManager( new ImfManager( ecoreXwin ) ); + imfManager = new ImfManager( ecoreXwin ); + manager = Dali::ImfManager( imfManager ); service.Register( typeid( manager ), manager ); } else @@ -175,33 +190,36 @@ Dali::ImfManager ImfManager::Get() } } + if ( ( imfManager != NULL ) !imfManager->mInited ) + { + ecore_imf_init(); + imfManager->CreateContext( imfManager->mEcoreXWin ); + + imfManager->ConnectCallbacks(); + VirtualKeyboard::ConnectCallbacks( mIMFContext ); + imfManager->mInited = true; + } + return manager; } -ImfManager::ImfManager( Ecore_X_Window ecoreXwin ) +ImfManager::ImfManager( Ecore_X_Window* ecoreXwin ) : mIMFContext(), + mEcoreXWin( ecoreXwin ), mIMFCursorPosition( 0 ), mSurroundingText(), + mInited( false ), mRestoreAfterFocusLost( false ), mIdleCallbackConnected( false ) { - ecore_imf_init(); - CreateContext( ecoreXwin ); - - ConnectCallbacks(); - VirtualKeyboard::ConnectCallbacks( mIMFContext ); } ImfManager::~ImfManager() { - VirtualKeyboard::DisconnectCallbacks( mIMFContext ); - DisconnectCallbacks(); - - DeleteContext(); - ecore_imf_shutdown(); + Finalize(); } -void ImfManager::CreateContext( Ecore_X_Window ecoreXwin ) +void ImfManager::CreateContext( Ecore_X_Window* ecoreXwin ) { DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::CreateContext\n" );