diff --git a/gtk/emoji/bn.data b/gtk/emoji/bn.data index 02c27fcecb..332d9a215c 100644 Binary files a/gtk/emoji/bn.data and b/gtk/emoji/bn.data differ diff --git a/gtk/emoji/convert-emoji.c b/gtk/emoji/convert-emoji.c index bcbcff4f30..7da284e8d8 100644 --- a/gtk/emoji/convert-emoji.c +++ b/gtk/emoji/convert-emoji.c @@ -24,9 +24,14 @@ /* The format of the generated data is: a(aussasasu). * Each member of the array has the following fields: - * au - sequence of unicode codepoints. If the - * sequence contains a 0, it marks the point - * where skin tone modifiers should be inserted + * au - sequence of unicode codepoints, including the emoji presentation + * selector (FE0F) where necessary. skin tone variations are represented + * with either the first tone code point (1F3FB) or 0. the choice indicates + * the handling of the generic sequence (i.e., no tone), which may have a + * default text presentation and thus require the emoji presentation + * selector (unlike sequences with a tone, which are always presented as + * emojis). 0 indicates the text case, that is, replace this code point + * with FE0F, while 1F3FB indicates this code point should be omitted. * s - name in english, e.g. "man worker" * s - name in locale * as - keywords in english, e.g. "man", "worker" @@ -48,7 +53,8 @@ gboolean parse_code (GVariantBuilder *b, - const char *code) + const char *code, + gboolean needs_presentation_selector) { g_auto(GStrv) strv = NULL; int j; @@ -66,11 +72,31 @@ parse_code (GVariantBuilder *b, return FALSE; } if (0x1f3fb <= u && u <= 0x1f3ff) - g_variant_builder_add (b, "u", 0); + { + if (needs_presentation_selector) + { + if (strv[j+1]) + { + g_error ("unexpected inner skin tone in default-text generic sequence: %s\n", code); + return FALSE; + } + g_variant_builder_add (b, "u", 0); + needs_presentation_selector = FALSE; + } + else + { + g_variant_builder_add (b, "u", 0x1f3fb); + } + } else - g_variant_builder_add (b, "u", u); + { + g_variant_builder_add (b, "u", u); + } } + if (needs_presentation_selector) + g_variant_builder_add (b, "u", 0xfe0f); + return TRUE; } @@ -120,7 +146,6 @@ main (int argc, char *argv[]) array_en = json_node_get_array (root_en); length_en = json_array_get_length (array_en); - g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(aussasasu)")); for (i = 0; i < length; i++) { @@ -133,13 +158,21 @@ main (int argc, char *argv[]) const char *name; const char *name_en; char *code; + const char *text; + gboolean needs_presentation_selector; + if (!json_object_has_member (obj, "group")) continue; if (!json_object_has_member (obj_en, "group")) continue; + group = json_object_get_int_member (obj, "group"); name = json_object_get_string_member (obj, "label"); name_en = json_object_get_string_member (obj_en, "label"); + + if (g_str_has_suffix (name_en, "skin tone")) + continue; + if (json_object_has_member (obj, "skins") && json_object_has_member (obj_en, "skins")) { JsonArray *a2 = json_object_get_array_member (obj, "skins"); @@ -151,9 +184,12 @@ main (int argc, char *argv[]) { code = g_strdup (json_object_get_string_member (obj, "hexcode")); } - g_variant_builder_init (&b1, G_VARIANT_TYPE ("au")); - if (!parse_code (&b1, code)) + text = json_object_get_string_member (obj, "text"); + needs_presentation_selector = *text != '\0' && json_object_get_int_member (obj, "type") == 0; + + g_variant_builder_init (&b1, G_VARIANT_TYPE ("au")); + if (!parse_code (&b1, code, needs_presentation_selector)) return 1; g_variant_builder_init (&b2, G_VARIANT_TYPE ("as")); diff --git a/gtk/emoji/da.data b/gtk/emoji/da.data index e76f713e26..cfb7d63829 100644 Binary files a/gtk/emoji/da.data and b/gtk/emoji/da.data differ diff --git a/gtk/emoji/de.data b/gtk/emoji/de.data index 25adc0b4e4..4a72e2c460 100644 Binary files a/gtk/emoji/de.data and b/gtk/emoji/de.data differ diff --git a/gtk/emoji/en.data b/gtk/emoji/en.data index 99a1a5bdd9..62727f4214 100644 Binary files a/gtk/emoji/en.data and b/gtk/emoji/en.data differ diff --git a/gtk/emoji/es.data b/gtk/emoji/es.data index 66e886f89f..69b44ae399 100644 Binary files a/gtk/emoji/es.data and b/gtk/emoji/es.data differ diff --git a/gtk/emoji/et.data b/gtk/emoji/et.data index 0ad4000e42..6fd99e8c00 100644 Binary files a/gtk/emoji/et.data and b/gtk/emoji/et.data differ diff --git a/gtk/emoji/fi.data b/gtk/emoji/fi.data index 7de8384b30..08fe27d99c 100644 Binary files a/gtk/emoji/fi.data and b/gtk/emoji/fi.data differ diff --git a/gtk/emoji/fr.data b/gtk/emoji/fr.data index 0b34064ded..6e6565ac6f 100644 Binary files a/gtk/emoji/fr.data and b/gtk/emoji/fr.data differ diff --git a/gtk/emoji/hi.data b/gtk/emoji/hi.data index ccbd739f65..126cbc1212 100644 Binary files a/gtk/emoji/hi.data and b/gtk/emoji/hi.data differ diff --git a/gtk/emoji/hu.data b/gtk/emoji/hu.data index aff15024bc..daa9af4c0f 100644 Binary files a/gtk/emoji/hu.data and b/gtk/emoji/hu.data differ diff --git a/gtk/emoji/it.data b/gtk/emoji/it.data index ea6d06ccff..abb6d6ed1b 100644 Binary files a/gtk/emoji/it.data and b/gtk/emoji/it.data differ diff --git a/gtk/emoji/ja.data b/gtk/emoji/ja.data index 9339a29012..1cba1c0b7b 100644 Binary files a/gtk/emoji/ja.data and b/gtk/emoji/ja.data differ diff --git a/gtk/emoji/ko.data b/gtk/emoji/ko.data index 2813f822e6..4173f300bf 100644 Binary files a/gtk/emoji/ko.data and b/gtk/emoji/ko.data differ diff --git a/gtk/emoji/lt.data b/gtk/emoji/lt.data index 8d9ead37cf..3d4bd6a17b 100644 Binary files a/gtk/emoji/lt.data and b/gtk/emoji/lt.data differ diff --git a/gtk/emoji/ms.data b/gtk/emoji/ms.data index d299582570..8bff7153dd 100644 Binary files a/gtk/emoji/ms.data and b/gtk/emoji/ms.data differ diff --git a/gtk/emoji/nb.data b/gtk/emoji/nb.data index b568def393..f89acd2d48 100644 Binary files a/gtk/emoji/nb.data and b/gtk/emoji/nb.data differ diff --git a/gtk/emoji/nl.data b/gtk/emoji/nl.data index 49747d7576..26729c319b 100644 Binary files a/gtk/emoji/nl.data and b/gtk/emoji/nl.data differ diff --git a/gtk/emoji/pl.data b/gtk/emoji/pl.data index 3f2f466cae..474daabe0c 100644 Binary files a/gtk/emoji/pl.data and b/gtk/emoji/pl.data differ diff --git a/gtk/emoji/pt.data b/gtk/emoji/pt.data index 6bafb0c26a..13cd5f2aa1 100644 Binary files a/gtk/emoji/pt.data and b/gtk/emoji/pt.data differ diff --git a/gtk/emoji/ru.data b/gtk/emoji/ru.data index bce5b5db0d..fc51033a2b 100644 Binary files a/gtk/emoji/ru.data and b/gtk/emoji/ru.data differ diff --git a/gtk/emoji/sv.data b/gtk/emoji/sv.data index b828b5b64c..4753a9e444 100644 Binary files a/gtk/emoji/sv.data and b/gtk/emoji/sv.data differ diff --git a/gtk/emoji/th.data b/gtk/emoji/th.data index 71ca75d24c..ce3bf3f7be 100644 Binary files a/gtk/emoji/th.data and b/gtk/emoji/th.data differ diff --git a/gtk/emoji/uk.data b/gtk/emoji/uk.data index 8275bb1702..7a987b43ad 100644 Binary files a/gtk/emoji/uk.data and b/gtk/emoji/uk.data differ diff --git a/gtk/emoji/zh.data b/gtk/emoji/zh.data index 7f140e850b..5bcac9bb91 100644 Binary files a/gtk/emoji/zh.data and b/gtk/emoji/zh.data differ diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index f336a8aed0..c7b167f85f 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -449,7 +449,7 @@ static gboolean has_variations (GVariant *emoji_data) { GVariant *codes; - int i; + gsize i; gboolean has_variations; has_variations = FALSE; @@ -458,7 +458,7 @@ has_variations (GVariant *emoji_data) { gunichar code; g_variant_get_child (codes, i, "u", &code); - if (code == 0) + if (code == 0 || code == 0x1f3fb) { has_variations = TRUE; break; @@ -571,15 +571,14 @@ add_emoji (GtkWidget *box, { g_variant_get_child (codes, i, "u", &code); if (code == 0) + code = modifier != 0 ? modifier : 0xfe0f; + if (code == 0x1f3fb) code = modifier; if (code != 0) p += g_unichar_to_utf8 (code, p); } g_variant_unref (codes); - if (code != 0xFE0F && code != 0xFE0E) - p += g_unichar_to_utf8 (0xFE0F, p); /* Append a variation selector, if there isn't one already */ - p[0] = 0; label = gtk_label_new (text); diff --git a/gtk/gtkemojicompletion.c b/gtk/gtkemojicompletion.c index 64d8e7da3d..11f91301a9 100644 --- a/gtk/gtkemojicompletion.c +++ b/gtk/gtkemojicompletion.c @@ -409,7 +409,7 @@ has_variations (GVariant *emoji_data) { gunichar code; g_variant_get_child (codes, i, "u", &code); - if (code == 0) + if (code == 0 || code == 0x1f3fb) { has_variations = TRUE; break; @@ -438,12 +438,13 @@ get_text (GVariant *emoji_data, g_variant_get_child (codes, i, "u", &code); if (code == 0) + code = modifier != 0 ? modifier : 0xfe0f; + if (code == 0x1f3fb) code = modifier; if (code != 0) p += g_unichar_to_utf8 (code, p); } g_variant_unref (codes); - p += g_unichar_to_utf8 (0xFE0F, p); /* U+FE0F is the Emoji variation selector */ p[0] = 0; } diff --git a/gtk/org.gtk.gtk4.Settings.EmojiChooser.gschema.xml b/gtk/org.gtk.gtk4.Settings.EmojiChooser.gschema.xml index 0b577c7fc8..28c0a62c01 100644 --- a/gtk/org.gtk.gtk4.Settings.EmojiChooser.gschema.xml +++ b/gtk/org.gtk.gtk4.Settings.EmojiChooser.gschema.xml @@ -9,7 +9,7 @@ An array of Emoji definitions to show in the Emoji chooser. Each Emoji is specified as an array of codepoints, name and keywords. The extra integer after this pair is the code of the Fitzpatrick modifier to use in - place of a 0 in the codepoint array. + place of a modifier placeholder (0 or 0x1F3FB) in the codepoint array.