Disable auto punctuation feature when following symbols except punctuation characters 74/34074/1
authorJihoon Kim <jihoon48.kim@samsung.com>
Wed, 3 Dec 2014 04:10:34 +0000 (13:10 +0900)
committerLi Zhang <li2012.zhang@samsung.com>
Wed, 21 Jan 2015 03:45:47 +0000 (11:45 +0800)
[model] All
[binary_type] PDA
[customer] OPEN
[issue#] N/A
[problem] Symbol mode was transformed to character mode following symbol and autopunctuation
[cause] puncutation character and blank character leads to turn on Shift key.
[solution] Disable auto punctuation feature when following symbols except punctuation characters
[team] Input Framework
[request] N/A
[horizontal_expansion] N/A

Change-Id: I6d6d0341a3659a4ed78e44067bd0e3508bae75e6

ism/extras/efl_immodule/isf_imf_context.cpp

index 15c81f5..7311155 100644 (file)
@@ -35,6 +35,7 @@
 #include <pthread.h>
 #include <langinfo.h>
 #include <unistd.h>
+#include <wctype.h>
 
 #include <Evas.h>
 #include <Ecore_Evas.h>
@@ -756,12 +757,6 @@ autoperiod_insert (Ecore_IMF_Context *ctx)
     int cursor_pos = 0;
     Eina_Unicode *ustr = NULL;
     Ecore_IMF_Event_Delete_Surrounding ev;
-    Eina_Unicode space_symbols[] = {' ', 0x00A0 /* no-break space */, 0x3000 /* ideographic space */};
-    Eina_Unicode symbols[] = {' ', 0x00A0 /* no-break space */, 0x3000 /* ideographic space */,
-                              ':', ';', '.', '!', '?', 0x00BF /* ¿ */, 0x00A1 /* ¡ */,
-                              0x3002 /* 。 */, 0x06D4 /* Urdu */,  0x0964 /* Hindi */,
-                              0x0589 /* Armenian */, 0x17D4 /* Khmer */, 0x104A /* Myanmar */};
-    const int symbol_num = sizeof (symbols) / sizeof (symbols[0]);
     char *fullstop_mark = NULL;
 
     if (autoperiod_allow == EINA_FALSE)
@@ -785,8 +780,8 @@ autoperiod_insert (Ecore_IMF_Context *ctx)
 
     if (cursor_pos < 2) goto done;
 
-    if (check_symbol (ustr[cursor_pos-1], space_symbols, (sizeof (space_symbols) / sizeof (space_symbols[0]))) &&
-        (!check_symbol (ustr[cursor_pos-2], symbols, symbol_num))) {
+    if (iswblank (ustr[cursor_pos-1]) &&
+        !(iswpunct (ustr[cursor_pos-2]) || iswblank (ustr[cursor_pos-2]))) {
         ev.ctx = ctx;
         ev.n_chars = 1;
         ev.offset = -1;
@@ -822,11 +817,9 @@ static Eina_Bool
 analyze_surrounding_text (Ecore_IMF_Context *ctx)
 {
     char *plain_str = NULL;
-    char *markup_str = NULL;
     Eina_Unicode puncs[] = {'\n','.', '!', '?', 0x00BF /* ¿ */, 0x00A1 /* ¡ */,
                             0x3002 /* 。 */, 0x06D4 /* Urdu */, 0x0964 /* Hindi */,
                             0x0589 /* Armenian */, 0x17D4 /* Khmer */, 0x104A /* Myanmar */};
-    Eina_Unicode space_symbols[] = {' ', 0x00A0 /* no-break space */, 0x3000 /* ideographic space */};
     Eina_Unicode *ustr = NULL;
     Eina_Bool ret = EINA_FALSE;
     Eina_Bool detect_space = EINA_FALSE;
@@ -854,18 +847,14 @@ analyze_surrounding_text (Ecore_IMF_Context *ctx)
     if (context_scim->impl->preedit_updating)
         return EINA_FALSE;
 
-    ecore_imf_context_surrounding_get (ctx, &markup_str, &cursor_pos);
-    if (!markup_str) goto done;
+    ecore_imf_context_surrounding_get (ctx, &plain_str, &cursor_pos);
+    if (!plain_str) goto done;
 
     if (cursor_pos == 0) {
         ret = EINA_TRUE;
         goto done;
     }
 
-    // Convert into plain string
-    plain_str = evas_textblock_text_markup_to_utf8 (NULL, markup_str);
-    if (!plain_str) goto done;
-
     // Convert string from UTF-8 to unicode
     ustr = eina_unicode_utf8_to_unicode (plain_str, NULL);
     if (!ustr) goto done;
@@ -875,7 +864,7 @@ analyze_surrounding_text (Ecore_IMF_Context *ctx)
     if (cursor_pos >= 1) {
         if (context_scim->impl->autocapital_type == ECORE_IMF_AUTOCAPITAL_TYPE_WORD) {
             // Check space or no-break space
-            if (check_symbol (ustr[cursor_pos-1], space_symbols, (sizeof (space_symbols) / sizeof (space_symbols[0])))) {
+            if (iswblank (ustr[cursor_pos-1])) {
                 ret = EINA_TRUE;
                 goto done;
             }
@@ -889,7 +878,7 @@ analyze_surrounding_text (Ecore_IMF_Context *ctx)
 
         for (i = cursor_pos; i > 0; i--) {
             // Check space or no-break space
-            if (check_symbol (ustr[i-1], space_symbols, (sizeof (space_symbols) / sizeof (space_symbols[0])))) {
+            if (iswblank (ustr[i-1])) {
                 detect_space = EINA_TRUE;
                 continue;
             }
@@ -918,7 +907,6 @@ analyze_surrounding_text (Ecore_IMF_Context *ctx)
 
 done:
     if (ustr) free (ustr);
-    if (markup_str) free (markup_str);
     if (plain_str) free (plain_str);
 
     return ret;