From 810dd4db4a69f365c13071b4ee1578ac6b83d4eb Mon Sep 17 00:00:00 2001 From: InHong Han Date: Mon, 3 Apr 2017 10:25:51 +0900 Subject: [PATCH] Support prediction_hint_set interface Change-Id: I2bdca2c7805a1f9d7ddcfdba71b39bed5f24689b --- ism/extras/wayland_immodule/wayland_imcontext.c | 26 +++++++++++++++++- ism/extras/wayland_immodule/wayland_imcontext.h | 3 +++ ism/extras/wayland_immodule/wayland_module.c | 3 ++- .../ecore_socket_panel_agent_module.cpp | 13 +++++++++ ism/modules/panelagent/wayland/isf_wsc_control.cpp | 6 +++++ ism/modules/panelagent/wayland/isf_wsc_control.h | 1 + .../panelagent/wayland/isf_wsc_control_ui.cpp | 5 ++++ .../panelagent/wayland/isf_wsc_control_ui.h | 1 + .../wayland/wayland_panel_agent_module.cpp | 13 ++++++++- ism/src/isf_info_manager.cpp | 31 ++++++++++++++++++++++ ism/src/isf_info_manager.h | 3 +++ ism/src/isf_message_queue.h | 26 ++++++++++++++++++ ism/src/isf_panel_agent_base.cpp | 5 ++++ ism/src/isf_panel_agent_base.h | 9 +++++++ ism/src/isf_panel_agent_manager.cpp | 8 ++++++ ism/src/isf_panel_agent_manager.h | 1 + ism/src/scim_helper.cpp | 25 +++++++++++++++++ ism/src/scim_helper.h | 13 +++++++++ ism/src/scim_trans_commands.h | 1 + 19 files changed, 190 insertions(+), 3 deletions(-) diff --git a/ism/extras/wayland_immodule/wayland_imcontext.c b/ism/extras/wayland_immodule/wayland_imcontext.c index 3465a6c..33bcaca 100644 --- a/ism/extras/wayland_immodule/wayland_imcontext.c +++ b/ism/extras/wayland_immodule/wayland_imcontext.c @@ -215,6 +215,7 @@ struct _WaylandIMContext uint32_t reset_serial; Eina_Bool has_conformant; + const char *prediction_hint; // }; @@ -2603,6 +2604,11 @@ wayland_im_context_del (Ecore_IMF_Context *ctx) } // + if (imcontext->prediction_hint) { + free (imcontext->prediction_hint); + imcontext->prediction_hint = NULL; + } + if (imcontext->text_input) wl_text_input_destroy (imcontext->text_input); @@ -2653,10 +2659,14 @@ wayland_im_context_focus_in(Ecore_IMF_Context *ctx) } WaylandIMContext *imcontext = (WaylandIMContext *)ecore_imf_context_data_get(ctx); - if (imcontext && imcontext->input && imcontext->text_input) + if (imcontext && imcontext->input && imcontext->text_input) { wl_text_input_set_return_key_disabled(imcontext->text_input, imcontext->return_key_disabled); + if (imcontext->prediction_hint) + wl_text_input_prediction_hint(imcontext->text_input, imcontext->prediction_hint); + } + if (ecore_imf_context_input_panel_enabled_get(ctx)) if (!ecore_imf_context_input_panel_show_on_demand_get (ctx)) show_input_panel(ctx); @@ -3389,6 +3399,20 @@ wayland_im_context_input_panel_keyboard_mode_get(Ecore_IMF_Context *ctx EINA_UNU return hw_keyboard_mode ? ECORE_IMF_INPUT_PANEL_HW_KEYBOARD_MODE : ECORE_IMF_INPUT_PANEL_SW_KEYBOARD_MODE; } +void +wayland_im_context_prediction_hint_set (Ecore_IMF_Context *ctx, const char *prediction_hint) +{ + WaylandIMContext *imcontext = (WaylandIMContext *)ecore_imf_context_data_get(ctx); + if (!imcontext) return; + + imcontext->prediction_hint = strdup(prediction_hint); + + if (imcontext->input && imcontext->text_input) { + LOGD ("ctx : %p, prediction_hint : %s\n", ctx, imcontext->prediction_hint); + wl_text_input_prediction_hint(imcontext->text_input, imcontext->prediction_hint); + } +} + WaylandIMContext *wayland_im_context_new (struct wl_text_input_manager *text_input_manager) { WaylandIMContext *context = calloc(1, sizeof(WaylandIMContext)); diff --git a/ism/extras/wayland_immodule/wayland_imcontext.h b/ism/extras/wayland_immodule/wayland_imcontext.h index e0372f9..19bfcec 100644 --- a/ism/extras/wayland_immodule/wayland_imcontext.h +++ b/ism/extras/wayland_immodule/wayland_imcontext.h @@ -122,6 +122,9 @@ wayland_im_context_bidi_direction_set(Ecore_IMF_Context *ctx, Ecore_IMF_BiDi_Dir Ecore_IMF_Input_Panel_Keyboard_Mode wayland_im_context_input_panel_keyboard_mode_get(Ecore_IMF_Context *ctx); +void +wayland_im_context_prediction_hint_set (Ecore_IMF_Context *ctx, const char *prediction_hint); + WaylandIMContext *wayland_im_context_new (struct wl_text_input_manager *text_input_manager); extern int _ecore_imf_wayland_log_dom; diff --git a/ism/extras/wayland_immodule/wayland_module.c b/ism/extras/wayland_immodule/wayland_module.c index 7832b98..ebdbb66 100644 --- a/ism/extras/wayland_immodule/wayland_module.c +++ b/ism/extras/wayland_immodule/wayland_module.c @@ -79,7 +79,8 @@ static Ecore_IMF_Context_Class wayland_imf_class = NULL, /* candidate_window_geometry_get */ wayland_im_context_input_hint_set, /* input_hint_set */ wayland_im_context_bidi_direction_set, /* bidi_direction_set */ - wayland_im_context_input_panel_keyboard_mode_get /* input_panel_keyboard_mode_get */ + wayland_im_context_input_panel_keyboard_mode_get, /* input_panel_keyboard_mode_get */ + wayland_im_context_prediction_hint_set /* prediction_hint_set */ }; static struct wl_text_input_manager *text_input_manager = NULL; diff --git a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp index 5a82147..dfd7c10 100644 --- a/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp +++ b/ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp @@ -803,6 +803,19 @@ private: m_send_trans.write_to_socket(client_socket); } + void set_helper_prediction_hint(int client, uint32 context, const String& uuid, String& prediction_hint) { + LOGD ("client id:%d\n", client); + + Socket client_socket(client); + m_send_trans.clear(); + m_send_trans.put_command(SCIM_TRANS_CMD_REPLY); + m_send_trans.put_data(context); + m_send_trans.put_data(uuid); + m_send_trans.put_command(ISM_TRANS_CMD_SET_PREDICTION_HINT); + m_send_trans.put_data(prediction_hint); + m_send_trans.write_to_socket(client_socket); + } + bool process_key_event(int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) { LOGD ("client id:%d\n", client); diff --git a/ism/modules/panelagent/wayland/isf_wsc_control.cpp b/ism/modules/panelagent/wayland/isf_wsc_control.cpp index be8c9bd..0d040d0 100644 --- a/ism/modules/panelagent/wayland/isf_wsc_control.cpp +++ b/ism/modules/panelagent/wayland/isf_wsc_control.cpp @@ -212,6 +212,12 @@ int _isf_wsc_context_process_input_device_event(int context, int type, const voi g_info_manager->process_input_device_event(context, (unsigned int)type, (const char*)data, (size_t)len, result); return 0; } + +int _isf_wsc_context_input_panel_prediction_hint_set (int context, const char *prediction_hint) +{ + g_info_manager->set_prediction_hint (get_panel_client_id (), String (prediction_hint)); + return 0; +} /* vi:ts=4:expandtab:nowrap */ diff --git a/ism/modules/panelagent/wayland/isf_wsc_control.h b/ism/modules/panelagent/wayland/isf_wsc_control.h index 29ba0b9..4a85f4b 100644 --- a/ism/modules/panelagent/wayland/isf_wsc_control.h +++ b/ism/modules/panelagent/wayland/isf_wsc_control.h @@ -64,6 +64,7 @@ extern "C" int _isf_wsc_context_input_panel_send_candidate_will_hide_ack (int context); int _isf_wsc_context_process_input_device_event(int context, int type, const void* data, int len); + int _isf_wsc_context_input_panel_prediction_hint_set (int context, const char *prediction_hint); #ifdef __cplusplus } diff --git a/ism/modules/panelagent/wayland/isf_wsc_control_ui.cpp b/ism/modules/panelagent/wayland/isf_wsc_control_ui.cpp index 221922e..efbfd1f 100644 --- a/ism/modules/panelagent/wayland/isf_wsc_control_ui.cpp +++ b/ism/modules/panelagent/wayland/isf_wsc_control_ui.cpp @@ -273,3 +273,8 @@ void isf_wsc_context_process_input_device_event (WSCContextISF *ctx, uint32_t ty { _isf_wsc_context_process_input_device_event (_get_context_id(ctx), type, data, len); } + +void isf_wsc_context_input_panel_prediction_hint_set (WSCContextISF *ctx, const char *prediction_hint) +{ + _isf_wsc_context_input_panel_prediction_hint_set (_get_context_id(ctx), prediction_hint); +} diff --git a/ism/modules/panelagent/wayland/isf_wsc_control_ui.h b/ism/modules/panelagent/wayland/isf_wsc_control_ui.h index 4145eea..878c78f 100644 --- a/ism/modules/panelagent/wayland/isf_wsc_control_ui.h +++ b/ism/modules/panelagent/wayland/isf_wsc_control_ui.h @@ -54,6 +54,7 @@ extern "C" void isf_wsc_context_input_panel_imdata_set (WSCContextISF *ctx, const void *imdata, int len); void isf_wsc_context_input_panel_imdata_get (WSCContextISF *ctx, void **imdata, int* len); void isf_wsc_context_process_input_device_event (WSCContextISF *ctx, uint32_t type, const char *data, uint32_t len); + void isf_wsc_context_input_panel_prediction_hint_set (WSCContextISF *ctx, const char *prediction_hint); #ifdef __cplusplus } diff --git a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp index 40e8d5e..ce5b218 100644 --- a/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp +++ b/ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp @@ -468,6 +468,16 @@ _wsc_im_ctx_captial_mode (void *data, struct wl_input_method_context *im_ctx, ui isf_wsc_context_input_panel_caps_mode_set (wsc_ctx, mode); } +static void +_wsc_im_ctx_prediction_hint (void *data, struct wl_input_method_context *im_ctx, const char *prediction_hint) +{ + LOGD ("im_context = %p, prediction hint = %s\n", im_ctx, prediction_hint); + WSCContextISF *wsc_ctx = (WSCContextISF*)data; + if (!wsc_ctx) return; + + isf_wsc_context_input_panel_prediction_hint_set (wsc_ctx, prediction_hint); +} + static const struct wl_input_method_context_listener wsc_im_context_listener = { _wsc_im_ctx_reset, _wsc_im_ctx_content_type, @@ -481,7 +491,8 @@ static const struct wl_input_method_context_listener wsc_im_context_listener = { _wsc_im_ctx_cursor_position, _wsc_im_ctx_process_input_device_event, _wsc_im_ctx_filter_key_event, - _wsc_im_ctx_captial_mode + _wsc_im_ctx_captial_mode, + _wsc_im_ctx_prediction_hint }; #if ENABLE_GRAB_KEYBOARD diff --git a/ism/src/isf_info_manager.cpp b/ism/src/isf_info_manager.cpp index ff1fd7a..1fc4548 100644 --- a/ism/src/isf_info_manager.cpp +++ b/ism/src/isf_info_manager.cpp @@ -1308,6 +1308,23 @@ public: return false; } + bool set_helper_prediction_hint (const String& uuid, String prediction_hint) { + HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid); + + if (it != m_helper_client_index.end ()) { + int client; + uint32 context; + uint32 ctx; + get_focused_context (client, context); + ctx = get_helper_ic (client, context); + LOGD ("Send ISM_TRANS_CMD_SET_PREDICTION_HINT message"); + m_panel_agent_manager.set_helper_prediction_hint (it->second.id, ctx, uuid, prediction_hint); + return true; + } + + return false; + } + //ISM_TRANS_CMD_SHOW_ISF_CONTROL void show_isf_panel (int client_id) { LOGD (""); @@ -1987,6 +2004,14 @@ public: set_helper_keyboard_mode (m_current_helper_uuid, mode); } + //ISM_TRANS_CMD_SET_PREDICTION_HINT + void set_prediction_hint (int client_id, String prediction_hint) { + SCIM_DEBUG_MAIN (4) << "InfoManager::set_prediction_hint ()\n"; + LOGD (""); + if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode || m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT) + set_helper_prediction_hint (m_current_helper_uuid, prediction_hint); + } + //ISM_TRANS_CMD_EXPAND_CANDIDATE void expand_candidate () { LOGD (""); @@ -4770,6 +4795,12 @@ void InfoManager::set_ise_keyboard_mode (int client_id, uint32 mode) m_impl->set_ise_keyboard_mode (client_id, mode); } +//ISM_TRANS_CMD_SET_PREDICTION_HINT +void InfoManager::set_prediction_hint (int client_id, String prediction_hint) +{ + m_impl->set_prediction_hint (client_id, prediction_hint); +} + //ISM_TRANS_CMD_EXPAND_CANDIDATE void InfoManager::expand_candidate () { diff --git a/ism/src/isf_info_manager.h b/ism/src/isf_info_manager.h index bb20de2..483a337 100644 --- a/ism/src/isf_info_manager.h +++ b/ism/src/isf_info_manager.h @@ -735,6 +735,9 @@ public: //ISM_TRANS_CMD_SET_KEYBOARD_MODE void set_ise_keyboard_mode (int client_id, uint32 mode); + //ISM_TRANS_CMD_SET_PREDICTION_HINT + void set_prediction_hint (int client_id, String prediction_hint); + //ISM_TRANS_CMD_EXPAND_CANDIDATE void expand_candidate (); diff --git a/ism/src/isf_message_queue.h b/ism/src/isf_message_queue.h index 90411cf..d74c668 100644 --- a/ism/src/isf_message_queue.h +++ b/ism/src/isf_message_queue.h @@ -706,6 +706,18 @@ class MessageItemFlushBuffer : public MessageItemHelper { }; +/* ISM_TRANS_CMD_SET_PREDICTION_HINT */ +class MessageItemSetPredictionHint : public MessageItemHelper +{ +public: + MessageItemSetPredictionHint() {} + virtual ~MessageItemSetPredictionHint() {} + + String& get_message_ptr() { return m_prediction_hint; } +protected: + String m_prediction_hint; +}; + template inline T* alloc_message() /* We could use memory pool in the future for performance enhancement */ @@ -1640,6 +1652,20 @@ public: } break; } + case ISM_TRANS_CMD_SET_PREDICTION_HINT: + { + MessageItemSetPredictionHint *message = alloc_message(); + if (message) { + message->get_command_ref() = cmd; + if (transaction.get_data(message->get_message_ptr())) { + m_list_messages.push_back(message); + } else { + LOGW("wrong format of transaction\n"); + dealloc_message(message); + } + } + break; + } } } diff --git a/ism/src/isf_panel_agent_base.cpp b/ism/src/isf_panel_agent_base.cpp index 5863a38..591445b 100644 --- a/ism/src/isf_panel_agent_base.cpp +++ b/ism/src/isf_panel_agent_base.cpp @@ -311,6 +311,11 @@ void PanelAgentBase::set_helper_keyboard_mode (int client, uint32 context, const LOGW ("not implemented for %s", m_name.c_str ()); } +void PanelAgentBase::set_helper_prediction_hint (int client, uint32 context, const String& uuid, String& prediction_hint) +{ + LOGW ("not implemented for %s", m_name.c_str ()); +} + bool PanelAgentBase::process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial) { LOGW ("not implemented for %s", m_name.c_str ()); diff --git a/ism/src/isf_panel_agent_base.h b/ism/src/isf_panel_agent_base.h index 5c84967..880a0f4 100644 --- a/ism/src/isf_panel_agent_base.h +++ b/ism/src/isf_panel_agent_base.h @@ -485,6 +485,15 @@ public: virtual void set_helper_keyboard_mode (int client, uint32 context, const String& uuid, uint32& mode); /** + * @brief set_helper_prediction_hint. + * + * @param + * + * @return none. + */ + virtual void set_helper_prediction_hint (int client, uint32 context, const String& uuid, String& prediction_hint); + + /** * @brief process_key_event. * * @param diff --git a/ism/src/isf_panel_agent_manager.cpp b/ism/src/isf_panel_agent_manager.cpp index 655ab94..e92c409 100644 --- a/ism/src/isf_panel_agent_manager.cpp +++ b/ism/src/isf_panel_agent_manager.cpp @@ -506,6 +506,14 @@ void PanelAgentManager::set_helper_keyboard_mode (int id, uint32 context_id, con _p->set_helper_keyboard_mode (id, context_id, uuid, mode); } +void PanelAgentManager::set_helper_prediction_hint (int id, uint32 context_id, const String& uuid, String& prediction_hint) +{ + PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); + + if (!_p.null ()) + _p->set_helper_prediction_hint (id, context_id, uuid, prediction_hint); +} + bool PanelAgentManager::process_key_event (int id, uint32 context_id, const String& uuid, KeyEvent& key, uint32 serial) { PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id); diff --git a/ism/src/isf_panel_agent_manager.h b/ism/src/isf_panel_agent_manager.h index fa79843..80b4a2a 100644 --- a/ism/src/isf_panel_agent_manager.h +++ b/ism/src/isf_panel_agent_manager.h @@ -308,6 +308,7 @@ public: void show_helper_option_window (int client, uint32 context, const String& uuid); void resume_helper_option_window (int client, uint32 context, const String& uuid); void set_helper_keyboard_mode (int client, uint32 context, const String& uuid, uint32& mode); + void set_helper_prediction_hint (int client, uint32 context, const String& uuid, String& prediction_hint); bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial); bool get_helper_geometry (int client, uint32 context, String& uuid, _OUT_ struct rectinfo& info); void get_helper_imdata (int client, uint32 context, String& uuid, _OUT_ char** imdata, _OUT_ size_t& len); diff --git a/ism/src/scim_helper.cpp b/ism/src/scim_helper.cpp index 8a05438..9b69c51 100644 --- a/ism/src/scim_helper.cpp +++ b/ism/src/scim_helper.cpp @@ -133,6 +133,9 @@ typedef Signal3 typedef Signal5 HelperAgentSignalUintCharSizeUint; +typedef Signal2 + HelperAgentSignalStringVoid; + class HelperAgent::HelperAgentImpl { public: @@ -219,6 +222,7 @@ public: HelperAgentSignalVoid signal_resume_option_window; HelperAgentSignalUintVoid signal_check_option_window; HelperAgentSignalUintCharSizeUint signal_process_input_device_event; + HelperAgentSignalStringVoid signal_set_prediction_hint; public: HelperAgentImpl (HelperAgent* thiz) : magic(0), magic_active(0), timeout(-1), focused_ic ((uint32) -1), thiz (thiz), @@ -1440,6 +1444,13 @@ HelperAgent::handle_message (MessageItem *message) m_impl->hw_keyboard_mode = true; break; } + case ISM_TRANS_CMD_SET_PREDICTION_HINT: + { + MessageItemSetPredictionHint *subclass = static_cast(message); + LOGD("prediction_hint : %s\n", strdup (subclass->get_message_ptr().c_str ())); + m_impl->signal_set_prediction_hint (this, subclass->get_message_ptr()); + break; + } default: break; } @@ -3459,6 +3470,20 @@ HelperAgent::signal_connect_process_input_device_event (HelperAgentSlotUintCharS return m_impl->signal_process_input_device_event.connect (slot); } +/** + * @brief Connect a slot to Helper set prediction hint signal. + * + * This signal is used to send prediction hint to Helper ISE. + * + * The prototype of the slot is: + * void set_prediction_hint (const HelperAgent *agent, char *prediction_hint); + */ +Connection +HelperAgent::signal_connect_set_prediction_hint (HelperAgentSlotStringVoid *slot) +{ + return m_impl->signal_set_prediction_hint.connect (slot); +} + } /* namespace scim */ /* diff --git a/ism/src/scim_helper.h b/ism/src/scim_helper.h index 8985bc3..a765fef 100644 --- a/ism/src/scim_helper.h +++ b/ism/src/scim_helper.h @@ -216,6 +216,9 @@ typedef Slot3 typedef Slot5 HelperAgentSlotUintCharSizeUint; +typedef Slot2 + HelperAgentSlotStringVoid; + /** * @brief The accessory class to write a Helper object. * @@ -1366,6 +1369,16 @@ public: * void process_input_device_event (const HelperAgent *, uint32 &type, char *data, size_t &size, uint32 &ret); */ Connection signal_connect_process_input_device_event (HelperAgentSlotUintCharSizeUint *slot); + + /** + * @brief Connect a slot to Helper set prediction hint signal. + * + * This signal is used to send prediction hint to Helper ISE. + * + * The prototype of the slot is: + * void set_prediction_hint (const HelperAgent *agent, char *prediction_hint); + */ + Connection signal_connect_set_prediction_hint (HelperAgentSlotStringVoid *slot); }; /** @} */ diff --git a/ism/src/scim_trans_commands.h b/ism/src/scim_trans_commands.h index 24fa30e..40959f6 100644 --- a/ism/src/scim_trans_commands.h +++ b/ism/src/scim_trans_commands.h @@ -668,6 +668,7 @@ const int ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW = 1125; const int ISM_TRANS_CMD_PROCESS_INPUT_DEVICE_EVENT = 1126; const int ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW = 1127; const int ISM_TRANS_CMD_SET_KEYBOARD_MODE = 1128; +const int ISM_TRANS_CMD_SET_PREDICTION_HINT = 1129; /* ISE/Panel to IMControl */ const int ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT = 1151; -- 2.7.4