From ed9a31d3cb70998a7d2857fcab8d51274eda4145 Mon Sep 17 00:00:00 2001 From: Seoyeon Kim Date: Tue, 11 Apr 2017 21:14:31 +0900 Subject: [PATCH] Implement IMF Manager additional functions - SetInputPanelUserData() - GetInputPanelUserData() - GetInputPanelState() - SetReturnKeyState() - AutoEnableInputPanel() - ShowInputPanel() - HideInputPanel() This patch should be merged together with https://review.tizen.org/gerrit/#/c/127508/ Change-Id: Ie6ddc093cf9ee4bd247d6d3174be9a0798b71e99 Signed-off-by: Seoyeon Kim --- .../devel-api/adaptor-framework/imf-manager.cpp | 35 +++++ adaptors/devel-api/adaptor-framework/imf-manager.h | 55 +++++++- .../ecore/wayland/imf-manager-impl-ecore-wl.cpp | 145 ++++++++++++++++++++- adaptors/ecore/wayland/imf-manager-impl.h | 42 +++++- adaptors/integration-api/x11/imf-manager-impl.h | 35 +++++ .../wayland/input/text/imf/imf-manager-impl-wl.cpp | 29 +++++ adaptors/wayland/input/text/imf/imf-manager-impl.h | 35 +++++ adaptors/x11/imf-manager-impl-x.cpp | 102 +++++++++++++++ 8 files changed, 470 insertions(+), 8 deletions(-) diff --git a/adaptors/devel-api/adaptor-framework/imf-manager.cpp b/adaptors/devel-api/adaptor-framework/imf-manager.cpp index 33826c3..f5736d5 100644 --- a/adaptors/devel-api/adaptor-framework/imf-manager.cpp +++ b/adaptors/devel-api/adaptor-framework/imf-manager.cpp @@ -108,6 +108,41 @@ void ImfManager::ApplyOptions( const InputMethodOptions& options ) Internal::Adaptor::ImfManager::GetImplementation(*this).ApplyOptions( options ); } +void ImfManager::SetInputPanelUserData( const std::string& data ) +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).SetInputPanelUserData( data ); +} + +void ImfManager::GetInputPanelUserData( std::string& data ) +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).GetInputPanelUserData( data ); +} + +Dali::ImfManager::State ImfManager::GetInputPanelState() +{ + return Internal::Adaptor::ImfManager::GetImplementation(*this).GetInputPanelState(); +} + +void ImfManager::SetReturnKeyState( bool visible ) +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).SetReturnKeyState( visible ); +} + +void ImfManager::AutoEnableInputPanel( bool enabled ) +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).AutoEnableInputPanel( enabled ); +} + +void ImfManager::ShowInputPanel() +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).ShowInputPanel(); +} + +void ImfManager::HideInputPanel() +{ + Internal::Adaptor::ImfManager::GetImplementation(*this).HideInputPanel(); +} + ImfManager::ImfManagerSignalType& ImfManager::ActivatedSignal() { return Internal::Adaptor::ImfManager::GetImplementation(*this).ActivatedSignal(); diff --git a/adaptors/devel-api/adaptor-framework/imf-manager.h b/adaptors/devel-api/adaptor-framework/imf-manager.h index b3ead5c..18c2557 100644 --- a/adaptors/devel-api/adaptor-framework/imf-manager.h +++ b/adaptors/devel-api/adaptor-framework/imf-manager.h @@ -61,7 +61,19 @@ public: PREEDIT, ///< Pre-Edit changed COMMIT, ///< Commit recieved DELETESURROUNDING, ///< Event to delete a range of characters from the string - GETSURROUNDING ///< Event to query string and cursor position + GETSURROUNDING, ///< Event to query string and cursor position + PRIVATECOMMAND ///< Private command sent from the input panel + }; + + /** + * @brief Enumeration for state of the input panel. + */ + enum State + { + DEFAULT = 0, ///< Unknown state + SHOW, ///< Input panel is shown + HIDE, ///< Input panel is hidden + WILL_SHOW ///< Input panel in process of being shown }; /** @@ -253,6 +265,47 @@ public: */ void ApplyOptions( const InputMethodOptions& options ); + /** + * @brief Sets up the input-panel specific data. + * @param[in] data The specific data to be set to the input panel + */ + void SetInputPanelUserData( const std::string& data ); + + /** + * @brief Gets the specific data of the current active input panel. + * @param[in] data The specific data to be got from the input panel + */ + void GetInputPanelUserData( std::string& data ); + + /** + * @brief Gets the state of the current active input panel. + * @return The state of the input panel. + */ + State GetInputPanelState(); + + /** + * @brief Sets the return key on the input panel to be visible or invisible. + * + * The default is true. + * @param[in] visible True if the return key is visible(enabled), false otherwise. + */ + void SetReturnKeyState( bool visible ); + + /** + * @brief Enable to show the input panel automatically when focused. + * @param[in] enabled If true, the input panel will be shown when focused + */ + void AutoEnableInputPanel( bool enabled ); + + /** + * @brief Shows the input panel. + */ + void ShowInputPanel(); + + /** + * @brief Hides the input panel. + */ + void HideInputPanel(); public: diff --git a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp index 95de164..fa67134 100644 --- a/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp +++ b/adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp @@ -209,6 +209,18 @@ void ImfDeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *even } } +/** + * Called when the input method sends a private command. + */ +void PrivateCommand( void *data, Ecore_IMF_Context *imfContext, void *event_info ) +{ + if ( data ) + { + ImfManager* imfManager = reinterpret_cast< ImfManager* > ( data ); + imfManager->SendPrivateCommand( data, imfContext, event_info ); + } +} + BaseHandle Create() { return ImfManager::Get(); @@ -330,6 +342,7 @@ void ImfManager::DeleteContext() if ( mIMFContext ) { + ecore_imf_context_del( mIMFContext ); mIMFContext = NULL; } } @@ -341,9 +354,10 @@ void ImfManager::ConnectCallbacks() { DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::ConnectCallbacks\n" ); - ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit, this ); - ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit, this ); - ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding, this ); + ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit, this ); + ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit, this ); + ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding, this ); + ecore_imf_context_event_callback_add( mIMFContext, ECORE_IMF_CALLBACK_PRIVATE_COMMAND_SEND, PrivateCommand, this ); 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 ); @@ -359,9 +373,10 @@ void ImfManager::DisconnectCallbacks() { DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::DisconnectCallbacks\n" ); - ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit ); - ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit ); - ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding ); + ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, PreEdit ); + ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_COMMIT, Commit ); + ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_DELETE_SURROUNDING, ImfDeleteSurrounding ); + ecore_imf_context_event_callback_del( mIMFContext, ECORE_IMF_CALLBACK_PRIVATE_COMMAND_SEND, PrivateCommand ); 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 ); @@ -578,6 +593,23 @@ void ImfManager::DeleteSurrounding( void* data, Ecore_IMF_Context* imfContext, v } } +/** + * Called when the input method sends a private command. + */ +void ImfManager::SendPrivateCommand( void* data, Ecore_IMF_Context* imfContext, void* event_info ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SendPrivateCommand\n" ); + + if( Dali::Adaptor::IsAvailable() ) + { + const char* privateCommandSendEvent = static_cast( event_info ); + + Dali::ImfManager::ImfEventData imfData( Dali::ImfManager::PRIVATECOMMAND, privateCommandSendEvent, 0, 0 ); + Dali::ImfManager handle( this ); + mEventSignal.Emit( handle, imfData ); + } +} + void ImfManager::NotifyCursorPosition() { DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::NotifyCursorPosition\n" ); @@ -694,6 +726,107 @@ void ImfManager::ApplyOptions( const InputMethodOptions& options ) } } +void ImfManager::SetInputPanelUserData( const std::string& data ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetInputPanelUserData\n" ); + + if( mIMFContext ) + { + int length = data.length(); + ecore_imf_context_input_panel_imdata_set( mIMFContext, &data, length ); + } +} + +void ImfManager::GetInputPanelUserData( std::string& data ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelUserData\n" ); + + if( mIMFContext ) + { + int* length = NULL; + ecore_imf_context_input_panel_imdata_get( mIMFContext, &data, length ); + } +} + +Dali::ImfManager::State ImfManager::GetInputPanelState() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelState\n" ); + + if( mIMFContext ) + { + int value; + value = ecore_imf_context_input_panel_state_get( mIMFContext ); + + switch (value) + { + case ECORE_IMF_INPUT_PANEL_STATE_SHOW: + { + return Dali::ImfManager::SHOW; + break; + } + + case ECORE_IMF_INPUT_PANEL_STATE_HIDE: + { + return Dali::ImfManager::HIDE; + break; + } + + case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW: + { + return Dali::ImfManager::WILL_SHOW; + break; + } + + default: + { + return Dali::ImfManager::DEFAULT; + } + } + } + return Dali::ImfManager::DEFAULT; +} + +void ImfManager::SetReturnKeyState( bool visible ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetReturnKeyState\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_return_key_disabled_set( mIMFContext, !visible ); + } +} + +void ImfManager::AutoEnableInputPanel( bool enabled ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::AutoEnableInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_enabled_set( mIMFContext, enabled ); + } +} + +void ImfManager::ShowInputPanel() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::ShowInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_show( mIMFContext ); + } +} + +void ImfManager::HideInputPanel() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::HideInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_focus_out( mIMFContext ); + ecore_imf_context_input_panel_hide( mIMFContext ); + } +} + } // Adaptor } // Internal diff --git a/adaptors/ecore/wayland/imf-manager-impl.h b/adaptors/ecore/wayland/imf-manager-impl.h index 24de4ce..73e92c1 100644 --- a/adaptors/ecore/wayland/imf-manager-impl.h +++ b/adaptors/ecore/wayland/imf-manager-impl.h @@ -68,7 +68,7 @@ public: /** * Connect Callbacks required for IMF. * If you don't connect imf callbacks, you can't get the key events. - * The events are PreeditChanged, Commit and DeleteSurrounding. + * The events are PreeditChanged, Commit, DeleteSurrounding and PrivateCommand. */ void ConnectCallbacks(); @@ -127,6 +127,11 @@ public: */ void DeleteSurrounding( void *data, Ecore_IMF_Context *imfContext, void *event_info ); + /** + * @copydoc Dali::ImfManager::SendPrivateCommand() + */ + void SendPrivateCommand( void* data, Ecore_IMF_Context* imfContext, void* event_info ); + // Cursor related /** * @copydoc Dali::ImfManager::NotifyCursorPosition() @@ -173,6 +178,41 @@ public: */ void ApplyOptions( const InputMethodOptions& options ); + /** + * @copydoc Dali::ImfManager::SetInputPanelUserData() + */ + void SetInputPanelUserData( const std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelUserData() + */ + void GetInputPanelUserData( std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelState() + */ + Dali::ImfManager::State GetInputPanelState(); + + /** + * @copydoc Dali::ImfManager::SetReturnKeyState() + */ + void SetReturnKeyState( bool visible ); + + /** + * @copydoc Dali::ImfManager::AutoEnableInputPanel() + */ + void AutoEnableInputPanel( bool enabled ); + + /** + * @copydoc Dali::ImfManager::ShowInputPanel() + */ + void ShowInputPanel(); + + /** + * @copydoc Dali::ImfManager::HideInputPanel() + */ + void HideInputPanel(); + public: // Signals /** diff --git a/adaptors/integration-api/x11/imf-manager-impl.h b/adaptors/integration-api/x11/imf-manager-impl.h index 94e7ecd..4972f26 100644 --- a/adaptors/integration-api/x11/imf-manager-impl.h +++ b/adaptors/integration-api/x11/imf-manager-impl.h @@ -176,6 +176,41 @@ public: */ void ApplyOptions( const InputMethodOptions& options ); + /** + * @copydoc Dali::ImfManager::SetInputPanelUserData() + */ + void SetInputPanelUserData( const std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelUserData() + */ + void GetInputPanelUserData( std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelState() + */ + Dali::ImfManager::State GetInputPanelState(); + + /** + * @copydoc Dali::ImfManager::SetReturnKeyState() + */ + void SetReturnKeyState( bool visible ); + + /** + * @copydoc Dali::ImfManager::AutoEnableInputPanel() + */ + void AutoEnableInputPanel( bool enabled ); + + /** + * @copydoc Dali::ImfManager::ShowInputPanel() + */ + void ShowInputPanel(); + + /** + * @copydoc Dali::ImfManager::HideInputPanel() + */ + void HideInputPanel(); + public: // Signals /** diff --git a/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp b/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp index ab6b600..3d49a51 100644 --- a/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp +++ b/adaptors/wayland/input/text/imf/imf-manager-impl-wl.cpp @@ -317,6 +317,35 @@ void ImfManager::ApplyOptions(const InputMethodOptions& options) { } +void ImfManager::SetInputPanelUserData( const std::string& data ) +{ +} + +void ImfManager::GetInputPanelUserData( std::string& data ) +{ +} + +Dali::ImfManager::State ImfManager::GetInputPanelState() +{ + return Dali::ImfManager::DEFAULT; +} + +void ImfManager::SetReturnKeyState( bool visible ) +{ +} + +void ImfManager::AutoEnableInputPanel( bool enabled ) +{ +} + +void ImfManager::ShowInputPanel() +{ +} + +void ImfManager::HideInputPanel() +{ +} + Dali::ImfManager::TextDirection ImfManager::GetTextDirection() { TextInputManager::SeatInfo& info = mTextInputManager.GetLastActiveSeat(); diff --git a/adaptors/wayland/input/text/imf/imf-manager-impl.h b/adaptors/wayland/input/text/imf/imf-manager-impl.h index 726060b..0cc918c 100644 --- a/adaptors/wayland/input/text/imf/imf-manager-impl.h +++ b/adaptors/wayland/input/text/imf/imf-manager-impl.h @@ -170,6 +170,41 @@ public: */ void ApplyOptions( const InputMethodOptions& options ); + /** + * @copydoc Dali::ImfManager::SetInputPanelUserData() + */ + void SetInputPanelUserData( const std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelUserData() + */ + void GetInputPanelUserData( std::string& data ); + + /** + * @copydoc Dali::ImfManager::GetInputPanelState() + */ + Dali::ImfManager::State GetInputPanelState(); + + /** + * @copydoc Dali::ImfManager::SetReturnKeyState() + */ + void SetReturnKeyState( bool visible ); + + /** + * @copydoc Dali::ImfManager::AutoEnableInputPanel() + */ + void AutoEnableInputPanel( bool enabled ); + + /** + * @copydoc Dali::ImfManager::ShowInputPanel() + */ + void ShowInputPanel(); + + /** + * @copydoc Dali::ImfManager::HideInputPanel() + */ + void HideInputPanel(); + public: // Signals /** diff --git a/adaptors/x11/imf-manager-impl-x.cpp b/adaptors/x11/imf-manager-impl-x.cpp index 3a2f913..f97e687 100644 --- a/adaptors/x11/imf-manager-impl-x.cpp +++ b/adaptors/x11/imf-manager-impl-x.cpp @@ -231,6 +231,7 @@ void ImfManager::DeleteContext() if ( mIMFContext ) { + ecore_imf_context_del( mIMFContext ); mIMFContext = NULL; } } @@ -586,6 +587,107 @@ void ImfManager::ApplyOptions( const InputMethodOptions& options ) } } +void ImfManager::SetInputPanelUserData( const std::string& data ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetInputPanelUserData\n" ); + + if( mIMFContext ) + { + int length = data.length(); + ecore_imf_context_input_panel_imdata_set( mIMFContext, &data, length ); + } +} + +void ImfManager::GetInputPanelUserData( std::string& data ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelUserData\n" ); + + if( mIMFContext ) + { + int* length = NULL; + ecore_imf_context_input_panel_imdata_get( mIMFContext, &data, length ); + } +} + +Dali::ImfManager::State ImfManager::GetInputPanelState() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::GetInputPanelState\n" ); + + if( mIMFContext ) + { + int value; + value = ecore_imf_context_input_panel_state_get( mIMFContext ); + + switch (value) + { + case ECORE_IMF_INPUT_PANEL_STATE_SHOW: + { + return Dali::ImfManager::SHOW; + break; + } + + case ECORE_IMF_INPUT_PANEL_STATE_HIDE: + { + return Dali::ImfManager::HIDE; + break; + } + + case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW: + { + return Dali::ImfManager::WILL_SHOW; + break; + } + + default: + { + return Dali::ImfManager::DEFAULT; + } + } + } + return Dali::ImfManager::DEFAULT; +} + +void ImfManager::SetReturnKeyState( bool visible ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::SetReturnKeyState\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_return_key_disabled_set( mIMFContext, !visible ); + } +} + +void ImfManager::AutoEnableInputPanel( bool enabled ) +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::AutoEnableInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_enabled_set( mIMFContext, enabled ); + } +} + +void ImfManager::ShowInputPanel() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::ShowInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_input_panel_show( mIMFContext ); + } +} + +void ImfManager::HideInputPanel() +{ + DALI_LOG_INFO( gLogFilter, Debug::General, "ImfManager::HideInputPanel\n" ); + + if( mIMFContext ) + { + ecore_imf_context_focus_out( mIMFContext ); + ecore_imf_context_input_panel_hide( mIMFContext ); + } +} + } // Adaptor } // Internal -- 2.7.4