Index: app/text/gimp-fonts.c
===================================================================
--- app/text/gimp-fonts.c	(revision 22835)
+++ app/text/gimp-fonts.c	(working copy)
@@ -61,12 +61,45 @@
                             G_CALLBACK (gimp_fonts_load), gimp);
 }
 
+static gboolean
+gimp_fonts_load_restore_idle (GimpFontList *list)
+{
+  gimp_font_list_restore (list);
+
+  return FALSE;
+}
+
+typedef struct
+{
+  Gimp     *gimp;
+  FcConfig *config;
+} GimpFontsLoadFuncData;
+
+static void
+gimp_fonts_load_func (GimpFontsLoadFuncData *data)
+{
+  if (! FcConfigBuildFonts (data->config))
+    {
+      FcConfigDestroy (data->config);
+      goto cleanup;
+    }
+
+  FcConfigSetCurrent (data->config);
+  
+  g_idle_add ((GSourceFunc) gimp_fonts_load_restore_idle, data->gimp->fonts);
+
+ cleanup:
+  g_object_unref (data->gimp);
+  g_slice_free (GimpFontsLoadFuncData, data);
+}
+
 void
 gimp_fonts_load (Gimp *gimp)
 {
-  FcConfig *config;
-  gchar    *fonts_conf;
-  gchar    *path;
+  FcConfig              *config;
+  gchar                 *fonts_conf;
+  gchar                 *path;
+  GimpFontsLoadFuncData *data;
 
   g_return_if_fail (GIMP_IS_FONT_LIST (gimp->fonts));
 
@@ -96,16 +129,12 @@
   gimp_fonts_add_directories (config, path);
   g_free (path);
 
-  if (! FcConfigBuildFonts (config))
-    {
-      FcConfigDestroy (config);
-      goto cleanup;
-    }
+  data = g_slice_new (GimpFontsLoadFuncData);
+  data->gimp = g_object_ref (gimp);
+  data->config = config;
 
-  FcConfigSetCurrent (config);
+  g_thread_create ((GThreadFunc) gimp_fonts_load_func, data, FALSE, NULL);
 
-  gimp_font_list_restore (GIMP_FONT_LIST (gimp->fonts));
-
  cleanup:
   gimp_container_thaw (GIMP_CONTAINER (gimp->fonts));
   gimp_unset_busy (gimp);
