Fix for #314004, reported by Michael Reinsch:

2005-08-23  Owen Taylor  <otaylor@redhat.com>

        Fix for #314004, reported by Michael Reinsch:

        * gdk/gdk.symbols:
        * gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
        Add gdk_screen_get/set_resolution_libgtk_only()

        * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
        the options for the screen on the newly created context.

        * gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c:
        Move font options and dpi code from gtkwidget.c to gtksettings.c, set
        the font options on the screen.

        * gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
        the font options from the screen and set them on the context.
This commit is contained in:
Owen Taylor 2005-08-24 03:29:06 +00:00 committed by Matthias Clasen
parent 39169b6fd6
commit 2b1bea02f2
9 changed files with 331 additions and 88 deletions

View File

@ -1,3 +1,21 @@
2005-08-23 Owen Taylor <otaylor@redhat.com>
Fix for #314004, reported by Michael Reinsch:
* gdk/gdk.symbols:
* gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
Add gdk_screen_get/set_resolution_libgtk_only()
* gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
the options for the screen on the newly created context.
* gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c:
Move font options and dpi code from gtkwidget.c to gtksettings.c, set
the font options on the screen.
* gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
the font options from the screen and set them on the context.
2005-08-23 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't

View File

@ -1,3 +1,21 @@
2005-08-23 Owen Taylor <otaylor@redhat.com>
Fix for #314004, reported by Michael Reinsch:
* gdk/gdk.symbols:
* gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
Add gdk_screen_get/set_resolution_libgtk_only()
* gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
the options for the screen on the newly created context.
* gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c:
Move font options and dpi code from gtkwidget.c to gtksettings.c, set
the font options on the screen.
* gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
the font options from the screen and set them on the context.
2005-08-23 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't

View File

@ -1,3 +1,21 @@
2005-08-23 Owen Taylor <otaylor@redhat.com>
Fix for #314004, reported by Michael Reinsch:
* gdk/gdk.symbols:
* gdk/gdkscreen.[ch]: Add gdk_screen_get/set_font_options_libgtk_only()
Add gdk_screen_get/set_resolution_libgtk_only()
* gdk/gdkpango.c (gdk_pango_context_get_for_screen): Set
the options for the screen on the newly created context.
* gtk/gtksettings.c (settings_update_font_options/dpi) gtkwidget.c:
Move font options and dpi code from gtkwidget.c to gtksettings.c, set
the font options on the screen.
* gtk/gtkwidget.c (gtk_widget_update_pango_context): Just get
the font options from the screen and set them on the context.
2005-08-23 Kristian Rietveld <kris@gtk.org>
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_inserted): don't

View File

@ -962,6 +962,10 @@ gdk_draw_rgb_image_dithalign
gdk_screen_get_type G_GNUC_CONST
gdk_screen_get_monitor_at_point
gdk_screen_get_monitor_at_window
gdk_screen_set_font_options_libgtk_only
gdk_screen_get_font_options_libgtk_only
gdk_screen_set_resolution_libgtk_only
gdk_screen_get_resolution_libgtk_only
#endif
#endif

View File

@ -1333,6 +1333,12 @@ gdk_pango_layout_get_clip_region (PangoLayout *layout,
* instead of this function, to get the appropriate context for
* the widget you intend to render text onto.
*
* The newly created context will have the default font options (see
* #cairo_font_options_t) for the default screen; if these options
* change it will not be updated. Using gtk_widget_get_pango_context()
* is more convenient if you want to keep a context around and track
* changes to the screen's font rendering settings.
*
* Return value: a new #PangoContext for the default display
**/
PangoContext *
@ -1353,6 +1359,12 @@ gdk_pango_context_get (void)
* instead of this function, to get the appropriate context for
* the widget you intend to render text onto.
*
* The newly created context will have the default font options
* (see #cairo_font_options_t) for the screen; if these options
* change it will not be updated. Using gtk_widget_get_pango_context()
* is more convenient if you want to keep a context around and track
* changes to the screen's font rendering settings.
*
* Return value: a new #PangoContext for @screen
*
* Since: 2.2
@ -1361,12 +1373,23 @@ PangoContext *
gdk_pango_context_get_for_screen (GdkScreen *screen)
{
PangoFontMap *fontmap;
PangoContext *context;
const cairo_font_options_t *options;
double dpi;
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
fontmap = pango_cairo_font_map_get_default ();
return pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap));
options = gdk_screen_get_font_options_libgtk_only (screen);
pango_cairo_context_set_font_options (context, options);
dpi = gdk_screen_get_resolution_libgtk_only (screen);
pango_cairo_context_set_resolution (context, dpi);
return context;
}
#define __GDK_PANGO_C__

View File

@ -29,7 +29,9 @@
#include "gdkalias.h"
static void gdk_screen_class_init (GdkScreenClass *klass);
static void gdk_screen_init (GdkScreen *screen);
static void gdk_screen_dispose (GObject *object);
static void gdk_screen_finalize (GObject *object);
enum
{
@ -51,7 +53,7 @@ gdk_screen_get_type (void)
static const GTypeInfo object_info =
{
sizeof (GdkScreenClass),
(GBaseInitFunc) NULL,
(GBaseInitFunc) gdk_screen_init,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gdk_screen_class_init,
NULL, /* class_finalize */
@ -76,6 +78,7 @@ gdk_screen_class_init (GdkScreenClass *klass)
parent_class = g_type_class_peek_parent (klass);
object_class->dispose = gdk_screen_dispose;
object_class->finalize = gdk_screen_finalize;
/**
* GdkScreen::size-changed:
@ -97,6 +100,12 @@ gdk_screen_class_init (GdkScreenClass *klass)
0);
}
static void
gdk_screen_init (GdkScreen *screen)
{
screen->resolution = -1;
}
static void
gdk_screen_dispose (GObject *object)
{
@ -115,6 +124,17 @@ gdk_screen_dispose (GObject *object)
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
gdk_screen_finalize (GObject *object)
{
GdkScreen *screen = GDK_SCREEN (object);
if (screen->font_options)
cairo_font_options_destroy (screen->font_options);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
void
_gdk_screen_close (GdkScreen *screen)
{
@ -317,5 +337,96 @@ gdk_screen_height_mm (void)
return gdk_screen_get_height_mm (gdk_screen_get_default ());
}
/**
* gdk_screen_set_font_options_libgtk_only:
* @screen: a #GdkScreen
* @options: a #cairo_font_options_t, or %NULL to unset any
* previously set default font options.
*
* Sets the default font options for the screen. These
* options will be set on any #PangoContext's newly created
* with gdk_pango_context_get_for_screen(). Changing the
* default set of font options does not affect contexts that
* have already been created.
*
* This function is not part of the GDK public API and is only
* for use by GTK+.
**/
void
gdk_screen_set_font_options_libgtk_only (GdkScreen *screen,
const cairo_font_options_t *options)
{
g_return_if_fail (GDK_IS_SCREEN (screen));
if (screen->font_options)
cairo_font_options_destroy (screen->font_options);
if (options)
screen->font_options = cairo_font_options_copy (options);
else
screen->font_options = NULL;
}
/**
* gdk_screen_get_font_options_libgtk_only:
* @screen: a #GdkScreen
*
* Gets any options previously set with gdk_screen_set_font_options_libgtk_only().
*
* Return value: the current font options, or %NULL if no default
* font options have been set.
**/
const cairo_font_options_t *
gdk_screen_get_font_options_libgtk_only (GdkScreen *screen)
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
return screen->font_options;
}
/**
* gdk_screen_set_resolution_libgtk_only:
* @screen: a #GdkScreen
* @dpi: the resolution in "dots per inch". (Physical inches aren't actually
* involved; the terminology is conventional.)
* Sets the resolution for font handling on the screen. This is a
* scale factor between points specified in a #PangoFontDescription
* and cairo units. The default value is 96, meaning that a 10 point
* font will be 13 units high. (10 * 96. / 72. = 13.3).
*
* This function is not part of the GDK public API and is only
* for use by GTK+.
**/
void
gdk_screen_set_resolution_libgtk_only (GdkScreen *screen,
gdouble dpi)
{
g_return_if_fail (GDK_IS_SCREEN (screen));
if (dpi >= 0)
screen->resolution = dpi;
else
screen->resolution = -1;
}
/**
* gdk_screen_get_resolution_libgtk_only:
* @screen: a #GdkScreen
*
* Gets the resolution for font handling on the screen; see
* gdk_screen_set_resolution_libgtk_only() for full details.
*
* Return value: the current resolution, or -1 if no resolution
* has been set.
**/
gdouble
gdk_screen_get_resolution_libgtk_only (GdkScreen *screen)
{
g_return_val_if_fail (GDK_IS_SCREEN (screen), -1);
return screen->resolution;
}
#define __GDK_SCREEN_C__
#include "gdkaliasdef.c"

View File

@ -24,6 +24,7 @@
#ifndef __GDK_SCREEN_H__
#define __GDK_SCREEN_H__
#include <cairo.h>
#include "gdk/gdktypes.h"
#include "gdk/gdkdisplay.h"
@ -46,6 +47,9 @@ struct _GdkScreen
GdkGC *normal_gcs[32];
GdkGC *exposure_gcs[32];
cairo_font_options_t *font_options;
double resolution; /* pixels/points scale factor for fonts */
};
struct _GdkScreenClass
@ -98,6 +102,14 @@ gboolean gdk_screen_get_setting (GdkScreen *screen,
const gchar *name,
GValue *value);
void gdk_screen_set_font_options_libgtk_only (GdkScreen *screen,
const cairo_font_options_t *options);
const cairo_font_options_t *gdk_screen_get_font_options_libgtk_only (GdkScreen *screen);
void gdk_screen_set_resolution_libgtk_only (GdkScreen *screen,
gdouble dpi);
gdouble gdk_screen_get_resolution_libgtk_only (GdkScreen *screen);
G_END_DECLS
#endif /* __GDK_SCREEN_H__ */

View File

@ -17,6 +17,9 @@
*/
#include <config.h>
#include <string.h>
#include "gtkmodules.h"
#include "gtksettings.h"
#include "gtkrc.h"
@ -100,6 +103,8 @@ static void settings_update_modules (GtkSettings *setting
#ifdef GDK_WINDOWING_X11
static void settings_update_cursor_theme (GtkSettings *settings);
static void settings_update_resolution (GtkSettings *settings);
static void settings_update_font_options (GtkSettings *settings);
#endif
@ -553,16 +558,20 @@ gtk_settings_notify (GObject *object,
break;
#ifdef GDK_WINDOWING_X11
case PROP_XFT_DPI:
case PROP_XFT_ANTIALIAS:
case PROP_XFT_HINTING:
case PROP_XFT_HINTSTYLE:
case PROP_XFT_RGBA:
settings_update_resolution (settings);
/* This is a hack because with gtk_rc_reset_styles() doesn't get
* widgets with gtk_widget_style_set(), and also causes more
* recomputation than necessary.
*/
gtk_rc_reset_styles (GTK_SETTINGS (object));
break;
case PROP_XFT_ANTIALIAS:
case PROP_XFT_HINTING:
case PROP_XFT_HINTSTYLE:
case PROP_XFT_RGBA:
settings_update_font_options (settings);
gtk_rc_reset_styles (GTK_SETTINGS (object));
break;
case PROP_CURSOR_THEME_NAME:
case PROP_CURSOR_THEME_SIZE:
settings_update_cursor_theme (settings);
@ -1358,6 +1367,104 @@ settings_update_cursor_theme (GtkSettings *settings)
gdk_x11_display_set_cursor_theme (display, theme, size);
}
static void
settings_update_font_options (GtkSettings *settings)
{
gint hinting;
gchar *hint_style_str;
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_DEFAULT;
gint antialias;
cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_DEFAULT;
gchar *rgba_str;
cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
gint dpi_int;
double dpi;
cairo_font_options_t *options;
g_object_get (settings,
"gtk-xft-antialias", &antialias,
"gtk-xft-hinting", &hinting,
"gtk-xft-hintstyle", &hint_style_str,
"gtk-xft-rgba", &rgba_str,
"gtk-xft-dpi", &dpi_int,
NULL);
if (dpi_int > 0)
dpi = dpi_int / 1024.;
else
dpi = -1.;
options = cairo_font_options_create ();
if (hinting >= 0 && !hinting)
{
hint_style = CAIRO_HINT_STYLE_NONE;
}
else if (hint_style_str)
{
if (strcmp (hint_style_str, "hintnone") == 0)
hint_style = CAIRO_HINT_STYLE_NONE;
else if (strcmp (hint_style_str, "hintslight") == 0)
hint_style = CAIRO_HINT_STYLE_SLIGHT;
else if (strcmp (hint_style_str, "hintmedium") == 0)
hint_style = CAIRO_HINT_STYLE_MEDIUM;
else if (strcmp (hint_style_str, "hintfull") == 0)
hint_style = CAIRO_HINT_STYLE_FULL;
}
if (hint_style_str)
g_free (hint_style_str);
cairo_font_options_set_hint_style (options, hint_style);
if (rgba_str)
{
if (strcmp (rgba_str, "rgb") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
else if (strcmp (rgba_str, "bgr") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
else if (strcmp (rgba_str, "vrgb") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
else if (strcmp (rgba_str, "vbgr") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
g_free (rgba_str);
}
cairo_font_options_set_subpixel_order (options, subpixel_order);
if (antialias >= 0 && !antialias)
antialias_mode = CAIRO_ANTIALIAS_NONE;
else if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT)
antialias_mode = CAIRO_ANTIALIAS_SUBPIXEL;
else if (antialias >= 0)
antialias_mode = CAIRO_ANTIALIAS_GRAY;
cairo_font_options_set_antialias (options, antialias_mode);
gdk_screen_set_font_options_libgtk_only (settings->screen, options);
cairo_font_options_destroy (options);
}
static void
settings_update_resolution (GtkSettings *settings)
{
gint dpi_int;
double dpi;
g_object_get (settings,
"gtk-xft-dpi", &dpi_int,
NULL);
if (dpi_int > 0)
dpi = dpi_int / 1024.;
else
dpi = -1.;
gdk_screen_set_resolution_libgtk_only (settings->screen, dpi);
}
#endif
#define __GTK_SETTINGS_C__

View File

@ -5197,91 +5197,10 @@ static void
update_pango_context (GtkWidget *widget,
PangoContext *context)
{
#ifdef GDK_WINDOWING_X11
GtkSettings *settings;
gint hinting;
gchar *hint_style_str;
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_DEFAULT;
gint antialias;
cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_DEFAULT;
gchar *rgba_str;
cairo_subpixel_order_t subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT;
gint dpi;
cairo_font_options_t *options;
#endif
pango_context_set_font_description (context, widget->style->font_desc);
pango_context_set_base_dir (context,
gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR ?
PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL);
#ifdef GDK_WINDOWING_X11
settings = gtk_widget_get_settings (widget);
g_object_get (settings,
"gtk-xft-antialias", &antialias,
"gtk-xft-hinting", &hinting,
"gtk-xft-hintstyle", &hint_style_str,
"gtk-xft-rgba", &rgba_str,
"gtk-xft-dpi", &dpi,
NULL);
if (dpi > 0)
pango_cairo_context_set_resolution (context, dpi / 1024.);
else
pango_cairo_context_set_resolution (context, -1.);
options = cairo_font_options_create ();
if (hinting >= 0 && !hinting)
{
hint_style = CAIRO_HINT_STYLE_NONE;
}
else if (hint_style_str)
{
if (strcmp (hint_style_str, "hintnone") == 0)
hint_style = CAIRO_HINT_STYLE_NONE;
else if (strcmp (hint_style_str, "hintslight") == 0)
hint_style = CAIRO_HINT_STYLE_SLIGHT;
else if (strcmp (hint_style_str, "hintmedium") == 0)
hint_style = CAIRO_HINT_STYLE_MEDIUM;
else if (strcmp (hint_style_str, "hintfull") == 0)
hint_style = CAIRO_HINT_STYLE_FULL;
}
if (hint_style_str)
g_free (hint_style_str);
cairo_font_options_set_hint_style (options, hint_style);
if (rgba_str)
{
if (strcmp (rgba_str, "rgb") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB;
else if (strcmp (rgba_str, "bgr") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR;
else if (strcmp (rgba_str, "vrgb") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB;
else if (strcmp (rgba_str, "vbgr") == 0)
subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR;
g_free (rgba_str);
}
cairo_font_options_set_subpixel_order (options, subpixel_order);
if (antialias >= 0 && !antialias)
antialias_mode = CAIRO_ANTIALIAS_NONE;
else if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT)
antialias_mode = CAIRO_ANTIALIAS_SUBPIXEL;
else if (antialias >= 0)
antialias_mode = CAIRO_ANTIALIAS_GRAY;
cairo_font_options_set_antialias (options, antialias_mode);
pango_cairo_context_set_font_options (context, options);
cairo_font_options_destroy (options);
#endif
}
static void
@ -5290,7 +5209,20 @@ gtk_widget_update_pango_context (GtkWidget *widget)
PangoContext *context = gtk_widget_peek_pango_context (widget);
if (context)
update_pango_context (widget, context);
{
GdkScreen *screen;
update_pango_context (widget, context);
screen = gtk_widget_get_screen_unchecked (widget);
if (screen)
{
pango_cairo_context_set_resolution (context,
gdk_screen_get_resolution_libgtk_only (screen));
pango_cairo_context_set_font_options (context,
gdk_screen_get_font_options_libgtk_only (screen));
}
}
}
/**