summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-21 18:51:57 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-03-21 22:09:56 -0400
commita0cdd25bd4274d6ff12162de3d416326ec0429e4 (patch)
tree01133682e3aeaaf7b928df73dd0d4fa89c441796
parentc26525f87c885929eccf248dd8cae2a2cf28b819 (diff)
downloadgtk+-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.c33
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;