From 721bd20a371555c69f17d0070c93b9f57429b423 Mon Sep 17 00:00:00 2001 From: InHong Han Date: Wed, 30 Dec 2020 15:46:14 +0900 Subject: [PATCH] Modified to call key_event_done() last when processing key event from engine-loader Change-Id: I5dfc39b8bb86c0ee403dd6374b5a920361269f9d --- src/include/ise-dbus.h | 2 +- src/ise-dbus.cpp | 70 ++++++++++++++++++++++++++++++++++++++++---------- src/ise.cpp | 9 +++---- 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/src/include/ise-dbus.h b/src/include/ise-dbus.h index 57d7a40..9e97567 100644 --- a/src/include/ise-dbus.h +++ b/src/include/ise-dbus.h @@ -48,7 +48,7 @@ void engine_loader_set_imengine(const char *engine_id, const char *module_name); void engine_loader_flush_imengine(); void engine_loader_reset_imengine(); void engine_loader_send_imengine_event(int command, uint32_t value); -bool engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_text); +void engine_loader_process_key_event(scim::KeyEvent& key, uint32_t serial, bool need_surrounding_text); void engine_loader_focus_in(); void engine_loader_focus_out(); void engine_loader_update_cursor_position(int cursor_pos); diff --git a/src/ise-dbus.cpp b/src/ise-dbus.cpp index 66e3d30..eaf4a08 100644 --- a/src/ise-dbus.cpp +++ b/src/ise-dbus.cpp @@ -448,6 +448,55 @@ static void _handle_set_candidate_style(GVariant *parameters) LOGE("ime_set_candidate_style() failed"); } +static void _handle_send_processing_result(GVariant *parameters) +{ + scim::KeyEvent key_event; + uint32_t code = 0; + uint16_t mask = 0; + uint16_t layout = 0; + char *dev_name = NULL; + uint16_t dev_class = 0; + uint16_t dev_subclass = 0; + GVariantIter *key_event_iter = NULL; + GVariant *value = NULL; + gchar *key = NULL; + uint32_t serial = 0; + bool is_success; + + g_variant_get(parameters, "(a{sv}&sub)", &key_event_iter, &dev_name, &serial, &is_success); + if (key_event_iter && dev_name) { + while (g_variant_iter_loop (key_event_iter, "{sv}", &key, &value)) { + if (g_strcmp0(key, "key_code") == 0) + code = g_variant_get_uint32(value); + else if (g_strcmp0(key, "key_mask") == 0) + mask = g_variant_get_uint16(value); + else if (g_strcmp0(key, "key_layout") == 0) + layout = g_variant_get_uint16(value); + else if (g_strcmp0(key, "key_dev_class") == 0) + dev_class = g_variant_get_uint16(value); + else if (g_strcmp0(key, "key_dev_subclass") == 0) + dev_subclass = g_variant_get_uint16(value); + } + + if (key) + g_free(key); + + if (value) + g_variant_unref(value); + + key_event.code = code; + key_event.mask = mask; + key_event.layout = layout; + key_event.dev_name = std::string(dev_name); + key_event.dev_class = dev_class; + key_event.dev_subclass = dev_subclass; + } + + int ret = ime_send_key_event_processing_result(key_event, serial, is_success); + if (ret != IME_ERROR_NONE) + LOGE("ime_send_key_event_processing_result() failed"); +} + static void _handle_engine_loader_cb(GDBusConnection *connection, const gchar *sender_name, const gchar *object_path, @@ -509,6 +558,8 @@ static void _handle_engine_loader_cb(GDBusConnection *connection, _handle_contract_candidate(parameters); } else if (g_strcmp0(signal_name, "set_candidate_style") == 0) { _handle_set_candidate_style(parameters); + } else if (g_strcmp0(signal_name, "send_processing_result") == 0) { + _handle_send_processing_result(parameters); } } @@ -809,7 +860,7 @@ void engine_loader_send_imengine_event(int command, uint32_t value) LOGE("Failed to send imengine event"); } -bool engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_text) +void engine_loader_process_key_event(scim::KeyEvent& key, uint32_t serial, bool need_surrounding_text) { bool result = false; GDBusMessage *reply = NULL; @@ -817,8 +868,8 @@ bool engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_ GVariantBuilder *key_event_builder = NULL; if (!dbus_info) { - LOGW("dbus info is not allocated."); - return false; + LOGE("dbus info is not allocated."); + return; } if (need_surrounding_text) { @@ -843,8 +894,6 @@ bool engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_ if (text) free(text); - - result = false; } key_event_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}")); @@ -854,17 +903,10 @@ bool engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_ g_variant_builder_add(key_event_builder, "{sv}", "key_dev_class", g_variant_new_uint16(key.dev_class)); g_variant_builder_add(key_event_builder, "{sv}", "key_dev_subclass", g_variant_new_uint16(key.dev_subclass)); - if (_send_sync_message(dbus_info->gdbus_connection, g_variant_new("(a{sv}s)", key_event_builder, key.dev_name.c_str()), &reply, "process_key_event")) { - reply_body = g_dbus_message_get_body(reply); - g_variant_get(reply_body, "(b)", &result); - } + if (!_send_async_message(dbus_info->gdbus_connection, g_variant_new("(a{sv}su)", key_event_builder, key.dev_name.c_str(), serial), "process_key_event")) + LOGE("Failed to send process key event"); g_variant_builder_unref(key_event_builder); - - if (reply_body) - g_variant_unref(reply_body); - - return result; } void engine_loader_focus_in() diff --git a/src/ise.cpp b/src/ise.cpp index 03272fd..540f0e6 100644 --- a/src/ise.cpp +++ b/src/ise.cpp @@ -2996,16 +2996,13 @@ static bool ime_app_process_key_event_cb(ime_key_code_e keycode, ime_key_mask_e return ret; } -static bool ime_app_process_key_event_with_imengine_cb(scim::KeyEvent &key, void *user_data) +static void ime_app_process_key_event_with_imengine_cb(scim::KeyEvent &key, uint32_t serial, void *user_data) { - bool ret = false; LANGUAGE_INFO *info = _language_manager.get_language_info(_language_manager.get_current_language()); if (info && info->need_surrounding_text) - ret = engine_loader_process_key_event(key, true); + engine_loader_process_key_event(key, serial, true); else - ret = engine_loader_process_key_event(key, false); - - return ret; + engine_loader_process_key_event(key, serial, false); } static void ime_app_caps_mode_changed_cb(int mode, void *user_data) -- 2.7.4