Add option to set surrounding text before processing key event 70/248170/1
authorInHong Han <inhong1.han@samsung.com>
Mon, 23 Nov 2020 06:55:17 +0000 (15:55 +0900)
committerInHong Han <inhong1.han@samsung.com>
Mon, 23 Nov 2020 07:04:45 +0000 (16:04 +0900)
Change-Id: I30173c965f3ed1076b654aab7d855d664c4b9e6c

src/include/ise-dbus.h
src/include/languages.h
src/ise-dbus.cpp
src/ise.cpp
src/sdk/ise_lang_table.cpp
src/sdk/ise_lang_table.h
src/sdk/sdk.cpp

index 1deea46..57d7a40 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 engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_text);
 void engine_loader_focus_in();
 void engine_loader_focus_out();
 void engine_loader_update_cursor_position(int cursor_pos);
index 66b6522..76f42cb 100644 (file)
@@ -62,6 +62,7 @@ typedef struct _LANGUAGE_INFO {
         is_latin_language = false;
         accepts_caps_mode = false;
         load_in_ime = false;
+        need_surrounding_text = false;
     }
     /* Indicates whether this language was enabled in option window's language selection list */
     sclboolean enabled;
@@ -93,6 +94,7 @@ typedef struct _LANGUAGE_INFO {
     /* If this language accepts caps mode, try to handle AutoCapitalization option */
     sclboolean accepts_caps_mode;
     sclboolean load_in_ime;
+    sclboolean need_surrounding_text;
 } LANGUAGE_INFO;
 
 
index 06260bb..2779d92 100644 (file)
@@ -691,7 +691,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 engine_loader_process_key_event(scim::KeyEvent& key, bool need_surrounding_text)
 {
     bool result = false;
     GDBusMessage *reply = NULL;
@@ -703,6 +703,32 @@ bool engine_loader_process_key_event(scim::KeyEvent& key)
         return false;
     }
 
+    if (need_surrounding_text) {
+        char *text = NULL;
+        int cursor;
+
+        ime_get_surrounding_text(-1, -1, &text, &cursor);
+        SECURE_LOGD("surrounding text : %s\n", text);
+
+        if (_send_sync_message(dbus_info->gdbus_connection, g_variant_new("(si)", text, cursor), &reply, "set_surrounding_text")) {
+            reply_body = g_dbus_message_get_body(reply);
+            g_variant_get(reply_body, "(b)", &result);
+        }
+
+        if (!result)
+            LOGE("Failed to set surrounding_text");
+
+        if (reply_body) {
+            g_variant_unref(reply_body);
+            reply_body = NULL;
+        }
+
+        if (text)
+            free(text);
+
+        result = false;
+    }
+
     key_event_builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
     g_variant_builder_add(key_event_builder, "{sv}", "key_code", g_variant_new_uint32(key.code));
     g_variant_builder_add(key_event_builder, "{sv}", "key_mask", g_variant_new_uint16(key.mask));
index 6543966..1ad851d 100644 (file)
@@ -2814,7 +2814,11 @@ static bool ime_app_process_key_event_cb(ime_key_code_e keycode, ime_key_mask_e
 static bool ime_app_process_key_event_with_imengine_cb(scim::KeyEvent &key, void *user_data)
 {
     bool ret = false;
-    ret = engine_loader_process_key_event(key);
+    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);
+    else
+        ret = engine_loader_process_key_event(key, false);
 
     return ret;
 }
index eaee35b..2f772ee 100644 (file)
@@ -265,6 +265,7 @@ ISELangTableMgr::parse_lang_table(const xmlNodePtr p_node) {
             m_table[m_size].is_latin_language = get_prop_bool(cur_node, "is_latin_language");
             m_table[m_size].accepts_caps_mode = get_prop_bool(cur_node, "accepts_caps_mode");
             m_table[m_size].load_in_ime = get_prop_bool(cur_node, "load_in_ime");
+            m_table[m_size].need_surrounding_text = get_prop_bool(cur_node, "need_surrounding_text");
 
             m_size++;
         }
index 1327e42..d611c5c 100644 (file)
@@ -39,6 +39,7 @@ typedef struct ISE_LANG_TABLE {
         is_latin_language = false;
         accepts_caps_mode = false;
         load_in_ime = false;
+        need_surrounding_text = false;
     }
     /* This is the string ID of this language, used in ISE side. For example, ISE developer can use this string to select this language, by passing "Korean" to ISELanguageManager::select_language() function */
     char *language;
@@ -80,6 +81,7 @@ typedef struct ISE_LANG_TABLE {
     /* If this language accepts caps mode, try to handle AutoCapitalization option */
     bool accepts_caps_mode;
     bool load_in_ime;
+    bool need_surrounding_text;
 } ISE_LANG_TABLE;
 
 typedef struct Keyboard_UUID {
index ee3ecf0..069f646 100644 (file)
@@ -80,6 +80,7 @@ public :
                 language.is_latin_language = table[loop].is_latin_language;
                 language.accepts_caps_mode = table[loop].accepts_caps_mode;
                 language.load_in_ime = table[loop].load_in_ime;
+                language.need_surrounding_text = table[loop].need_surrounding_text;
 
                 /* These variable should be read from stored setting values */
                 language.enabled = FALSE;