Sisyphus repositório
Última atualização: 1 outubro 2023 | SRPMs: 18631 | Visitas: 37918405
en ru br
ALT Linux repositórios
S:1.26.1-alt2

Group :: Graphical desktop/MATE
RPM: mate-control-center

 Main   Changelog   Spec   Patches   Sources   Download   Gear   Bugs e FR  Repocop 

Patch: mate-control-center_fv-font-model-actually-cancel-the-thread-when-rebuilding-font-list.patch
Download


diff -upr mate-control-center/font-viewer/font-model.c mate-control-center-test/font-viewer/font-model.c
--- mate-control-center/font-viewer/font-model.c	2015-08-30 12:49:57.333623654 +0200
+++ mate-control-center-test/font-viewer/font-model.c	2015-08-30 12:46:49.618704000 +0200
@@ -45,6 +45,7 @@
 struct _FontViewModelPrivate {
     /* list of fonts in fontconfig database */
     FcFontSet *font_list;
+    GMutex font_list_mutex;
 
     FT_Library library;
 
@@ -356,13 +357,15 @@ load_font_infos (GIOSchedulerJob *job,
 {
     FontViewModel *self = user_data;
     LoadFontInfosData *data;
-    gint i;
+    gint i, n_fonts;
     GList *font_infos = NULL;
 
     if (g_cancellable_is_cancelled (cancellable))
         return FALSE;
 
-    for (i = 0; i < self->priv->font_list->nfont; i++) {
+    n_fonts = self->priv->font_list->nfont;
+
+    for (i = 0; i < n_fonts; i++) {
         FontInfoData *font_info;
         FcChar8 *file;
         gchar *font_name;
@@ -370,7 +373,10 @@ load_font_infos (GIOSchedulerJob *job,
         if (g_cancellable_is_cancelled (cancellable))
             break;
 
-	FcPatternGetString (self->priv->font_list->fonts[i], FC_FILE, 0, &file);
+        g_mutex_lock (&self->priv->font_list_mutex);
+        FcPatternGetString (self->priv->font_list->fonts[i], FC_FILE, 0, &file);
+        g_mutex_unlock (&self->priv->font_list_mutex);
+
         font_name = font_utils_get_font_name_for_file (self->priv->library, (const gchar *) file);
 
         if (!font_name)
@@ -403,10 +409,9 @@ ensure_font_list (FontViewModel *self)
     FcPattern *pat;
     FcObjectSet *os;
 
-    if (self->priv->font_list) {
-        FcFontSetDestroy (self->priv->font_list);
-        self->priv->font_list = NULL;
-    }
+    /* always reinitialize the font database */
+    if (!FcInitReinitialize())
+        return;
 
     if (self->priv->cancellable) {
         g_cancellable_cancel (self->priv->cancellable);
@@ -415,21 +420,27 @@ ensure_font_list (FontViewModel *self)
 
     gtk_list_store_clear (GTK_LIST_STORE (self));
 
-    /* always reinitialize the font database */
-    if (!FcInitReinitialize())
-        return;
-
     pat = FcPatternCreate ();
     os = FcObjectSetBuild (FC_FILE, FC_FAMILY, FC_WEIGHT, FC_SLANT, NULL);
 
+    g_mutex_lock (&self->priv->font_list_mutex);
+
+    if (self->priv->font_list) {
+        FcFontSetDestroy (self->priv->font_list);
+        self->priv->font_list = NULL;
+    }
+
     self->priv->font_list = FcFontList (NULL, pat, os);
 
+    g_mutex_unlock (&self->priv->font_list_mutex);
+
     FcPatternDestroy (pat);
     FcObjectSetDestroy (os);
 
     if (!self->priv->font_list)
         return;
 
+    self->priv->cancellable = g_cancellable_new ();
     g_io_scheduler_push_job (load_font_infos, self, NULL,
                              G_PRIORITY_DEFAULT, self->priv->cancellable);
 }
@@ -547,6 +558,8 @@ font_view_model_init (FontViewModel *sel
     if (FT_Init_FreeType (&self->priv->library) != FT_Err_Ok)
         g_critical ("Can't initialize FreeType library");
 
+    g_mutex_init (&self->priv->font_list_mutex);
+
     gtk_list_store_set_column_types (GTK_LIST_STORE (self),
                                      NUM_COLUMNS, types);
 
@@ -576,8 +589,8 @@ font_view_model_finalize (GObject *obj)
     }
 
     if (self->priv->font_list) {
-            FcFontSetDestroy (self->priv->font_list);
-            self->priv->font_list = NULL;
+        FcFontSetDestroy (self->priv->font_list);
+        self->priv->font_list = NULL;
     }
 
     if (self->priv->library != NULL) {
@@ -585,6 +598,7 @@ font_view_model_finalize (GObject *obj)
         self->priv->library = NULL;
     }
 
+    g_mutex_clear (&self->priv->font_list_mutex);
     g_clear_object (&self->priv->fallback_icon);
     g_list_free_full (self->priv->monitors, (GDestroyNotify) g_object_unref);
 
 
projeto & código: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
mantenedor atual: Michael Shigorin
mantenedor da tradução: Fernando Martini aka fmartini © 2009