/*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 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.
// EXTERNAL INCLUDES
#include <dali/public-api/events/key-event.h>
#include <dali/public-api/object/type-registry.h>
+#include <dali/devel-api/common/singleton-service.h>
#include <dali/integration-api/debug.h>
// INTERNAL INCLUDES
#include <dali/public-api/adaptor-framework/key.h>
-#include <dali/integration-api/adaptors/adaptor.h>
+#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/internal/adaptor/common/adaptor-impl.h>
#include <dali/internal/input/common/key-impl.h>
#include <dali/internal/input/common/virtual-keyboard-impl.h>
#include <dali/internal/input/tizen-wayland/ecore-virtual-keyboard.h>
#include <dali/internal/input/ubuntu-x11/dali-ecore-input.h>
#include <dali/internal/system/common/locale-utils.h>
-#include <dali/internal/system/common/singleton-service-impl.h>
#include <dali/internal/system/linux/dali-ecore.h>
namespace Dali
{
size_t length = 0;
- if ((leadByte & 0x80) == 0 ) //ASCII character (lead bit zero)
+ if( ( leadByte & 0x80 ) == 0 ) //ASCII character (lead bit zero)
{
length = 1;
}
- else if (( leadByte & 0xe0 ) == 0xc0 ) //110x xxxx
+ else if( ( leadByte & 0xe0 ) == 0xc0 ) //110x xxxx
{
length = 2;
}
- else if (( leadByte & 0xf0 ) == 0xe0 ) //1110 xxxx
+ else if( ( leadByte & 0xf0 ) == 0xe0 ) //1110 xxxx
{
length = 3;
}
- else if (( leadByte & 0xf8 ) == 0xf0 ) //1111 0xxx
+ else if( ( leadByte & 0xf8 ) == 0xf0 ) //1111 0xxx
{
length = 4;
}
+ else if( ( leadByte & 0xfc ) == 0xf8 ) //1111 10xx
+ {
+ length = 5;
+ }
+ else if( ( leadByte & 0xfe ) == 0xfc ) //1111 110x
+ {
+ length = 6;
+ }
return length;
}
mIMFCursorPosition( 0 ),
mSurroundingText(),
mRestoreAfterFocusLost( false ),
- mIdleCallbackConnected( false ),
- mPreeditType( Dali::InputMethodContext::PreeditStyle::NONE )
+ mIdleCallbackConnected( false )
{
ecore_imf_init();
- actor.OnStageSignal().Connect( this, &InputMethodContextX::OnStaged );
+ actor.OnSceneSignal().Connect( this, &InputMethodContextX::OnStaged );
}
InputMethodContextX::~InputMethodContextX()
Ecore_IMF_Preedit_Attr* attr;
+ mPreeditAttrs.Clear();
+
// Retrieves attributes as well as the string the cursor position offset from start of pre-edit string.
// the attributes (attrs) is used in languages that use the soft arrows keys to insert characters into a current pre-edit string.
ecore_imf_context_preedit_string_with_attributes_get( context, &preEditString, &attrs, &cursorPosition );
// iterate through the list of attributes getting the type, start and end position.
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) ) ))
{
+ Dali::InputMethodContext::PreeditAttributeData data;
+ data.startIndex = 0;
+ data.endIndex = 0;
+
+ size_t visualCharacterIndex = 0;
+ size_t byteIndex = 0;
+
+ // iterate through null terminated string checking each character's position against the given byte position ( attr->end_index ).
+ char leadByte = preEditString[byteIndex];
+
+ while( leadByte != '\0' )
+ {
+ leadByte = preEditString[byteIndex]; // Update the character to get the number of its byte
+
+ // attr->end_index is provided as a byte position not character and we need to know the character position.
+ const size_t currentSequenceLength = Utf8SequenceLength( leadByte ); // returns number of bytes used to represent character.
+ if( byteIndex <= attr->start_index )
+ {
+ data.startIndex = visualCharacterIndex;
+ }
+ if( byteIndex >= attr->end_index )
+ {
+ data.endIndex = visualCharacterIndex;
+ break;
+ // end loop as found cursor position that matches byte position
+ }
+ else
+ {
+ byteIndex += currentSequenceLength; // jump to next character
+ visualCharacterIndex++; // increment character count so we know our position for when we get a match
+ }
+ }
+
switch( attr->preedit_type )
{
case ECORE_IMF_PREEDIT_TYPE_NONE:
{
- mPreeditType = Dali::InputMethodContext::PreeditStyle::NONE;
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::NONE;
break;
}
case ECORE_IMF_PREEDIT_TYPE_SUB1:
{
- mPreeditType = Dali::InputMethodContext::PreeditStyle::UNDERLINE;
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::UNDERLINE;
break;
}
case ECORE_IMF_PREEDIT_TYPE_SUB2:
{
- mPreeditType = Dali::InputMethodContext::PreeditStyle::REVERSE;
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::REVERSE;
break;
}
case ECORE_IMF_PREEDIT_TYPE_SUB3:
{
- mPreeditType = Dali::InputMethodContext::PreeditStyle::HIGHLIGHT;
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::HIGHLIGHT;
break;
}
- default:
+ case ECORE_IMF_PREEDIT_TYPE_SUB4:
{
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_1;
break;
}
- }
-
-#ifdef DALI_PROFILE_UBUNTU
- if ( attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB3 ) // (Ecore_IMF)
-#else // DALI_PROFILE_UBUNTU
- if ( attr->preedit_type == ECORE_IMF_PREEDIT_TYPE_SUB4 ) // (Ecore_IMF)
-#endif // DALI_PROFILE_UBUNTU
- {
- // 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.
-
- size_t visualCharacterIndex = 0;
- size_t byteIndex = 0;
-
- // iterate through null terminated string checking each character's position against the given byte position ( attr->end_index ).
- const char leadByte = preEditString[byteIndex];
- while( leadByte != '\0' )
+ case ECORE_IMF_PREEDIT_TYPE_SUB5:
+ {
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_2;
+ break;
+ }
+ case ECORE_IMF_PREEDIT_TYPE_SUB6:
{
- // attr->end_index is provided as a byte position not character and we need to know the character position.
- const size_t currentSequenceLength = Utf8SequenceLength( leadByte ); // returns number of bytes used to represent character.
- if ( byteIndex == attr->end_index )
- {
- cursorPosition = static_cast<int>( visualCharacterIndex );
- break;
- // end loop as found cursor position that matches byte position
- }
- else
- {
- byteIndex += currentSequenceLength; // jump to next character
- visualCharacterIndex++; // increment character count so we know our position for when we get a match
- }
-
- DALI_ASSERT_DEBUG( visualCharacterIndex < strlen( preEditString ));
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_3;
+ break;
+ }
+ case ECORE_IMF_PREEDIT_TYPE_SUB7:
+ {
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::CUSTOM_PLATFORM_STYLE_4;
+ break;
+ }
+ default:
+ {
+ data.preeditType = Dali::InputMethodContext::PreeditStyle::NONE;
+ break;
}
}
+ mPreeditAttrs.PushBack( data );
}
}
// ecore_imf_context_input_panel_position_set() is supported from ecore-imf 1.21.0 version.
}
-Dali::InputMethodContext::PreeditStyle InputMethodContextX::GetPreeditStyle() const
+void InputMethodContextX::GetPreeditStyle( Dali::InputMethodContext::PreEditAttributeDataContainer& attrs ) const
{
DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::GetPreeditStyle\n" );
- return mPreeditType;
+ attrs = mPreeditAttrs;
}
bool InputMethodContextX::ProcessEventKeyDown( const KeyEvent& keyEvent )