summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2017-12-17 22:09:08 -0500
committerMatthias Clasen <mclasen@redhat.com>2018-01-15 08:21:52 -0500
commit9e3b8145805d1bfd78a082c73c5e8a162f07db16 (patch)
tree2e342b644d8633242fc3653d5edb6d394a040fc8
parentbcd3c42b92cc9a584da366434f6f385545d1fa27 (diff)
downloadgtk+-9e3b8145805d1bfd78a082c73c5e8a162f07db16.tar.gz
emoji: Skip overly wide fallback rendering
Some emoji fonts (such as Emoji One), render Emoji sequences such as some of the family variations using multiple individual glyphs. This rendering is too wide and breaks our grid layout. Therefore, we will just skip any sequence whose rendering is more than twice as wide as a simple smiley.
-rw-r--r--gtk/gtkemojichooser.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index 232fc13eeb..daa565bef7 100644
--- a/gtk/gtkemojichooser.c
+++ b/gtk/gtkemojichooser.c
@@ -361,6 +361,9 @@ add_emoji (GtkWidget *box,
char text[64];
char *p = text;
int i;
+ PangoLayout *layout;
+ PangoRectangle rect;
+ int width;
codes = g_variant_get_child_value (item, 0);
for (i = 0; i < g_variant_n_children (codes); i++)
@@ -376,12 +379,27 @@ add_emoji (GtkWidget *box,
g_variant_unref (codes);
p[0] = 0;
- label = gtk_label_new (text);
+ label = gtk_label_new ("🙂");
attrs = pango_attr_list_new ();
pango_attr_list_insert (attrs, pango_attr_scale_new (PANGO_SCALE_X_LARGE));
gtk_label_set_attributes (GTK_LABEL (label), attrs);
pango_attr_list_unref (attrs);
+ layout = gtk_label_get_layout (GTK_LABEL (label));
+ pango_layout_get_extents (layout, &rect, NULL);
+ width = rect.width;
+
+ gtk_label_set_text (GTK_LABEL (label), text);
+ layout = gtk_label_get_layout (GTK_LABEL (label));
+ pango_layout_get_extents (layout, &rect, NULL);
+
+ /* Check for fallback rendering that generates too wide items */
+ if (rect.width >= 2 * width)
+ {
+ gtk_widget_destroy (label);
+ return;
+ }
+
child = gtk_flow_box_child_new ();
gtk_style_context_add_class (gtk_widget_get_style_context (child), "emoji");
g_object_set_data_full (G_OBJECT (child), "emoji-data",