[gtk/better-dead-keys-3: 2/5] imcontext: Improve dead key handling more




commit a0cdd25bd4274d6ff12162de3d416326ec0429e4
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Mar 21 18:51:57 2021 -0400

    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.

 gtk/gtkimcontextsimple.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
---
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;


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