[pango/fix-keycap-sequences] Fix handling of keycap sequences




commit 47109e63c2ebf277c8a71ef23bbf105e8157ea79
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Sep 17 14:38:17 2020 -0400

    Fix handling of keycap sequences
    
    The last character of Emoji keycap sequences, 0x20E3,
    has a vertical orientation of U, according to Unicode.
    This unfortunately makes the width iter frequently break
    such sequences into multiple items, preventing them from
    being rendered as expected.
    
    Fix this by making the width iter recognize (and ignore)
    keycap sequences.
    
    Fixes: #502

 pango/pango-context.c | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)
---
diff --git a/pango/pango-context.c b/pango/pango-context.c
index bebe804a..f16fd86d 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -928,6 +928,8 @@ static void
 width_iter_next(PangoWidthIter* iter)
 {
   gboolean met_joiner = FALSE;
+  int in_keycap_sequence = 0;
+
   iter->start = iter->end;
 
   if (iter->end < iter->text_end)
@@ -956,6 +958,32 @@ width_iter_next(PangoWidthIter* iter)
           continue;
         }
 
+      switch (in_keycap_sequence)
+        {
+        case 0:
+          if ((ch >= '0' && ch <= '9') || ch == '#' || ch == '*')
+            in_keycap_sequence = 1;
+          break;
+        case 1:
+          if (ch == 0xFE0F)
+            in_keycap_sequence = 2;
+          else
+            in_keycap_sequence = 0;
+          break;
+        case 2:
+          if (ch == 0x20E3)
+            {
+              iter->end = g_utf8_next_char (iter->end);
+              in_keycap_sequence = 0;
+              continue;
+            }
+          else
+            in_keycap_sequence = 0;
+          break;
+        default:
+          g_assert_not_reached ();
+        }
+
       /* for variation selector, tag and emoji modifier. */
       if (G_UNLIKELY(ch == 0xFE0EU || ch == 0xFE0FU
                     || (ch >= 0xE0020 && ch <= 0xE007F)


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