summaryrefslogtreecommitdiff
path: root/gdk/gdkscreen.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@gnome.org>2006-05-22 04:04:51 +0000
committerBehdad Esfahbod <behdad@src.gnome.org>2006-05-22 04:04:51 +0000
commitf3b986724c3174fd48e14376b908d7b302a86095 (patch)
tree885706920edf8bbdbc4db2e454c0c00aeb3b3cf9 /gdk/gdkscreen.c
parent3023c03a360c1b3f92800dae2d66dbfae0fa277a (diff)
downloadgtk+-f3b986724c3174fd48e14376b908d7b302a86095.tar.gz
Add new function _gdk_screen_get_font_map() and have one fontmap per
2006-05-21 Behdad Esfahbod <behdad@gnome.org> * 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)
Diffstat (limited to 'gdk/gdkscreen.c')
-rw-r--r--gdk/gdkscreen.c63
1 files changed, 63 insertions, 0 deletions
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");
}
}