Modified to call key_event_done() last when processing key event from engine-loader 18/250618/2
authorInHong Han <inhong1.han@samsung.com>
Wed, 30 Dec 2020 06:46:14 +0000 (15:46 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Wed, 30 Dec 2020 11:17:56 +0000 (11:17 +0000)
Change-Id: I5dfc39b8bb86c0ee403dd6374b5a920361269f9d

src/include/ise-dbus.h
src/ise-dbus.cpp
src/ise.cpp

index 57d7a40..9e97567 100644 (file)
@@ -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);
index 66e3d30..eaf4a08 100644 (file)
@@ -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()
index 03272fd..540f0e6 100644 (file)
@@ -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)