From 675a4111e9f48b1f2290eafdc0d9598fbe48e199 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 17 Dec 2017 22:09:08 -0500 Subject: [PATCH] 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. --- gtk/gtkemojichooser.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index 596c92e12f..9f1cb41244 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -343,6 +343,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++) @@ -358,12 +361,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",