}
// Static function calls used by ecore 'c' style callback registration
-void Commit( void *data, Ecore_IMF_Context *imfContext, void *event_info )
+void Commit( void *data, Ecore_IMF_Context *imfContext, void *eventInfo )
{
if ( data )
{
- InputMethodContextX* inputMethodContext = reinterpret_cast< InputMethodContextX* > ( data );
- inputMethodContext->CommitReceived( data, imfContext, event_info );
+ InputMethodContextX* inputMethodContext = static_cast< InputMethodContextX* >( data );
+ inputMethodContext->CommitReceived( data, imfContext, eventInfo );
}
}
-void PreEdit( void *data, Ecore_IMF_Context *imfContext, void *event_info )
+void PreEdit( void *data, Ecore_IMF_Context *imfContext, void *eventInfo )
{
if ( data )
{
- InputMethodContextX* inputMethodContext = reinterpret_cast< InputMethodContextX* > ( data );
- inputMethodContext->PreEditChanged( data, imfContext, event_info );
+ InputMethodContextX* inputMethodContext = static_cast< InputMethodContextX* >( data );
+ inputMethodContext->PreEditChanged( data, imfContext, eventInfo );
}
}
{
if ( data )
{
- InputMethodContextX* inputMethodContext = reinterpret_cast< InputMethodContextX* > ( data );
+ InputMethodContextX* inputMethodContext = static_cast< InputMethodContextX* >( data );
return inputMethodContext->RetrieveSurrounding( data, imfContext, text, cursorPosition );
}
else
* Called when an InputMethodContext delete surrounding event is received.
* Here we tell the application that it should delete a certain range.
*/
-void ImfDeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *event_info )
+void ImfDeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *eventInfo )
{
if ( data )
{
- InputMethodContextX* inputMethodContext = reinterpret_cast< InputMethodContextX* > ( data );
- inputMethodContext->DeleteSurrounding( data, imfContext, event_info );
+ InputMethodContextX* inputMethodContext = static_cast< InputMethodContextX* >( data );
+ inputMethodContext->DeleteSurrounding( data, imfContext, eventInfo );
}
}
} // unnamed namespace
-InputMethodContextPtr InputMethodContextX::New()
+InputMethodContextPtr InputMethodContextX::New( Dali::Actor actor )
{
InputMethodContextPtr manager;
- if ( Adaptor::IsAvailable() )
+ if( actor && Dali::Adaptor::IsAvailable() )
{
- // Create instance and register singleton only if the adaptor is available
- Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) );
- Any nativeWindow = adaptorImpl.GetNativeWindowHandle();
-
- // The Ecore_X_Window needs to use the InputMethodContext.
- // Only when the render surface is window, we can get the Ecore_X_Window.
- Ecore_X_Window ecoreXwin( AnyCast<Ecore_X_Window>(nativeWindow) );
- if (ecoreXwin)
- {
- // If we fail to get Ecore_X_Window, we can't use the InputMethodContext correctly.
- // Thus you have to call "ecore_imf_context_client_window_set" somewhere.
- // In EvasPlugIn, this function is called in EvasPlugin::ConnectEcoreEvent().
-
- manager = new InputMethodContextX( ecoreXwin );
- }
- else
- {
- DALI_LOG_ERROR("Failed to get native window handle\n");
- }
+ manager = new InputMethodContextX( actor );
}
return manager;
DeleteContext();
}
-InputMethodContextX::InputMethodContextX( Ecore_X_Window ecoreXwin )
+InputMethodContextX::InputMethodContextX( Dali::Actor actor )
: mIMFContext(),
- mEcoreXwin( ecoreXwin ),
+ mEcoreXwin( 0 ),
mIMFCursorPosition( 0 ),
mSurroundingText(),
mRestoreAfterFocusLost( false ),
mIdleCallbackConnected( false )
{
ecore_imf_init();
+
+ actor.OnStageSignal().Connect( this, &InputMethodContextX::OnStaged );
}
InputMethodContextX::~InputMethodContextX()
void InputMethodContextX::Initialize()
{
- CreateContext( mEcoreXwin );
+ CreateContext();
ConnectCallbacks();
VirtualKeyboard::ConnectCallbacks( mIMFContext );
}
-void InputMethodContextX::CreateContext( Ecore_X_Window ecoreXwin )
+void InputMethodContextX::CreateContext()
{
DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::CreateContext\n" );
+ if( !mEcoreXwin )
+ {
+ return;
+ }
+
const char *contextId = ecore_imf_context_default_id_get();
if( contextId )
{
if( mIMFContext )
{
- if( ecoreXwin )
- {
- ecore_imf_context_client_window_set( mIMFContext, reinterpret_cast<void*>( ecoreXwin ) );
- }
+ ecore_imf_context_client_window_set( mIMFContext, reinterpret_cast<void*>( mEcoreXwin ) );
}
else
{
* We are still predicting what the user is typing. The latest string is what the InputMethodContext module thinks
* the user wants to type.
*/
-void InputMethodContextX::PreEditChanged( void*, ImfContext* imfContext, void* event_info )
+void InputMethodContextX::PreEditChanged( void*, ImfContext* imfContext, void* eventInfo )
{
DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::PreEditChanged\n" );
- auto context = reinterpret_cast<Ecore_IMF_Context*>(imfContext);
+ auto context = static_cast<Ecore_IMF_Context*>( imfContext );
char* preEditString( NULL );
int cursorPosition( 0 );
free( preEditString );
}
-void InputMethodContextX::CommitReceived( void*, ImfContext* imfContext, void* event_info )
+void InputMethodContextX::CommitReceived( void*, ImfContext* imfContext, void* eventInfo )
{
DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::CommitReceived\n" );
if ( Dali::Adaptor::IsAvailable() )
{
- const std::string keyString( static_cast<char*>( event_info ) );
+ const std::string keyString( static_cast<char*>( eventInfo ) );
Dali::InputMethodContext handle( this );
Dali::InputMethodContext::EventData eventData( Dali::InputMethodContext::COMMIT, keyString, 0, 0 );
* Called when an InputMethodContext delete surrounding event is received.
* Here we tell the application that it should delete a certain range.
*/
-void InputMethodContextX::DeleteSurrounding( void* data, ImfContext* imfContext, void* event_info )
+void InputMethodContextX::DeleteSurrounding( void* data, ImfContext* imfContext, void* eventInfo )
{
DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::DeleteSurrounding\n" );
if( Dali::Adaptor::IsAvailable() )
{
- Ecore_IMF_Event_Delete_Surrounding* deleteSurroundingEvent = static_cast<Ecore_IMF_Event_Delete_Surrounding*>( event_info );
+ Ecore_IMF_Event_Delete_Surrounding* deleteSurroundingEvent = static_cast<Ecore_IMF_Event_Delete_Surrounding*>( eventInfo );
Dali::InputMethodContext::EventData imfData( Dali::InputMethodContext::DELETE_SURROUNDING, std::string(), deleteSurroundingEvent->offset, deleteSurroundingEvent->n_chars );
Dali::InputMethodContext handle( this );
return locale;
}
+void InputMethodContextX::SetContentMIMETypes( const std::string& mimeTypes )
+{
+ DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::SetContentMIMETypes\n" );
+ // ecore_imf_context_mime_type_accept_set() is supported from ecore-imf 1.20.0 version.
+}
+
bool InputMethodContextX::FilterEventKey( const Dali::KeyEvent& keyEvent )
{
bool eventHandled( false );
return prediction;
}
+void InputMethodContextX::SetInputPanelLanguage( Dali::InputMethodContext::InputPanelLanguage language )
+{
+ DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::SetInputPanelLanguage\n" );
+ if( mIMFContext )
+ {
+ switch (language)
+ {
+ case Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC:
+ {
+ ecore_imf_context_input_panel_language_set( mIMFContext, ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC );
+ break;
+ }
+ case Dali::InputMethodContext::InputPanelLanguage::ALPHABET:
+ {
+ ecore_imf_context_input_panel_language_set( mIMFContext, ECORE_IMF_INPUT_PANEL_LANG_ALPHABET );
+ break;
+ }
+ }
+ }
+}
+
+Dali::InputMethodContext::InputPanelLanguage InputMethodContextX::GetInputPanelLanguage() const
+{
+ DALI_LOG_INFO( gLogFilter, Debug::General, "InputMethodContextX::GetInputPanelLanguage\n" );
+ if( mIMFContext )
+ {
+ int value;
+ value = ecore_imf_context_input_panel_language_get( mIMFContext );
+
+ switch (value)
+ {
+ case ECORE_IMF_INPUT_PANEL_LANG_AUTOMATIC:
+ {
+ return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;
+ break;
+ }
+ case ECORE_IMF_INPUT_PANEL_LANG_ALPHABET:
+ {
+ return Dali::InputMethodContext::InputPanelLanguage::ALPHABET;
+ break;
+ }
+ }
+ }
+ return Dali::InputMethodContext::InputPanelLanguage::AUTOMATIC;
+}
+
bool InputMethodContextX::ProcessEventKeyDown( const KeyEvent& keyEvent )
{
bool eventHandled( false );
return static_cast<Ecore_IMF_Keyboard_Locks>( lock );
}
+void InputMethodContextX::OnStaged( Dali::Actor actor )
+{
+ Ecore_X_Window ecoreXwin( AnyCast< Ecore_X_Window >( Dali::Integration::SceneHolder::Get( actor ).GetNativeHandle() ) );
+
+ if( mEcoreXwin != ecoreXwin )
+ {
+ mEcoreXwin = ecoreXwin;
+
+ // Reset
+ Finalize();
+ Initialize();
+ }
+}
+
} // Adaptor
} // Internal