[gtk/emoji-grid: 16/16] Filter Emoji by font availability




commit 106ce8580c913d31485e1b7519afe3cb0062d48e
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Feb 28 16:37:29 2022 -0700

    Filter Emoji by font availability
    
    Don't show hexboxes in the emoji grid.

 gtk/gtkemojilist.c | 55 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 11 deletions(-)
---
diff --git a/gtk/gtkemojilist.c b/gtk/gtkemojilist.c
index 5237e870ff..9722678ec3 100644
--- a/gtk/gtkemojilist.c
+++ b/gtk/gtkemojilist.c
@@ -330,6 +330,27 @@ gtk_emoji_list_init (GtkEmojiList *self)
   objects_init (&self->items);
 }
 
+static gboolean
+has_emoji_coverage (GtkEmojiObject *emoji)
+{
+  PangoContext *context;
+  PangoLayout *layout;
+  char buffer[64];
+  gboolean ret;
+
+  context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
+  layout = pango_layout_new (context);
+
+  gtk_emoji_object_get_text (emoji, buffer, sizeof (buffer), 0);
+  pango_layout_set_text (layout, buffer, -1);
+  ret = pango_layout_get_unknown_glyphs_count (layout) == 0;
+
+  g_object_unref (layout);
+  g_object_unref (context);
+
+  return ret;
+}
+
 static void
 gtk_emoji_list_populate_recent (GtkEmojiList *self)
 {
@@ -350,19 +371,25 @@ gtk_emoji_list_populate_recent (GtkEmojiList *self)
       GVariant *emoji_data;
       gunichar modifier;
       GtkEmojiObject *emoji;
-      GtkEmojiGroup group;
-
-      pos++;
 
       emoji_data = g_variant_get_child_value (item, 0);
       g_variant_get_child (item, 1, "u", &modifier);
 
       emoji = gtk_emoji_object_new (emoji_data, TRUE, modifier);
 
-      group = gtk_emoji_object_get_group (emoji);
-      self->section[group] = MAX (self->section[group], pos);
+      if (has_emoji_coverage (emoji))
+        {
+          GtkEmojiGroup group;
+
+          pos++;
 
-      objects_append (&self->items, emoji);
+          group = gtk_emoji_object_get_group (emoji);
+          self->section[group] = MAX (self->section[group], pos);
+
+          objects_append (&self->items, emoji);
+        }
+      else
+        g_object_unref (emoji);
 
       g_variant_unref (emoji_data);
       g_variant_unref (item);
@@ -390,14 +417,20 @@ gtk_emoji_list_populate_data (GtkEmojiList *self)
   while ((item = g_variant_iter_next_value (iter)))
     {
       GtkEmojiObject *emoji = gtk_emoji_object_new (item, FALSE, 0);
-      GtkEmojiGroup group;
 
-      pos++;
+      if (has_emoji_coverage (emoji))
+        {
+          GtkEmojiGroup group;
+
+          pos++;
 
-      group = gtk_emoji_object_get_group (emoji);
-      self->section[group] = MAX (self->section[group], pos);
+          group = gtk_emoji_object_get_group (emoji);
+          self->section[group] = MAX (self->section[group], pos);
 
-      objects_append (&self->items, emoji);
+          objects_append (&self->items, emoji);
+        }
+      else
+        g_object_unref (emoji);
 
       g_variant_unref (item);
     }


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