From: taeyoon0.lee Date: Wed, 11 Oct 2017 08:58:16 +0000 (+0900) Subject: [4.0] Add Finalize api for imf-manager X-Git-Tag: accepted/tizen/4.0/unified/20171012.230021~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=2bcf10a589372e038ffd026de5c352845715a951 [4.0] Add Finalize api for imf-manager This reverts commit fdeae0675b767547d5b017642cb256c514a35022. Change-Id: If5f219d9cd8dbfcdafe7815ff4387509e017f597 --- diff --git a/adaptors/devel-api/adaptor-framework/imf-manager.cpp b/adaptors/devel-api/adaptor-framework/imf-manager.cpp old mode 100644 new mode 100755 index 620fdd1..8571653 --- a/adaptors/devel-api/adaptor-framework/imf-manager.cpp +++ b/adaptors/devel-api/adaptor-framework/imf-manager.cpp @@ -33,6 +33,11 @@ ImfManager::~ImfManager() { } +void ImfManager::Finalize() +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).Finalize(); +} + ImfManager ImfManager::Get() { return Internal::Adaptor::ImfManager::Get(); diff --git a/adaptors/devel-api/adaptor-framework/imf-manager.h b/adaptors/devel-api/adaptor-framework/imf-manager.h old mode 100644 new mode 100755 index 2780d9a..0efdeac --- a/adaptors/devel-api/adaptor-framework/imf-manager.h +++ b/adaptors/devel-api/adaptor-framework/imf-manager.h @@ -170,6 +170,13 @@ public: public: /** + * @brief Finalize the IMF. + * + * It means that the context will be deleted. + */ + void Finalize(); + + /** * @brief Retrieve a handle to the instance of ImfManager. * @return A handle to the ImfManager. */ diff --git a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp old mode 100644 new mode 100755 index 69e5e41..942d96c --- a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp +++ b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp @@ -258,6 +258,18 @@ TypeRegistration IMF_MANAGER_TYPE( typeid(Dali::ImfManager), typeid(Dali::BaseHa } // unnamed namespace +void ImfManager::Finalize() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Finalize\n" ); + if ( mInited ) + { + DisconnectCallbacks(); + DeleteContext(); + ecore_imf_shutdown(); + mInited = false; + } +} + bool ImfManager::IsAvailable() { bool available( false ); @@ -274,6 +286,7 @@ bool ImfManager::IsAvailable() Dali::ImfManager ImfManager::Get() { Dali::ImfManager manager; + ImfManager *imfManager = NULL; Dali::SingletonService service( SingletonService::Get() ); if ( service ) @@ -283,12 +296,12 @@ 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() ) { // Create instance and register singleton only if the adaptor is available - Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) ); Any nativeWindow = adaptorImpl.GetNativeWindowHandle(); @@ -300,8 +313,8 @@ Dali::ImfManager ImfManager::Get() // If we fail to get Ecore_Wl_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( ecoreWwin ) ); + imfManager = new ImfManager( ecoreWwin ); + manager = Dali::ImfManager( imfManager ); service.Register( typeid( manager ), manager ); } else @@ -311,35 +324,37 @@ Dali::ImfManager ImfManager::Get() } } + if ( ( imfManager != NULL ) && !imfManager->mInited ) + { + ecore_imf_init(); + imfManager->CreateContext( imfManager->mEcoreWlwin ); + + imfManager->ConnectCallbacks(); + imfManager->mInited = true; + } + return manager; } ImfManager::ImfManager( Ecore_Wl_Window *ecoreWlwin ) : mIMFContext(), + mEcoreWlwin( ecoreWlwin ), mIMFCursorPosition( 0 ), mSurroundingText(), + mInited( false ), mRestoreAfterFocusLost( false ), mIdleCallbackConnected( false ) { - ecore_imf_init(); - CreateContext( ecoreWlwin ); - - ConnectCallbacks(); } ImfManager::~ImfManager() { - DisconnectCallbacks(); - - DeleteContext(); - ecore_imf_shutdown(); + Finalize(); } - void ImfManager::CreateContext( Ecore_Wl_Window *ecoreWlwin ) { DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::CreateContext\n" ); - const char *contextId = ecore_imf_context_default_id_get(); if( contextId ) { diff --git a/adaptors/ecore/wayland/imf-manager-impl.h b/adaptors/ecore/wayland/imf-manager-impl.h old mode 100644 new mode 100755 index e3a73ad..3d2d451 --- a/adaptors/ecore/wayland/imf-manager-impl.h +++ b/adaptors/ecore/wayland/imf-manager-impl.h @@ -53,6 +53,11 @@ public: public: /** + * @copydoc Dali::ImfManager::Finalize() + */ + void Finalize(); + + /** * Check whether the ImfManager is available. * @return true if available, false otherwise */ @@ -283,9 +288,11 @@ private: private: Ecore_IMF_Context* mIMFContext; + Ecore_Wl_Window *mEcoreWlwin; int mIMFCursorPosition; std::string mSurroundingText; + bool mInited:1; ///< Whether the imf is already inited. bool mRestoreAfterFocusLost:1; ///< Whether the keyboard needs to be restored (activated ) after focus regained. bool mIdleCallbackConnected:1; ///< Whether the idle callback is already connected. diff --git a/adaptors/integration-api/x11/imf-manager-impl.h b/adaptors/integration-api/x11/imf-manager-impl.h old mode 100644 new mode 100755 index aab3f9f..f069d42 --- a/adaptors/integration-api/x11/imf-manager-impl.h +++ b/adaptors/integration-api/x11/imf-manager-impl.h @@ -50,6 +50,11 @@ public: public: /** + * @copydoc Dali::ImfManager::Finalize() + */ + void Finalize(); + + /** * Check whether the ImfManager is available. * @return true if available, false otherwise */ @@ -67,7 +72,7 @@ public: * Constructor * @param[in] ecoreXwin, The window is created by application. */ - ImfManager( Ecore_X_Window ecoreXwin ); + ImfManager( Ecore_X_Window* ecoreXwin ); /** * Connect Callbacks required for IMF. @@ -265,7 +270,7 @@ private: * Context created the first time and kept until deleted. * @param[in] ecoreXwin, The window is created by application. */ - void CreateContext( Ecore_X_Window ecoreXwin ); + void CreateContext( Ecore_X_Window* ecoreXwin ); /** * @copydoc Dali::ImfManager::DeleteContext() @@ -279,9 +284,11 @@ private: private: Ecore_IMF_Context* mIMFContext; + Ecore_X_Window* mEcoreXWin; int mIMFCursorPosition; std::string mSurroundingText; + bool mInited:1; ///< Whether the imf is already inited. bool mRestoreAfterFocusLost:1; ///< Whether the keyboard needs to be restored (activated ) after focus regained. bool mIdleCallbackConnected:1; ///< Whether the idle callback is already connected. InputMethodOptions mOptions; diff --git a/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp b/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp old mode 100644 new mode 100755 index ec7cdc7..37a86e4 --- a/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp +++ b/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp @@ -104,8 +104,18 @@ BaseHandle Create() TypeRegistration IMF_MANAGER_TYPE( typeid(Dali::ImfManager), typeid(Dali::BaseHandle), Create ); +} +void ImfManager::Finalize() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Finalize\n" ); + if ( mInited ) + { + DisconnectCallbacks(); + mInited = false; + } } + bool ImfManager::IsAvailable() { bool available( false ); @@ -121,6 +131,7 @@ bool ImfManager::IsAvailable() Dali::ImfManager ImfManager::Get() { Dali::ImfManager manager; + ImfManager *imfManager = NULL; Dali::SingletonService service( SingletonService::Get() ); if (! service ) @@ -133,31 +144,42 @@ 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() ) { // Create instance and register singleton only if the adaptor is available - manager = Dali::ImfManager( new ImfManager() ); + imfManager = new ImfManager(); + manager = Dali::ImfManager( imfManager ); service.Register( typeid( manager ), manager ); } else { DALI_LOG_ERROR("Failed to get native window handle\n"); } + + if ( ( imfManager != NULL ) && !imfManager->mInited ) + { + imfManager->ConnectCallbacks(); + imfManager->mInited = true; + } + return manager; } + ImfManager::ImfManager() : mTextInputManager( TextInputManager::Get() ), mPreEditCursorPosition( 0 ), mEditCursorPosition( 0 ), + mInited( false ), mRestoreAfterFocusLost( false ) { - ConnectCallbacks(); } + ImfManager::~ImfManager() { - DisconnectCallbacks(); + Finalize(); } void ImfManager::ConnectCallbacks() diff --git a/adaptors/wayland/input/text/imf/imf-manager-impl.h b/adaptors/wayland/input/text/imf/imf-manager-impl.h old mode 100644 new mode 100755 index d0739a8..8b4df80 --- a/adaptors/wayland/input/text/imf/imf-manager-impl.h +++ b/adaptors/wayland/input/text/imf/imf-manager-impl.h @@ -60,6 +60,10 @@ public: typedef Dali::ImfManager::KeyboardTypeSignalType ImfKeyboardTypeSignalType; public: + /** + * @copydoc Dali::ImfManager::Finalize() + */ + void Finalize(); /** * @brief Check whether the ImfManager is available. @@ -306,6 +310,7 @@ private: std::string mSurroundingText; int mPreEditCursorPosition; int mEditCursorPosition; + bool mInited:1; ///< Whether the imf is already inited. bool mRestoreAfterFocusLost:1; ///< Whether the keyboard needs to be restored (activated ) after focus regained. public: 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" );