mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-10 04:30:11 +00:00
gtkimcontextime.c: Fix Korean input
Commitc255ba68
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.
This commit is contained in:
parent
adbaee796d
commit
1ece556200
@ -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);
|
||||
{
|
||||
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);
|
||||
}
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user