X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Fecore%2Fwayland%2Fimf-manager-impl-ecore-wl.cpp;h=51694ad9f2aa6d0f4d1d868d711cb9580640b463;hb=d9418fed4fed3c286a9d14fc29c58663d7a2ec2f;hp=fa67134e1cfa6e584ecfe0e76ec077ce51e3f932;hpb=ad3cef136eccf053768fa1d1e6b85be153a3d487;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git 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 fa67134..51694ad --- a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp +++ b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,9 @@ */ // CLASS HEADER +// Ecore is littered with C style cast +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" #include // EXTERNAL INCLUDES @@ -196,6 +199,31 @@ void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, imfManager->ResizedSignal().Emit(); } +void InputPanelKeyboardTypeChangedCallback( void *data, Ecore_IMF_Context *context, int value ) +{ + if( !data ) + { + return; + } + + ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data ); + switch (value) + { + case ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE: + { + // Emit Signal that the keyboard type is changed to Software Keyboard + imfManager->KeyboardTypeChangedSignal().Emit( Dali::ImfManager::KeyboardType::SOFTWARE_KEYBOARD ); + break; + } + case ECORE_IMF_INPUT_PANEL_HW_KEYBOARD_MODE: + { + // Emit Signal that the keyboard type is changed to Hardware Keyboard + imfManager->KeyboardTypeChangedSignal().Emit( Dali::ImfManager::KeyboardType::HARDWARE_KEYBOARD ); + break; + } + } +} + /** * Called when an IMF delete surrounding event is received. * Here we tell the application that it should delete a certain range. @@ -230,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 ); @@ -246,6 +286,7 @@ bool ImfManager::IsAvailable() Dali::ImfManager ImfManager::Get() { Dali::ImfManager manager; + ImfManager *imfManager = NULL; Dali::SingletonService service( SingletonService::Get() ); if ( service ) @@ -255,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(); @@ -272,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 @@ -283,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 ) { @@ -362,6 +405,7 @@ void ImfManager::ConnectCallbacks() ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, InputPanelStateChangeCallback, this ); ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback, this ); ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback, this ); + ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_KEYBOARD_MODE_EVENT, InputPanelKeyboardTypeChangedCallback, this ); ecore_imf_context_retrieve_surrounding_callback_set( mIMFContext, ImfRetrieveSurrounding, this); } @@ -381,6 +425,7 @@ void ImfManager::DisconnectCallbacks() ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, InputPanelStateChangeCallback ); ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback ); ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback ); + ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_KEYBOARD_MODE_EVENT, InputPanelKeyboardTypeChangedCallback ); // We do not need to unset the retrieve surrounding callback. } @@ -411,7 +456,6 @@ void ImfManager::Deactivate() Reset(); ecore_imf_context_focus_out( mIMFContext ); - ecore_imf_context_input_panel_hide( mIMFContext ); } // Reset mIdleCallbackConnected @@ -560,16 +604,21 @@ Eina_Bool ImfManager::RetrieveSurrounding( void* data, Ecore_IMF_Context* imfCon Dali::ImfManager::ImfEventData imfData( Dali::ImfManager::GETSURROUNDING, std::string(), 0, 0 ); Dali::ImfManager handle( this ); - mEventSignal.Emit( handle, imfData ); + Dali::ImfManager::ImfCallbackData callbackData = mEventSignal.Emit( handle, imfData ); - if( text ) + if( callbackData.update ) { - *text = strdup( mSurroundingText.c_str() ); - } + if( text ) + { + // The memory allocated by strdup() can be freed by ecore_imf_context_surrounding_get() internally. + *text = strdup( callbackData.currentText.c_str() ); + } - if( cursorPosition ) - { - *cursorPosition = mIMFCursorPosition; + if( cursorPosition ) + { + mIMFCursorPosition = static_cast( callbackData.cursorPosition ); + *cursorPosition = mIMFCursorPosition; + } } return EINA_TRUE; @@ -651,9 +700,10 @@ const std::string& ImfManager::GetSurroundingText() const void ImfManager::NotifyTextInputMultiLine( bool multiLine ) { Ecore_IMF_Input_Hints currentHint = ecore_imf_context_input_hint_get(mIMFContext); - ecore_imf_context_input_hint_set(mIMFContext, (Ecore_IMF_Input_Hints)(multiLine ? - (currentHint | ECORE_IMF_INPUT_HINT_MULTILINE) : - (currentHint & ~ECORE_IMF_INPUT_HINT_MULTILINE))); + ecore_imf_context_input_hint_set( mIMFContext, + static_cast< Ecore_IMF_Input_Hints >( multiLine ? + (currentHint | ECORE_IMF_INPUT_HINT_MULTILINE) : + (currentHint & ~ECORE_IMF_INPUT_HINT_MULTILINE))); } Dali::ImfManager::TextDirection ImfManager::GetTextDirection() @@ -669,7 +719,7 @@ Dali::ImfManager::TextDirection ImfManager::GetTextDirection() if ( locale ) { - direction = Locale::GetTextDirection( std::string( locale ) ); + direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) ); free( locale ); } } @@ -726,25 +776,28 @@ void ImfManager::ApplyOptions( const InputMethodOptions& options ) } } -void ImfManager::SetInputPanelUserData( const std::string& data ) +void ImfManager::SetInputPanelData( const std::string& data ) { - DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetInputPanelUserData\n" ); + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetInputPanelData\n" ); if( mIMFContext ) { int length = data.length(); - ecore_imf_context_input_panel_imdata_set( mIMFContext, &data, length ); + ecore_imf_context_input_panel_imdata_set( mIMFContext, data.c_str(), length ); } } -void ImfManager::GetInputPanelUserData( std::string& data ) +void ImfManager::GetInputPanelData( std::string& data ) { - DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelUserData\n" ); + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelData\n" ); if( mIMFContext ) { - int* length = NULL; - ecore_imf_context_input_panel_imdata_get( mIMFContext, &data, length ); + int length = 4096; // The max length is 4096 bytes + Dali::Vector< char > buffer; + buffer.Resize( length ); + ecore_imf_context_input_panel_imdata_get( mIMFContext, &buffer[0], &length ); + data = std::string( buffer.Begin(), buffer.End() ); } } @@ -822,13 +875,65 @@ void ImfManager::HideInputPanel() if( mIMFContext ) { - ecore_imf_context_focus_out( mIMFContext ); ecore_imf_context_input_panel_hide( mIMFContext ); } } +Dali::ImfManager::KeyboardType ImfManager::GetKeyboardType() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetKeyboardType\n" ); + +#ifdef OVER_TIZEN_VERSION_4 + if( mIMFContext ) + { + int value; + value = ecore_imf_context_keyboard_mode_get( mIMFContext ); + + switch (value) + { + case ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE: + { + return Dali::ImfManager::SOFTWARE_KEYBOARD; + break; + } + case ECORE_IMF_INPUT_PANEL_HW_KEYBOARD_MODE: + { + return Dali::ImfManager::HARDWARE_KEYBOARD; + break; + } + } + } +#endif // OVER_TIZEN_VERSION_4 + return Dali::ImfManager::KeyboardType::SOFTWARE_KEYBOARD; +} + +std::string ImfManager::GetInputPanelLocale() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelLocale\n" ); + + std::string locale = ""; + + if( mIMFContext ) + { + char* value = NULL; + ecore_imf_context_input_panel_language_locale_get( mIMFContext, &value ); + + if( value ) + { + std::string valueCopy( value ); + locale = valueCopy; + + // The locale string retrieved must be freed with free(). + free( value ); + } + } + return locale; +} + } // Adaptor } // Internal } // Dali + +#pragma GCC diagnostic pop