Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMarco 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)
commitd47d882bce89b48e5743464e160a480dcc2a6460 (patch)
treec70de309f892b0890ced003fa75a0b777ab1a48f /lib
parent7cf6fd2640d5a472f5704e2591279c92e4ef1dfa (diff)
Port the whole dpi check from mozilla
Diffstat (limited to 'lib')
-rw-r--r--lib/src/sugar-utils.c64
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;
}