[gimp/gimp-2-8] Bug 449848 - Startup: initialize fontconfig in the background ...
- From: Kristian Rietveld <kristian src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp/gimp-2-8] Bug 449848 - Startup: initialize fontconfig in the background ...
- Date: Sun, 17 Apr 2016 16:32:56 +0000 (UTC)
commit ad6729e0d67fc8eeb313c15dcb6c6be9e7276c3c
Author: Kristian Rietveld <kris loopnest org>
Date: Sun Apr 17 17:27:06 2016 +0100
Bug 449848 - Startup: initialize fontconfig in the background ...
... to avoid long pause on start
On non-Linux operating systems the fontconfig cache is often not
initialized by default. The first time GIMP was launched, this led
to a non-responding application, confusing many users.
The initialization of fontconfig has now been moved to a separate
thread. The main thread will wait for this fontconfig thread to
complete, regularly pulsing the UI.
This patch was partly based on an earlier patch by Tor Lillqvist.
(cherry picked from commit 30b73125f87b19e3ae322b9fc5bacc9f0b8ef3c1)
app/core/gimp.c | 2 +-
app/text/gimp-fonts.c | 78 +++++++++++++++++++++++++++++++++++++++++++++----
app/text/gimp-fonts.h | 2 +
3 files changed, 75 insertions(+), 7 deletions(-)
---
diff --git a/app/core/gimp.c b/app/core/gimp.c
index 68763c1..3caa316 100644
--- a/app/core/gimp.c
+++ b/app/core/gimp.c
@@ -975,7 +975,7 @@ gimp_restore (Gimp *gimp,
/* initialize the list of fonts */
status_callback (NULL, _("Fonts (this may take a while)"), 0.6);
if (! gimp->no_fonts)
- gimp_fonts_load (gimp);
+ gimp_fonts_load_with_status (gimp, status_callback);
/* initialize the list of gimp tool presets if we have a GUI */
if (! gimp->no_interface)
diff --git a/app/text/gimp-fonts.c b/app/text/gimp-fonts.c
index 36fbe96..8d59518 100644
--- a/app/text/gimp-fonts.c
+++ b/app/text/gimp-fonts.c
@@ -58,8 +58,39 @@ gimp_fonts_init (Gimp *gimp)
G_CALLBACK (gimp_fonts_load), gimp);
}
+typedef struct
+{
+ FcConfig *config;
+ GMutex mutex;
+ GCond cond;
+ gboolean caching_complete : 1;
+} GimpFontsLoadFuncData;
+
+static void
+gimp_fonts_load_func (FcConfig *config)
+{
+ if (! FcConfigBuildFonts (config))
+ FcConfigDestroy (config);
+ else
+ FcConfigSetCurrent (config);
+}
+
+static void
+gimp_fonts_load_thread (GimpFontsLoadFuncData *data)
+{
+ gimp_fonts_load_func (data->config);
+
+ g_mutex_lock (&data->mutex);
+ data->caching_complete = TRUE;
+ g_cond_signal (&data->cond);
+ g_mutex_unlock (&data->mutex);
+
+ g_thread_exit (0);
+}
+
void
-gimp_fonts_load (Gimp *gimp)
+gimp_fonts_load_with_status (Gimp *gimp,
+ GimpInitStatusFunc status_callback)
{
FcConfig *config;
gchar *fonts_conf;
@@ -93,13 +124,42 @@ gimp_fonts_load (Gimp *gimp)
gimp_fonts_add_directories (config, path);
g_free (path);
- if (! FcConfigBuildFonts (config))
+ if (status_callback)
{
- FcConfigDestroy (config);
- goto cleanup;
+ gint64 end_time;
+ GThread *cache_thread;
+ GimpFontsLoadFuncData data;
+
+ /* We perform font cache initialization in a separate thread, so
+ * in the case a cache rebuild is to be done it will not block
+ * the UI.
+ */
+ data.config = config;
+ g_mutex_init (&data.mutex);
+ g_cond_init (&data.cond);
+ data.caching_complete = FALSE;
+
+ cache_thread = g_thread_new ("font-cacher",
+ (GThreadFunc) gimp_fonts_load_thread,
+ &data);
+
+ g_mutex_lock (&data.mutex);
+
+ end_time = g_get_monotonic_time () + 0.1 * G_TIME_SPAN_SECOND;
+ while (!data.caching_complete)
+ if (!g_cond_wait_until (&data.cond, &data.mutex, end_time))
+ {
+ status_callback (NULL, NULL, 0.6);
+
+ end_time += 0.1 * G_TIME_SPAN_SECOND;
+ continue;
+ }
+
+ g_mutex_unlock (&data.mutex);
+ g_thread_join (cache_thread);
}
-
- FcConfigSetCurrent (config);
+ else
+ gimp_fonts_load_func (config);
gimp_font_list_restore (GIMP_FONT_LIST (gimp->fonts));
@@ -109,6 +169,12 @@ gimp_fonts_load (Gimp *gimp)
}
void
+gimp_fonts_load (Gimp *gimp)
+{
+ gimp_fonts_load_with_status (gimp, NULL);
+}
+
+void
gimp_fonts_reset (Gimp *gimp)
{
g_return_if_fail (GIMP_IS_GIMP (gimp));
diff --git a/app/text/gimp-fonts.h b/app/text/gimp-fonts.h
index d63352b..0169fc3 100644
--- a/app/text/gimp-fonts.h
+++ b/app/text/gimp-fonts.h
@@ -21,6 +21,8 @@
void gimp_fonts_init (Gimp *gimp);
void gimp_fonts_load (Gimp *gimp);
+void gimp_fonts_load_with_status (Gimp *gimp,
+ GimpInitStatusFunc status_callback);
void gimp_fonts_reset (Gimp *gimp);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]