diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-03-21 18:51:57 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-03-21 22:09:56 -0400 |
commit | a0cdd25bd4274d6ff12162de3d416326ec0429e4 (patch) | |
tree | 01133682e3aeaaf7b928df73dd0d4fa89c441796 | |
parent | c26525f87c885929eccf248dd8cae2a2cf28b819 (diff) | |
download | gtk+-a0cdd25bd4274d6ff12162de3d416326ec0429e4.tar.gz |
imcontext: Improve dead key handling more
For sequences like ``, we want to commit the first
deadkey and then continue preedit with the second.
The alternative is to do chained deadkeys, where
entering ~~a yields ̃̀̃̃a. But we don't do that, and
I think that would be more controversial.
-rw-r--r-- | gtk/gtkimcontextsimple.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gtk/gtkimcontextsimple.c b/gtk/gtkimcontextsimple.c index 0e51bc725d..204a375535 100644 --- a/gtk/gtkimcontextsimple.c +++ b/gtk/gtkimcontextsimple.c @@ -895,6 +895,39 @@ gtk_im_context_simple_filter_keypress (GtkIMContext *context, output = g_string_new (""); + if (n_compose == 2) + { + /* Special-case deadkey-deadkey sequences. + * We are not doing chained deadkeys, so we + * want to commit the first key, and contine + * preediting with second. + */ + if (is_dead_key (priv->compose_buffer[0]) && + is_dead_key (priv->compose_buffer[1])) + { + gunichar ch; + gboolean need_space; + guint next; + + next = priv->compose_buffer[1]; + + ch = dead_key_to_unicode (priv->compose_buffer[0], &need_space); + if (ch) + { + if (need_space) + g_string_append_c (output, ' '); + g_string_append_unichar (output, ch); + + gtk_im_context_simple_commit_string (context_simple, output->str); + g_string_set_size (output, 0); + + priv->compose_buffer[0] = next; + priv->compose_buffer[1] = 0; + n_compose = 1; + } + } + } + G_LOCK (global_tables); tmp_list = global_tables; |