[evolution] Bug #573263 - Crash in reset_layout (text) at e-text.c



commit ba0128107cd7cd4edc98b379ebc6b35cccf6dc0b
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jun 9 13:10:06 2009 +0200

    Bug #573263 - Crash in reset_layout (text) at e-text.c
---
 e-util/e-util.c |  119 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 70 insertions(+), 49 deletions(-)

diff --git a/e-util/e-util.c b/e-util/e-util.c
index 160e858..2451e15 100644
--- a/e-util/e-util.c
+++ b/e-util/e-util.c
@@ -1134,64 +1134,85 @@ e_strdup_append_strings (gchar *first_string, ...)
 	return buffer;
 }
 
+/* font options cache */
+static gchar *fo_antialiasing = NULL, *fo_hinting = NULL, *fo_subpixel_order = NULL;
+static GStaticMutex fo_lock = G_STATIC_MUTEX_INIT;
+
+static void
+fo_option_changed (GConfClient *client, guint cnxn_id, GConfEntry *entry, gpointer user_data)
+{
+	#define update_value(key,variable)	\
+		g_free (variable);		\
+		variable = gconf_client_get_string (client, "/desktop/gnome/font_rendering/" key, NULL);
+
+	g_static_mutex_lock (&fo_lock);
+	update_value ("antialiasing", fo_antialiasing);
+	update_value ("hinting", fo_hinting);
+	update_value ("rgba_order", fo_subpixel_order);
+	g_static_mutex_unlock (&fo_lock);
+
+	#undef update_value
+}
+
 cairo_font_options_t *
 get_font_options (void)
 {
-	gchar *antialiasing, *hinting, *subpixel_order;
-	GConfClient *gconf = gconf_client_get_default ();
+	static GConfClient *fo_gconf = NULL;
 	cairo_font_options_t *font_options = cairo_font_options_create ();
 
+	if (fo_gconf == NULL) {
+		fo_gconf = gconf_client_get_default ();
+
+		gconf_client_add_dir (fo_gconf, "/desktop/gnome/font_rendering", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
+		gconf_client_notify_add (fo_gconf, "/desktop/gnome/font_rendering/antialiasing", fo_option_changed, NULL, NULL, NULL);
+		gconf_client_notify_add (fo_gconf, "/desktop/gnome/font_rendering/hinting", fo_option_changed, NULL, NULL, NULL);
+		gconf_client_notify_add (fo_gconf, "/desktop/gnome/font_rendering/rgba_order", fo_option_changed, NULL, NULL, NULL);
+
+		fo_option_changed (fo_gconf, 0, NULL, NULL);
+	}
+	
+	g_static_mutex_lock (&fo_lock);
+
 	/* Antialiasing */
-	antialiasing = gconf_client_get_string (gconf,
-			"/desktop/gnome/font_rendering/antialiasing", NULL);
-	if (antialiasing == NULL)
+	if (fo_antialiasing == NULL)
 		cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_DEFAULT);
-	else {
-		if (strcmp (antialiasing, "grayscale") == 0)
-			cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_GRAY);
-		else if (strcmp (antialiasing, "rgba") == 0)
-			cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_SUBPIXEL);
-		else if (strcmp (antialiasing, "none") == 0)
-			cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_NONE);
-		else
-			cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_DEFAULT);
-	}
-	hinting = gconf_client_get_string (gconf,
-			"/desktop/gnome/font_rendering/hinting", NULL);
-	if (hinting == NULL)
+	else if (strcmp (fo_antialiasing, "grayscale") == 0)
+		cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_GRAY);
+	else if (strcmp (fo_antialiasing, "rgba") == 0)
+		cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_SUBPIXEL);
+	else if (strcmp (fo_antialiasing, "none") == 0)
+		cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_NONE);
+	else
+		cairo_font_options_set_antialias (font_options, CAIRO_ANTIALIAS_DEFAULT);
+
+	if (fo_hinting == NULL)
 		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_DEFAULT);
-	else {
-		if (strcmp (hinting, "full") == 0)
-			cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_FULL);
-		else if (strcmp (hinting, "medium") == 0)
-			cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_MEDIUM);
-		else if (strcmp (hinting, "slight") == 0)
-			cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_SLIGHT);
-		else if (strcmp (hinting, "none") == 0)
-			cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
-		else
-			cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_DEFAULT);
-	}
-	subpixel_order = gconf_client_get_string (gconf,
-			"/desktop/gnome/font_rendering/rgba_order", NULL);
-	if (subpixel_order == NULL)
+	else if (strcmp (fo_hinting, "full") == 0)
+		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_FULL);
+	else if (strcmp (fo_hinting, "medium") == 0)
+		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_MEDIUM);
+	else if (strcmp (fo_hinting, "slight") == 0)
+		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_SLIGHT);
+	else if (strcmp (fo_hinting, "none") == 0)
+		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_NONE);
+	else
+		cairo_font_options_set_hint_style (font_options, CAIRO_HINT_STYLE_DEFAULT);
+
+	if (fo_subpixel_order == NULL)
 		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_DEFAULT);
-	else {
-		if (strcmp (subpixel_order, "rgb") == 0)
-			cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_RGB);
-		else if (strcmp (subpixel_order, "bgr") == 0)
-			cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_BGR);
-		else if (strcmp (subpixel_order, "vrgb") == 0)
-			cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VRGB);
-		else if (strcmp (subpixel_order, "vbgr") == 0)
-			cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VBGR);
-		else
-			cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_DEFAULT);
-	}
-	g_free (antialiasing);
-	g_free (hinting);
-	g_free (subpixel_order);
-	g_object_unref (gconf);
+	else if (strcmp (fo_subpixel_order, "rgb") == 0)
+		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_RGB);
+	else if (strcmp (fo_subpixel_order, "bgr") == 0)
+		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_BGR);
+	else if (strcmp (fo_subpixel_order, "vrgb") == 0)
+		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VRGB);
+	else if (strcmp (fo_subpixel_order, "vbgr") == 0)
+		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_VBGR);
+	else
+		cairo_font_options_set_subpixel_order (font_options, CAIRO_SUBPIXEL_ORDER_DEFAULT);
+
+	g_static_mutex_unlock (&fo_lock);
+
 	return font_options;
 }
 



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