Merge branch 'gtk-3-24.win.updated' into 'gtk-3-24'

gtkimcontextime.c: Fix Korean input

See merge request GNOME/gtk!356
This commit is contained in:
LRN 2018-10-08 20:04:08 +00:00
commit caa5ba46ad

View File

@ -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;