[gtk/gtk-3-24.win.updated: 6/6] gtkimcontextime.c: Fix Korean input



commit 1ece55620036b41ce1b0fcf434fde78f27af1af1
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Tue Sep 25 16:50:36 2018 +0800

    gtkimcontextime.c: Fix Korean input
    
    Commit c255ba68 inadvertently introduced a regression that broke Korean
    text input because the changes there resulted that only the last input
    string that we have from ImmGetCompositionStringW() for each time the
    commit signal is emitted is kept, and also as a result the final Korean
    character that is input by hitting space is also lost as a result, as we
    didn't check for whether we are done with preediting.
    
    Fix these issues by doing the following when we receive the
    WM_IME_COMPOSITION message with GCS_RESULTSTR from Windows:
    -Do not emit the commit signal during WM_IME_ENDCOMPOSITION, and...
    -Emit the commit signal anyways, as we did before, c255ba68, however...
    -We still save up the string to commit, because we need to re-compute
     the cursor position when we do ->get_preedit_string(), which needs to
     take the GCS_RESULTSTR string we get from WM_IME_COMPOSITION into
     account as well, so that we avoid getting the Pango criticals that
     occur during Chinese (and most likely Japanese) input as the cursor
     position is out-of-range.
    
    Fixes issue #1350.

 modules/input/gtkimcontextime.c | 90 +++++++++++++++++++++++++----------------
 1 file changed, 56 insertions(+), 34 deletions(-)
---
diff --git a/modules/input/gtkimcontextime.c b/modules/input/gtkimcontextime.c
index c6ce515129..2b165e9fcd 100644
--- a/modules/input/gtkimcontextime.c
+++ b/modules/input/gtkimcontextime.c
@@ -479,30 +479,53 @@ get_utf8_preedit_string (GtkIMContextIME *context_ime, gint *pos_ret)
 
       len = ImmGetCompositionStringW (himc, GCS_COMPSTR, NULL, 0);
       if (len > 0)
-       {
-         GError *error = NULL;
-         gpointer buf = g_alloca (len);
-
-         ImmGetCompositionStringW (himc, GCS_COMPSTR, buf, len);
-         len /= 2;
-         utf8str = g_utf16_to_utf8 (buf, len, NULL, NULL, &error);
-         if (error)
-           {
-             g_warning ("%s", error->message);
-             g_error_free (error);
-           }
+        {
+          GError *error = NULL;
+          gpointer buf = g_alloca (len);
+
+          ImmGetCompositionStringW (himc, GCS_COMPSTR, buf, len);
+          len /= 2;
+          utf8str = g_utf16_to_utf8 (buf, len, NULL, NULL, &error);
+          if (error)
+            {
+              g_warning ("%s", error->message);
+              g_error_free (error);
+            }
          
-         if (pos_ret)
-           {
-             pos = ImmGetCompositionStringW (himc, GCS_CURSORPOS, NULL, 0);
-             if (pos < 0 || len < pos)
-               {
-                 g_warning ("ImmGetCompositionString: "
-                            "Invalid cursor position!");
-                 pos = 0;
-               }
-           }
-       }
+          if (pos_ret)
+            {
+              pos = ImmGetCompositionStringW (himc, GCS_CURSORPOS, NULL, 0);
+              if (pos < 0 || len < pos)
+                {
+                  g_warning ("ImmGetCompositionString: "
+                             "Invalid cursor position!");
+                  pos = 0;
+                }
+            }
+        }
+
+      if (context_ime->commit_string)
+        {
+          if (utf8str)
+            {
+              gchar *utf8str_new = g_strdup (utf8str);
+
+              /* Note: We *don't* want to update context_ime->commit_string here!
+               * Otherwise it will be updated repeatedly, not what we want!
+               */
+              g_free (utf8str);
+              utf8str = g_strconcat (context_ime->commit_string,
+                                     utf8str_new,
+                                     NULL);
+              g_free (utf8str_new);
+              pos += g_utf8_strlen (context_ime->commit_string, -1);
+            }
+          else
+            {
+              utf8str = g_strdup (context_ime->commit_string);
+              pos = g_utf8_strlen (context_ime->commit_string, -1);
+            }
+        }
     }
 
   if (!utf8str)
@@ -997,7 +1020,6 @@ ERROR_OUT:
   ImmReleaseContext (hwnd, himc);
 }
 
-
 static GdkFilterReturn
 gtk_im_context_ime_message_filter (GdkXEvent *xevent,
                                    GdkEvent  *event,
@@ -1070,19 +1092,26 @@ gtk_im_context_ime_message_filter (GdkXEvent *xevent,
                 ImmGetCompositionStringW (himc, GCS_RESULTSTR, buf, len);
                 len /= 2;
                 context_ime->commit_string = g_utf16_to_utf8 (buf, len, NULL, NULL, &error);
+
                 if (error)
                   {
                     g_warning ("%s", error->message);
                     g_error_free (error);
                   }
-              }
 
-            if (context_ime->commit_string)
-              retval = TRUE;
+                if (context_ime->commit_string)
+                  {
+                    g_signal_emit_by_name (context, "commit", context_ime->commit_string);
+                    g_free (context_ime->commit_string);
+                    context_ime->commit_string = NULL;
+                    retval = TRUE;
+                  }
+              }
           }
 
         if (context_ime->use_preedit)
           retval = TRUE;
+
         break;
       }
 
@@ -1099,13 +1128,6 @@ gtk_im_context_ime_message_filter (GdkXEvent *xevent,
       g_signal_emit_by_name (context, "preedit-changed");
       g_signal_emit_by_name (context, "preedit-end");
 
-      if (context_ime->commit_string)
-        {
-          g_signal_emit_by_name (context, "commit", context_ime->commit_string);
-          g_free (context_ime->commit_string);
-          context_ime->commit_string = NULL;
-        }
-
       if (context_ime->use_preedit)
         retval = TRUE;
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]