diff --git a/ChangeLog b/ChangeLog index 80181134a7..097c66ee42 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2006-05-21 Behdad Esfahbod + + * gdk/gdkinternals.h: + * gdk/gdkscreen.c (gdk_screen_class_init), (gdk_screen_finalize), + (update_fontmap_resolution), (gdk_screen_set_resolution): Add new + function _gdk_screen_get_font_map() and have one fontmap per screen, + with the correct resolution set on it. + + * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Use + _gdk_screen_get_font_map() instead of setting resolution on the + PangoCairoContext. (#342529) + 2006-05-22 Tor Lillqvist * gtk/gtkfilesystemwin32.c: Make it compile again. Doesn't work diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 80181134a7..097c66ee42 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +2006-05-21 Behdad Esfahbod + + * gdk/gdkinternals.h: + * gdk/gdkscreen.c (gdk_screen_class_init), (gdk_screen_finalize), + (update_fontmap_resolution), (gdk_screen_set_resolution): Add new + function _gdk_screen_get_font_map() and have one fontmap per screen, + with the correct resolution set on it. + + * gdk/gdkpango.c (gdk_pango_context_get_for_screen): Use + _gdk_screen_get_font_map() instead of setting resolution on the + PangoCairoContext. (#342529) + 2006-05-22 Tor Lillqvist * gtk/gtkfilesystemwin32.c: Make it compile again. Doesn't work diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 1c279f4ec3..20c7d1d2fe 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -29,6 +29,7 @@ #include #include #include +#include #ifndef __GDK_INTERNALS_H__ #define __GDK_INTERNALS_H__ @@ -404,6 +405,10 @@ void _gdk_windowing_gc_get_foreground (GdkGC *gc, void _gdk_windowing_gc_get_background (GdkGC *gc, GdkColor *color); +/* Gets the fontmap for screen */ +PangoFontMap * +_gdk_screen_get_font_map (GdkScreen *screen); + /************************************ * Initialization and exit routines * ************************************/ diff --git a/gdk/gdkpango.c b/gdk/gdkpango.c index 9375a80545..984881aeea 100644 --- a/gdk/gdkpango.c +++ b/gdk/gdkpango.c @@ -1416,20 +1416,16 @@ 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 (); + fontmap = _gdk_screen_get_font_map (screen); context = pango_cairo_font_map_create_context (PANGO_CAIRO_FONT_MAP (fontmap)); options = gdk_screen_get_font_options (screen); pango_cairo_context_set_font_options (context, options); - dpi = gdk_screen_get_resolution (screen); - pango_cairo_context_set_resolution (context, dpi); - return context; } diff --git a/gdk/gdkscreen.c b/gdk/gdkscreen.c index 986f9f5525..000ca5e85b 100644 --- a/gdk/gdkscreen.c +++ b/gdk/gdkscreen.c @@ -25,10 +25,23 @@ #include "gdk.h" /* For gdk_rectangle_intersect() */ #include "gdkcolor.h" #include "gdkwindow.h" +#include "gdkinternals.h" #include "gdkscreen.h" #include "gdkintl.h" #include "gdkalias.h" + +#define GDK_SCREEN_GET_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDK_TYPE_SCREEN, GdkScreenPrivate)) + +typedef struct _GdkScreenPrivate GdkScreenPrivate; + +struct _GdkScreenPrivate +{ + PangoFontMap *fontmap; +}; + + static void gdk_screen_dispose (GObject *object); static void gdk_screen_finalize (GObject *object); static void gdk_screen_set_property (GObject *object, @@ -124,6 +137,8 @@ gdk_screen_class_init (GdkScreenClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + g_type_class_add_private (klass, sizeof (GdkScreenPrivate)); } static void @@ -160,10 +175,14 @@ static void gdk_screen_finalize (GObject *object) { GdkScreen *screen = GDK_SCREEN (object); + GdkScreenPrivate *priv = GDK_SCREEN_GET_PRIVATE (screen); if (screen->font_options) cairo_font_options_destroy (screen->font_options); + if (priv->fontmap) + g_object_unref (priv->fontmap); + G_OBJECT_CLASS (gdk_screen_parent_class)->finalize (object); } @@ -369,6 +388,48 @@ gdk_screen_height_mm (void) return gdk_screen_get_height_mm (gdk_screen_get_default ()); } +static void +update_fontmap_resolution (GdkScreen *screen) +{ + GdkScreenPrivate *priv = GDK_SCREEN_GET_PRIVATE (screen); + double dpi = screen->resolution; + + if (dpi < 0) + dpi = 96.; + + if (priv->fontmap) + pango_cairo_font_map_set_resolution (priv->fontmap, dpi); +} + +/** + * _gdk_screen_get_font_map: + * @screen: a #GdkScreen + * + * Gets the Pango fontmap for this screen that is used to create + * #PangoContext, with the right resolution set on it. + * + * Return value: the fontmap. + * + * Since: 2.10 + **/ +PangoFontMap * +_gdk_screen_get_font_map (GdkScreen *screen) +{ + GdkScreenPrivate *priv; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + priv = GDK_SCREEN_GET_PRIVATE (screen); + + if (G_UNLIKELY (!priv->fontmap)) + { + priv->fontmap = pango_cairo_font_map_new (); + update_fontmap_resolution (screen); + } + + return priv->fontmap; +} + /** * gdk_screen_set_font_options: * @screen: a #GdkScreen @@ -448,6 +509,8 @@ gdk_screen_set_resolution (GdkScreen *screen, { screen->resolution = dpi; + update_fontmap_resolution (screen); + g_object_notify (G_OBJECT (screen), "resolution"); } }