2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 // Ecore is littered with C style cast
20 #pragma GCC diagnostic push
21 #pragma GCC diagnostic ignored "-Wold-style-cast"
22 #include <imf-manager-impl.h>
25 #include <dali/public-api/events/key-event.h>
26 #include <dali/public-api/object/type-registry.h>
27 #include <dali/integration-api/debug.h>
30 #include <input-method-devel.h>
32 #include <locale-utils.h>
33 #include <window-render-surface.h>
34 #include <adaptor-impl.h>
35 #include <singleton-service-impl.h>
37 #define TOKEN_STRING(x) #x
39 Ecore_IMF_Input_Panel_Layout panelLayoutMap[] =
41 ECORE_IMF_INPUT_PANEL_LAYOUT_NORMAL,
42 ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER,
43 ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL,
44 ECORE_IMF_INPUT_PANEL_LAYOUT_URL,
45 ECORE_IMF_INPUT_PANEL_LAYOUT_PHONENUMBER,
46 ECORE_IMF_INPUT_PANEL_LAYOUT_IP,
47 ECORE_IMF_INPUT_PANEL_LAYOUT_MONTH,
48 ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBERONLY,
49 ECORE_IMF_INPUT_PANEL_LAYOUT_HEX,
50 ECORE_IMF_INPUT_PANEL_LAYOUT_TERMINAL,
51 ECORE_IMF_INPUT_PANEL_LAYOUT_PASSWORD,
52 ECORE_IMF_INPUT_PANEL_LAYOUT_DATETIME,
53 ECORE_IMF_INPUT_PANEL_LAYOUT_EMOTICON,
54 ECORE_IMF_INPUT_PANEL_LAYOUT_VOICE
57 Ecore_IMF_Autocapital_Type autoCapitalMap[] =
59 ECORE_IMF_AUTOCAPITAL_TYPE_NONE,
60 ECORE_IMF_AUTOCAPITAL_TYPE_WORD,
61 ECORE_IMF_AUTOCAPITAL_TYPE_SENTENCE,
62 ECORE_IMF_AUTOCAPITAL_TYPE_ALLCHARACTER,
65 Ecore_IMF_Input_Panel_Return_Key_Type returnKeyTypeMap[] =
67 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT,
68 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DONE,
69 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_GO,
70 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_JOIN,
71 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_LOGIN,
72 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_NEXT,
73 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SEARCH,
74 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SEND,
75 ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_SIGNIN
89 #if defined(DEBUG_ENABLED)
90 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_IMF_MANAGER");
93 // Currently this code is internal to dali/dali/internal/event/text/utf8.h but should be made Public and used from there instead.
94 size_t Utf8SequenceLength(const unsigned char leadByte)
98 if ((leadByte & 0x80) == 0 ) //ASCII character (lead bit zero)
102 else if (( leadByte & 0xe0 ) == 0xc0 ) //110x xxxx
106 else if (( leadByte & 0xf0 ) == 0xe0 ) //1110 xxxx
110 else if (( leadByte & 0xf8 ) == 0xf0 ) //1111 0xxx
118 // Static function calls used by ecore 'c' style callback registration
119 void Commit( void *data, Ecore_IMF_Context *imfContext, void *event_info )
123 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
124 imfManager->CommitReceived( data, imfContext, event_info );
128 void PreEdit( void *data, Ecore_IMF_Context *imfContext, void *event_info )
132 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
133 imfManager->PreEditChanged( data, imfContext, event_info );
137 Eina_Bool ImfRetrieveSurrounding(void *data, Ecore_IMF_Context *imfContext, char** text, int* cursorPosition )
141 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
142 return imfManager->RetrieveSurrounding( data, imfContext, text, cursorPosition );
150 void InputPanelStateChangeCallback( void* data, Ecore_IMF_Context* context, int value )
156 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
159 case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
161 imfManager->StatusChangedSignal().Emit( true );
165 case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
167 imfManager->StatusChangedSignal().Emit( false );
171 case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW:
180 void InputPanelLanguageChangeCallback( void* data, Ecore_IMF_Context* context, int value )
186 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
187 // Emit the signal that the language has changed
188 imfManager->LanguageChangedSignal().Emit();
191 void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, int value )
197 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
198 // Emit signal that the keyboard is resized
199 imfManager->ResizedSignal().Emit();
202 void InputPanelKeyboardTypeChangedCallback( void *data, Ecore_IMF_Context *context, int value )
209 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
212 case ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE:
214 // Emit Signal that the keyboard type is changed to Software Keyboard
215 imfManager->KeyboardTypeChangedSignal().Emit( Dali::ImfManager::KeyboardType::SOFTWARE_KEYBOARD );
218 case ECORE_IMF_INPUT_PANEL_HW_KEYBOARD_MODE:
220 // Emit Signal that the keyboard type is changed to Hardware Keyboard
221 imfManager->KeyboardTypeChangedSignal().Emit( Dali::ImfManager::KeyboardType::HARDWARE_KEYBOARD );
228 * Called when an IMF delete surrounding event is received.
229 * Here we tell the application that it should delete a certain range.
231 void ImfDeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *event_info )
235 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
236 imfManager->DeleteSurrounding( data, imfContext, event_info );
241 * Called when the input method sends a private command.
243 void PrivateCommand( void *data, Ecore_IMF_Context *imfContext, void *event_info )
247 ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data );
248 imfManager->SendPrivateCommand( data, imfContext, event_info );
254 return ImfManager::Get();
257 TypeRegistration IMF_MANAGER_TYPE( typeid(Dali::ImfManager), typeid(Dali::BaseHandle), Create );
259 } // unnamed namespace
261 void ImfManager::Finalize()
263 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Finalize\n" );
266 DisconnectCallbacks();
268 ecore_imf_shutdown();
273 bool ImfManager::IsAvailable()
275 bool available( false );
277 Dali::SingletonService service( SingletonService::Get() );
280 available = service.GetSingleton( typeid( Dali::ImfManager ) );
286 Dali::ImfManager ImfManager::Get()
288 Dali::ImfManager manager;
289 ImfManager *imfManager = NULL;
291 Dali::SingletonService service( SingletonService::Get() );
294 // Check whether the singleton is already created
295 Dali::BaseHandle handle = service.GetSingleton( typeid( Dali::ImfManager ) );
298 // If so, downcast the handle
299 imfManager = dynamic_cast< ImfManager* >( handle.GetObjectPtr() );
300 manager = Dali::ImfManager( imfManager );
302 else if ( Adaptor::IsAvailable() )
304 // Create instance and register singleton only if the adaptor is available
305 Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) );
306 Any nativeWindow = adaptorImpl.GetNativeWindowHandle();
308 // The Ecore_Wl_Window needs to use the ImfManager.
309 // Only when the render surface is window, we can get the Ecore_Wl_Window.
310 Ecore_Wl_Window *ecoreWwin( AnyCast< Ecore_Wl_Window* >( nativeWindow ) );
313 // If we fail to get Ecore_Wl_Window, we can't use the ImfManager correctly.
314 // Thus you have to call "ecore_imf_context_client_window_set" somewhere.
315 // In EvasPlugIn, this function is called in EvasPlugin::ConnectEcoreEvent().
316 imfManager = new ImfManager( ecoreWwin );
317 manager = Dali::ImfManager( imfManager );
318 service.Register( typeid( manager ), manager );
322 DALI_LOG_ERROR("Failed to get native window handle\n");
327 if ( ( imfManager != NULL ) && !imfManager->mInited )
330 imfManager->CreateContext( imfManager->mEcoreWlwin );
332 imfManager->ConnectCallbacks();
333 imfManager->mInited = true;
339 ImfManager::ImfManager( Ecore_Wl_Window *ecoreWlwin )
341 mEcoreWlwin( ecoreWlwin ),
342 mIMFCursorPosition( 0 ),
345 mRestoreAfterFocusLost( false ),
346 mIdleCallbackConnected( false )
350 ImfManager::~ImfManager()
355 void ImfManager::CreateContext( Ecore_Wl_Window *ecoreWlwin )
357 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::CreateContext\n" );
358 const char *contextId = ecore_imf_context_default_id_get();
361 mIMFContext = ecore_imf_context_add( contextId );
367 ecore_imf_context_client_window_set( mIMFContext,
368 reinterpret_cast<void*>( ecore_wl_window_id_get(ecoreWlwin)) );
373 DALI_LOG_WARNING("IMF Unable to get IMF Context\n");
378 DALI_LOG_WARNING("IMF Unable to get IMF Context\n");
382 void ImfManager::DeleteContext()
384 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::DeleteContext\n" );
388 ecore_imf_context_del( mIMFContext );
393 // Callbacks for predicitive text support.
394 void ImfManager::ConnectCallbacks()
398 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::ConnectCallbacks\n" );
400 ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit, this );
401 ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit, this );
402 ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding, this );
403 ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_PRIVATE_COMMAND_SEND, PrivateCommand, this );
405 ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, InputPanelStateChangeCallback, this );
406 ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback, this );
407 ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback, this );
408 ecore_imf_context_input_panel_event_callback_add( mIMFContext, ECORE_IMF_INPUT_PANEL_KEYBOARD_MODE_EVENT, InputPanelKeyboardTypeChangedCallback, this );
410 ecore_imf_context_retrieve_surrounding_callback_set( mIMFContext, ImfRetrieveSurrounding, this);
414 void ImfManager::DisconnectCallbacks()
418 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::DisconnectCallbacks\n" );
420 ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit );
421 ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit );
422 ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding );
423 ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_PRIVATE_COMMAND_SEND, PrivateCommand );
425 ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT, InputPanelStateChangeCallback );
426 ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback );
427 ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback );
428 ecore_imf_context_input_panel_event_callback_del( mIMFContext, ECORE_IMF_INPUT_PANEL_KEYBOARD_MODE_EVENT, InputPanelKeyboardTypeChangedCallback );
430 // We do not need to unset the retrieve surrounding callback.
434 void ImfManager::Activate()
436 // Reset mIdleCallbackConnected
437 mIdleCallbackConnected = false;
441 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Activate\n" );
443 ecore_imf_context_focus_in( mIMFContext );
445 // emit keyboard activated signal
446 Dali::ImfManager handle( this );
447 mActivatedSignal.Emit( handle );
451 void ImfManager::Deactivate()
455 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Deactivate\n" );
458 ecore_imf_context_focus_out( mIMFContext );
461 // Reset mIdleCallbackConnected
462 mIdleCallbackConnected = false;
465 void ImfManager::Reset()
467 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::Reset\n" );
471 ecore_imf_context_reset( mIMFContext );
475 Ecore_IMF_Context* ImfManager::GetContext()
477 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetContext\n" );
482 bool ImfManager::RestoreAfterFocusLost() const
484 return mRestoreAfterFocusLost;
487 void ImfManager::SetRestoreAfterFocusLost( bool toggle )
489 mRestoreAfterFocusLost = toggle;
493 * Called when an IMF Pre-Edit changed event is received.
494 * We are still predicting what the user is typing. The latest string is what the IMF module thinks
495 * the user wants to type.
497 void ImfManager::PreEditChanged( void*, Ecore_IMF_Context* imfContext, void* event_info )
499 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::PreEditChanged\n" );
501 char* preEditString( NULL );
502 int cursorPosition( 0 );
503 Eina_List* attrs = NULL;
506 Ecore_IMF_Preedit_Attr* attr;
508 // Retrieves attributes as well as the string the cursor position offset from start of pre-edit string.
509 // the attributes (attrs) is used in languages that use the soft arrows keys to insert characters into a current pre-edit string.
510 ecore_imf_context_preedit_string_with_attributes_get( imfContext, &preEditString, &attrs, &cursorPosition );
514 // iterate through the list of attributes getting the type, start and end position.
515 for ( l = attrs, (attr = static_cast<Ecore_IMF_Preedit_Attr*>( eina_list_data_get(l) ) ); l; l = eina_list_next(l), ( attr = static_cast<Ecore_IMF_Preedit_Attr*>( eina_list_data_get(l) ) ))
517 #ifdef DALI_PROFILE_UBUNTU
518 if ( attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB3 ) // (Ecore_IMF)
519 #else // DALI_PROFILE_UBUNTU
520 if ( attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB4 ) // (Ecore_IMF)
521 #endif // DALI_PROFILE_UBUNTU
523 // check first byte so know how many bytes a character is represented by as keyboard returns cursor position in bytes. Which is different for some languages.
525 size_t visualCharacterIndex = 0;
526 size_t byteIndex = 0;
528 // iterate through null terminated string checking each character's position against the given byte position ( attr->end_index ).
529 const char leadByte = preEditString[byteIndex];
530 while( leadByte != '\0' )
532 // attr->end_index is provided as a byte position not character and we need to know the character position.
533 const size_t currentSequenceLength = Utf8SequenceLength( leadByte ); // returns number of bytes used to represent character.
534 if ( byteIndex == attr->end_index )
536 cursorPosition = visualCharacterIndex;
538 // end loop as found cursor position that matches byte position
542 byteIndex += currentSequenceLength; // jump to next character
543 visualCharacterIndex++; // increment character count so we know our position for when we get a match
546 DALI_ASSERT_DEBUG( visualCharacterIndex < strlen( preEditString ));
552 if ( Dali::Adaptor::IsAvailable() )
554 Dali::ImfManager handle( this );
555 Dali::ImfManager::ImfEventData imfEventData( Dali::ImfManager::PREEDIT, preEditString, cursorPosition, 0 );
556 Dali::ImfManager::ImfCallbackData callbackData = mEventSignal.Emit( handle, imfEventData );
558 if ( callbackData.update )
560 SetCursorPosition( callbackData.cursorPosition );
561 SetSurroundingText( callbackData.currentText );
563 NotifyCursorPosition();
566 if ( callbackData.preeditResetRequired )
571 free( preEditString );
574 void ImfManager::CommitReceived( void*, Ecore_IMF_Context* imfContext, void* event_info )
576 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::CommitReceived\n" );
578 if ( Dali::Adaptor::IsAvailable() )
580 const std::string keyString( static_cast<char*>( event_info ) );
582 Dali::ImfManager handle( this );
583 Dali::ImfManager::ImfEventData imfEventData( Dali::ImfManager::COMMIT, keyString, 0, 0 );
584 Dali::ImfManager::ImfCallbackData callbackData = mEventSignal.Emit( handle, imfEventData );
586 if( callbackData.update )
588 SetCursorPosition( callbackData.cursorPosition );
589 SetSurroundingText( callbackData.currentText );
591 NotifyCursorPosition();
597 * Called when an IMF retrieve surround event is received.
598 * Here the IMF module wishes to know the string we are working with and where within the string the cursor is
599 * We need to signal the application to tell us this information.
601 Eina_Bool ImfManager::RetrieveSurrounding( void* data, Ecore_IMF_Context* imfContext, char** text, int* cursorPosition )
603 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::RetrieveSurrounding\n" );
605 Dali::ImfManager::ImfEventData imfData( Dali::ImfManager::GETSURROUNDING, std::string(), 0, 0 );
606 Dali::ImfManager handle( this );
607 Dali::ImfManager::ImfCallbackData callbackData = mEventSignal.Emit( handle, imfData );
609 if( callbackData.update )
613 // The memory allocated by strdup() can be freed by ecore_imf_context_surrounding_get() internally.
614 *text = strdup( callbackData.currentText.c_str() );
619 mIMFCursorPosition = static_cast<int>( callbackData.cursorPosition );
620 *cursorPosition = mIMFCursorPosition;
628 * Called when an IMF delete surrounding event is received.
629 * Here we tell the application that it should delete a certain range.
631 void ImfManager::DeleteSurrounding( void* data, Ecore_IMF_Context* imfContext, void* event_info )
633 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::DeleteSurrounding\n" );
635 if( Dali::Adaptor::IsAvailable() )
637 Ecore_IMF_Event_Delete_Surrounding* deleteSurroundingEvent = static_cast<Ecore_IMF_Event_Delete_Surrounding*>( event_info );
639 Dali::ImfManager::ImfEventData imfData( Dali::ImfManager::DELETESURROUNDING, std::string(), deleteSurroundingEvent->offset, deleteSurroundingEvent->n_chars );
640 Dali::ImfManager handle( this );
641 mEventSignal.Emit( handle, imfData );
646 * Called when the input method sends a private command.
648 void ImfManager::SendPrivateCommand( void* data, Ecore_IMF_Context* imfContext, void* event_info )
650 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SendPrivateCommand\n" );
652 if( Dali::Adaptor::IsAvailable() )
654 const char* privateCommandSendEvent = static_cast<const char*>( event_info );
656 Dali::ImfManager::ImfEventData imfData( Dali::ImfManager::PRIVATECOMMAND, privateCommandSendEvent, 0, 0 );
657 Dali::ImfManager handle( this );
658 mEventSignal.Emit( handle, imfData );
662 void ImfManager::NotifyCursorPosition()
664 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::NotifyCursorPosition\n" );
668 ecore_imf_context_cursor_position_set( mIMFContext, mIMFCursorPosition );
672 void ImfManager::SetCursorPosition( unsigned int cursorPosition )
674 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetCursorPosition\n" );
676 mIMFCursorPosition = static_cast<int>( cursorPosition );
679 unsigned int ImfManager::GetCursorPosition() const
681 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetCursorPosition\n" );
683 return static_cast<unsigned int>( mIMFCursorPosition );
686 void ImfManager::SetSurroundingText( const std::string& text )
688 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetSurroundingText\n" );
690 mSurroundingText = text;
693 const std::string& ImfManager::GetSurroundingText() const
695 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetSurroundingText\n" );
697 return mSurroundingText;
700 void ImfManager::NotifyTextInputMultiLine( bool multiLine )
702 Ecore_IMF_Input_Hints currentHint = ecore_imf_context_input_hint_get(mIMFContext);
703 ecore_imf_context_input_hint_set( mIMFContext,
704 static_cast< Ecore_IMF_Input_Hints >( multiLine ?
705 (currentHint | ECORE_IMF_INPUT_HINT_MULTILINE) :
706 (currentHint & ~ECORE_IMF_INPUT_HINT_MULTILINE)));
709 Dali::ImfManager::TextDirection ImfManager::GetTextDirection()
711 Dali::ImfManager::TextDirection direction ( Dali::ImfManager::LeftToRight );
713 if ( ImfManager::IsAvailable() /* We do not want to create an instance of ImfManager */ )
717 char* locale( NULL );
718 ecore_imf_context_input_panel_language_locale_get( mIMFContext, &locale );
722 direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) );
730 Rect<int> ImfManager::GetInputMethodArea()
732 int xPos, yPos, width, height;
734 width = height = xPos = yPos = 0;
738 ecore_imf_context_input_panel_geometry_get( mIMFContext, &xPos, &yPos, &width, &height );
742 DALI_LOG_WARNING("VKB Unable to get IMF Context so GetSize unavailable\n");
743 // return 0 as real size unknown.
746 return Rect<int>(xPos,yPos,width,height);
749 void ImfManager::ApplyOptions( const InputMethodOptions& options )
751 using namespace Dali::InputMethod::Category;
755 if (mIMFContext == NULL)
757 DALI_LOG_WARNING("VKB Unable to excute ApplyOptions with Null ImfContext\n");
761 if ( mOptions.CompareAndSet(PANEL_LAYOUT, options, index) )
763 ecore_imf_context_input_panel_layout_set( mIMFContext, panelLayoutMap[index] );
765 if ( mOptions.CompareAndSet(AUTO_CAPITALISE, options, index) )
767 ecore_imf_context_autocapital_type_set( mIMFContext, autoCapitalMap[index] );
769 if ( mOptions.CompareAndSet(ACTION_BUTTON_TITLE, options, index) )
771 ecore_imf_context_input_panel_return_key_type_set( mIMFContext, returnKeyTypeMap[index] );
773 if ( mOptions.CompareAndSet(VARIATION, options, index) )
775 ecore_imf_context_input_panel_layout_variation_set( mIMFContext, index );
779 void ImfManager::SetInputPanelData( const std::string& data )
781 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetInputPanelData\n" );
785 int length = data.length();
786 ecore_imf_context_input_panel_imdata_set( mIMFContext, data.c_str(), length );
790 void ImfManager::GetInputPanelData( std::string& data )
792 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelData\n" );
796 int length = 4096; // The max length is 4096 bytes
797 Dali::Vector< char > buffer;
798 buffer.Resize( length );
799 ecore_imf_context_input_panel_imdata_get( mIMFContext, &buffer[0], &length );
800 data = std::string( buffer.Begin(), buffer.End() );
804 Dali::ImfManager::State ImfManager::GetInputPanelState()
806 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelState\n" );
811 value = ecore_imf_context_input_panel_state_get( mIMFContext );
815 case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
817 return Dali::ImfManager::SHOW;
821 case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
823 return Dali::ImfManager::HIDE;
827 case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW:
829 return Dali::ImfManager::WILL_SHOW;
835 return Dali::ImfManager::DEFAULT;
839 return Dali::ImfManager::DEFAULT;
842 void ImfManager::SetReturnKeyState( bool visible )
844 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetReturnKeyState\n" );
848 ecore_imf_context_input_panel_return_key_disabled_set( mIMFContext, !visible );
852 void ImfManager::AutoEnableInputPanel( bool enabled )
854 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::AutoEnableInputPanel\n" );
858 ecore_imf_context_input_panel_enabled_set( mIMFContext, enabled );
862 void ImfManager::ShowInputPanel()
864 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::ShowInputPanel\n" );
868 ecore_imf_context_input_panel_show( mIMFContext );
872 void ImfManager::HideInputPanel()
874 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::HideInputPanel\n" );
878 ecore_imf_context_input_panel_hide( mIMFContext );
882 Dali::ImfManager::KeyboardType ImfManager::GetKeyboardType()
884 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetKeyboardType\n" );
886 #ifdef OVER_TIZEN_VERSION_4
890 value = ecore_imf_context_keyboard_mode_get( mIMFContext );
894 case ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE:
896 return Dali::ImfManager::SOFTWARE_KEYBOARD;
899 case ECORE_IMF_INPUT_PANEL_HW_KEYBOARD_MODE:
901 return Dali::ImfManager::HARDWARE_KEYBOARD;
906 #endif // OVER_TIZEN_VERSION_4
907 return Dali::ImfManager::KeyboardType::SOFTWARE_KEYBOARD;
910 std::string ImfManager::GetInputPanelLocale()
912 DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelLocale\n" );
914 std::string locale = "";
919 ecore_imf_context_input_panel_language_locale_get( mIMFContext, &value );
923 std::string valueCopy( value );
926 // The locale string retrieved must be freed with free().
939 #pragma GCC diagnostic pop