[gtk: 16/60] fontchooser: Populate the list incrementally




commit 67f259cd1a9e1d8e63aa9acf6978253a7e59f895
Author: Matthias Clasen <mclasen redhat com>
Date:   Tue Aug 25 15:13:39 2020 -0400

    fontchooser: Populate the list incrementally
    
    By adding 20 fonts / frame to the font list, we can
    get the font chooser dialog to show up much faster.
    
    This change gets the font chooser up in 265ms here.

 gtk/gtkfontchooserwidget.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)
---
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 480cd88d54..4351316300 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -54,6 +54,7 @@
 #include "gtkroot.h"
 #include "gtkfilterlistmodel.h"
 #include "gtkflattenlistmodel.h"
+#include "gtkslicelistmodel.h"
 #include "gtkmaplistmodel.h"
 
 #include <hb-ot.h>
@@ -770,6 +771,40 @@ axis_free (gpointer v)
   g_free (a);
 }
 
+/* We incrementally populate our fontlist to prevent blocking
+ * the font chooser for a long time with expensive FcFontSort
+ * calls in pango for every row in the list).
+ */
+static gboolean
+add_to_fontlist (GtkWidget     *widget,
+                 GdkFrameClock *clock,
+                 gpointer       user_data)
+{
+  GtkFontChooserWidget *self = GTK_FONT_CHOOSER_WIDGET (widget);
+  GtkSliceListModel *model = user_data;
+  GListModel *child_model;
+  guint n;
+
+  if (gtk_filter_list_model_get_model (self->filter_model) != G_LIST_MODEL (model))
+    return G_SOURCE_REMOVE;
+
+  child_model = gtk_slice_list_model_get_model (model);
+
+  n = gtk_slice_list_model_get_size (model);
+
+  n += 10;
+
+  if (n >= g_list_model_get_n_items (child_model))
+    n = G_MAXUINT;
+
+  gtk_slice_list_model_set_size (model, n);
+
+  if (n == G_MAXUINT)
+    return G_SOURCE_REMOVE;
+  else
+    return G_SOURCE_CONTINUE;
+}
+
 static void
 update_fontlist (GtkFontChooserWidget *self)
 {
@@ -784,6 +819,10 @@ update_fontlist (GtkFontChooserWidget *self)
     model = g_object_ref (G_LIST_MODEL (fontmap));
   else
     model = G_LIST_MODEL (gtk_flatten_list_model_new (G_LIST_MODEL (g_object_ref (fontmap))));
+
+  model = G_LIST_MODEL (gtk_slice_list_model_new (model, 0, 20));
+  gtk_widget_add_tick_callback (GTK_WIDGET (self), add_to_fontlist, g_object_ref (model), g_object_unref);
+
   gtk_filter_list_model_set_model (self->filter_model, model);
   g_object_unref (model);
 }


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