[pango/fix-keycap-sequences] Fix handling of keycap sequences
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/fix-keycap-sequences] Fix handling of keycap sequences
- Date: Thu, 17 Sep 2020 18:41:01 +0000 (UTC)
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]