diff options
author | Marco Pesenti Gritti <mpg@redhat.com> | 2007-02-28 11:38:29 (GMT) |
---|---|---|
committer | Marco Pesenti Gritti <mpg@redhat.com> | 2007-02-28 11:38:29 (GMT) |
commit | d47d882bce89b48e5743464e160a480dcc2a6460 (patch) | |
tree | c70de309f892b0890ced003fa75a0b777ab1a48f /lib | |
parent | 7cf6fd2640d5a472f5704e2591279c92e4ef1dfa (diff) |
Port the whole dpi check from mozilla
Diffstat (limited to 'lib')
-rw-r--r-- | lib/src/sugar-utils.c | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/lib/src/sugar-utils.c b/lib/src/sugar-utils.c index f7bf1c5..6cc5946 100644 --- a/lib/src/sugar-utils.c +++ b/lib/src/sugar-utils.c @@ -19,19 +19,71 @@ #include <stdlib.h> #include <gdk/gdkx.h> +#include <gdk/gdkscreen.h> +#include <gtk/gtksettings.h> #include "sugar-utils.h" -gint -sugar_get_screen_dpi(void) +/* Ported from mozilla nsDeviceContextGTK.cpp */ + +static gint +get_gtk_settings_dpi(void) +{ + GtkSettings *settings = gtk_settings_get_default(); + GParamSpec *spec; + gint dpi = 0; + + spec = g_object_class_find_property( + G_OBJECT_GET_CLASS(G_OBJECT(settings)), "gtk-xft-dpi"); + + if (spec) { + g_object_get(G_OBJECT(settings), + "gtk-xft-dpi", &dpi, + NULL); + } + + return (int)(dpi / 1024.0 + 0.5); +} + +static gint +get_xft_dpi(void) { - char *val = XGetDefault (GDK_DISPLAY(), "Xft", "dpi"); + char *val = XGetDefault(GDK_DISPLAY(), "Xft", "dpi"); if (val) { char *e; double d = strtod(val, &e); - if (d > 0.0) - return (int)(d+0.5); + + if (e != val) + return (int)(d + 0.5); + } + + return 0; +} + +static int +get_dpi_from_physical_resolution(void) +{ + float screen_width_in; + + screen_width_in = (float)(gdk_screen_width_mm()) / 25.4f; + + return (int)((float)(gdk_screen_width()) / screen_width_in + 0.5); +} + +gint +sugar_get_screen_dpi(void) +{ + int dpi; + + dpi = get_gtk_settings_dpi(); + + if (dpi == 0) { + dpi = get_xft_dpi(); + } + + if (dpi == 0) { + dpi = get_dpi_from_physical_resolution(); } - return 96; + return dpi; } |