#include "font.h"
#include "ftfont.h"
#include "pdumper.h"
+#ifdef HAVE_PGTK
+#include "xsettings.h"
+#endif
#ifdef USE_BE_CAIRO
#define RED_FROM_ULONG(color) (((color) >> 16) & 0xff)
cairo_matrix_t font_matrix, ctm;
cairo_matrix_init_scale (&font_matrix, pixel_size, pixel_size);
cairo_matrix_init_identity (&ctm);
+
+#ifdef HAVE_PGTK
+ cairo_font_options_t *options = xsettings_get_font_options ();
+#else
cairo_font_options_t *options = cairo_font_options_create ();
+#endif
#ifdef USE_BE_CAIRO
if (be_use_subpixel_antialiasing ())
cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_SUBPIXEL);
return len;
}
+#ifdef HAVE_PGTK
+/* Determine if FONT_OBJECT is a valid cached font for ENTITY by
+ comparing the options used to open it with the user's current
+ preferences specified via GSettings. */
+static bool
+ftcrfont_cached_font_ok (struct frame *f, Lisp_Object font_object,
+ Lisp_Object entity)
+{
+ struct font_info *info = (struct font_info *) XFONT_OBJECT (font_object);
+
+ cairo_font_options_t *options = cairo_font_options_create ();
+ cairo_scaled_font_get_font_options (info->cr_scaled_font, options);
+ cairo_font_options_t *gsettings_options = xsettings_get_font_options ();
+
+ bool equal = cairo_font_options_equal (options, gsettings_options);
+ cairo_font_options_destroy (options);
+ cairo_font_options_destroy (gsettings_options);
+
+ return equal;
+}
+#endif
+
#ifdef HAVE_HARFBUZZ
static Lisp_Object
#endif
.filter_properties = ftfont_filter_properties,
.combining_capability = ftfont_combining_capability,
+#ifdef HAVE_PGTK
+ .cached_font_ok = ftcrfont_cached_font_ok
+#endif
};
#ifdef HAVE_HARFBUZZ
struct font_driver ftcrhbfont_driver;
#define GSETTINGS_FONT_NAME "font-name"
#endif
+#ifdef HAVE_PGTK
+#define GSETTINGS_FONT_ANTIALIASING "font-antialiasing"
+#define GSETTINGS_FONT_RGBA_ORDER "font-rgba-order"
+#define GSETTINGS_FONT_HINTING "font-hinting"
+#endif
/* The single GSettings instance, or NULL if not connected to GSettings. */
static GSettings *gsettings_client;
+#ifdef HAVE_PGTK
+
+/* The cairo font_options as obtained using gsettings. */
+static cairo_font_options_t *font_options;
+
+/* Store an event for re-rendering of the fonts. */
+static void
+store_font_options_changed (void)
+{
+ if (dpyinfo_valid (first_dpyinfo))
+ store_config_changed_event (Qfont_render,
+ XCAR (first_dpyinfo->name_list_element));
+}
+
+/* Apply changes in the hinting system setting. */
+static void
+apply_gsettings_font_hinting (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings, GSETTINGS_FONT_HINTING);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *hinting = g_variant_get_string (val, NULL);
+
+ if (!strcmp (hinting, "full"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_FULL);
+ else if (!strcmp (hinting, "medium"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_MEDIUM);
+ else if (!strcmp (hinting, "slight"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_SLIGHT);
+ else if (!strcmp (hinting, "none"))
+ cairo_font_options_set_hint_style (font_options,
+ CAIRO_HINT_STYLE_NONE);
+ }
+ g_variant_unref (val);
+ }
+}
+
+/* Apply changes in the antialiasing system setting. */
+static void
+apply_gsettings_font_antialias (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings, GSETTINGS_FONT_ANTIALIASING);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *antialias = g_variant_get_string (val, NULL);
+
+ if (!strcmp (antialias, "none"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_NONE);
+ else if (!strcmp (antialias, "grayscale"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_GRAY);
+ else if (!strcmp (antialias, "rgba"))
+ cairo_font_options_set_antialias (font_options,
+ CAIRO_ANTIALIAS_SUBPIXEL);
+ }
+ g_variant_unref (val);
+ }
+}
+
+/* Apply the settings for the rgb element ordering. */
+static void
+apply_gsettings_font_rgba_order (GSettings *settings)
+{
+ GVariant *val = g_settings_get_value (settings,
+ GSETTINGS_FONT_RGBA_ORDER);
+ if (val)
+ {
+ g_variant_ref_sink (val);
+ if (g_variant_is_of_type (val, G_VARIANT_TYPE_STRING))
+ {
+ const char *rgba_order = g_variant_get_string (val, NULL);
+
+ if (!strcmp (rgba_order, "rgb"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_RGB);
+ else if (!strcmp (rgba_order, "bgr"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_BGR);
+ else if (!strcmp (rgba_order, "vrgb"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_VRGB);
+ else if (!strcmp (rgba_order, "vbgr"))
+ cairo_font_options_set_subpixel_order (font_options,
+ CAIRO_SUBPIXEL_ORDER_VBGR);
+ }
+ g_variant_unref (val);
+ }
+}
+#endif /* HAVE_PGTK */
+
/* Callback called when something changed in GSettings. */
static void
}
}
#endif /* USE_CAIRO || HAVE_XFT */
+#ifdef HAVE_PGTK
+ else if (!strcmp (key, GSETTINGS_FONT_ANTIALIASING))
+ {
+ apply_gsettings_font_antialias (settings);
+ store_font_options_changed ();
+ }
+ else if (!strcmp (key, GSETTINGS_FONT_HINTING))
+ {
+ apply_gsettings_font_hinting (settings);
+ store_font_options_changed ();
+ }
+ else if (!strcmp (key, GSETTINGS_FONT_RGBA_ORDER))
+ {
+ apply_gsettings_font_rgba_order (settings);
+ store_font_options_changed ();
+ }
+#endif /* HAVE_PGTK */
}
#endif /* HAVE_GSETTINGS */
dupstring (¤t_font, g_variant_get_string (val, NULL));
g_variant_unref (val);
}
+
+ /* Only use the gsettings font entries for the Cairo backend
+ running on PGTK. */
+#ifdef HAVE_PGTK
+ font_options = cairo_font_options_create ();
+ apply_gsettings_font_antialias (gsettings_client);
+ apply_gsettings_font_hinting (gsettings_client);
+ apply_gsettings_font_rgba_order (gsettings_client);
+#endif /* HAVE_PGTK */
+
#endif /* USE_CAIRO || HAVE_XFT */
#endif /* HAVE_GSETTINGS */
}
#endif
+#ifdef HAVE_PGTK
+/* Return the cairo font options, updated from the gsettings font
+ config entries. The caller should call cairo_font_options_destroy
+ on the result. */
+cairo_font_options_t *
+xsettings_get_font_options (void)
+{
+ return cairo_font_options_copy (font_options);
+}
+#endif
+
DEFUN ("font-get-system-normal-font", Ffont_get_system_normal_font,
Sfont_get_system_normal_font,
0, 0, 0,
gconf_client = NULL;
PDUMPER_IGNORE (gconf_client);
#endif
+#ifdef HAVE_PGTK
+ font_options = NULL;
+ PDUMPER_IGNORE (font_options);
+#endif
DEFSYM (Qmonospace_font_name, "monospace-font-name");
DEFSYM (Qfont_name, "font-name");