summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Sanchez Prada <mario@endlessm.com>2015-02-21 20:09:23 +0000
committerMario Sanchez Prada <mario@endlessm.com>2015-02-25 11:37:45 +0000
commit14a5099d017d5270041b7fe7effa66b8c400c4d9 (patch)
tree30d96295dea5b8ec615d5207dc476621526e4798
parent3b9364324d8545b3bce91f83bd55b10b1b5e3c2e (diff)
downloadyelp-14a5099d017d5270041b7fe7effa66b8c400c4d9.tar.gz
Use GtkSettings 'gtk-xft-dpi' property to keep track of Xft DPI changes
Use that property to find the DPI resolution for font handling, in order to calculate the effective font size value that needs to be passed to WebKitSettings when setting the default values. Also, connect to notify::gtk-xft-dpi so that we can update the font size whenever the DPI value changes, and not just on startup. https://bugzilla.gnome.org/show_bug.cgi?id=744921
-rw-r--r--libyelp/yelp-view.c53
1 files changed, 51 insertions, 2 deletions
diff --git a/libyelp/yelp-view.c b/libyelp/yelp-view.c
index 696c6dc6..4334be65 100644
--- a/libyelp/yelp-view.c
+++ b/libyelp/yelp-view.c
@@ -126,6 +126,9 @@ static void document_callback (YelpDocument *document,
YelpDocumentSignal signal,
YelpView *view,
GError *error);
+static void gtk_xft_dpi_changed (GtkSettings *gtk_settings,
+ GParamSpec *pspec,
+ gpointer user_data);
static gchar *nautilus_sendto = NULL;
@@ -194,6 +197,8 @@ struct _YelpViewPrivate {
gulong uri_resolved;
gchar *bogus_uri;
YelpDocument *document;
+ GtkSettings *gtk_settings;
+ gulong gtk_xft_dpi_changed;
GCancellable *cancellable;
GtkAdjustment *vadjustment;
GtkAdjustment *hadjustment;
@@ -249,6 +254,17 @@ yelp_view_init (YelpView *view)
priv->prevstate = priv->state = YELP_VIEW_STATE_BLANK;
+ /* FIXME: We should use the GtkSettings from the right GdkScreen instead
+ * of the the detault one, but we can't get it from here since the view
+ * has not been added to any top level GtkWidget yet.
+ */
+ priv->gtk_settings = gtk_settings_get_default ();
+ if (priv->gtk_settings) {
+ priv->gtk_xft_dpi_changed =
+ g_signal_connect (priv->gtk_settings, "notify::gtk-xft-dpi",
+ G_CALLBACK (gtk_xft_dpi_changed), NULL);
+ }
+
priv->navigation_requested =
g_signal_connect (view, "navigation-policy-decision-requested",
G_CALLBACK (view_navigation_requested), NULL);
@@ -307,6 +323,11 @@ yelp_view_dispose (GObject *object)
view_clear_load (YELP_VIEW (object));
+ if (priv->gtk_xft_dpi_changed > 0) {
+ g_signal_handler_disconnect (priv->gtk_settings, priv->gtk_xft_dpi_changed);
+ priv->gtk_xft_dpi_changed = 0;
+ }
+
if (priv->vadjuster > 0) {
g_signal_handler_disconnect (priv->vadjustment, priv->vadjuster);
priv->vadjuster = 0;
@@ -1856,6 +1877,25 @@ view_show_error_page (YelpView *view,
g_free (page);
}
+static gint
+normalize_font_size (gdouble font_size)
+{
+ GtkSettings *settings = NULL;
+ gint gtk_xft_dpi = -1;
+ gdouble dpi = 96;
+
+ /* FIXME: We should use the GtkSettings from the right GdkScreen instead
+ * of the the detault one, but we don't have access to the view here.
+ */
+ settings = gtk_settings_get_default ();
+ if (settings) {
+ g_object_get (settings, "gtk-xft-dpi", &gtk_xft_dpi, NULL);
+ dpi = (gtk_xft_dpi != -1) ? gtk_xft_dpi / 1024.0 : 96;
+ }
+
+ /* Use 96 DPI as the reference value for font size calculation */
+ return font_size * dpi / 96;
+}
static void
settings_set_fonts (YelpSettings *settings)
@@ -1875,7 +1915,7 @@ settings_set_fonts (YelpSettings *settings)
g_object_set (websettings,
"default-font-family", family,
"sans-serif-font-family", family,
- "default-font-size", size,
+ "default-font-size", normalize_font_size (size),
NULL);
g_free (family);
@@ -1885,7 +1925,7 @@ settings_set_fonts (YelpSettings *settings)
YELP_SETTINGS_FONT_FIXED);
g_object_set (websettings,
"monospace-font-family", family,
- "default-monospace-font-size", size,
+ "default-monospace-font-size", normalize_font_size (size),
NULL);
g_free (family);
}
@@ -2210,3 +2250,12 @@ document_callback (YelpDocument *document,
view_show_error_page (view, error);
}
}
+
+static void
+gtk_xft_dpi_changed (GtkSettings *gtk_settings,
+ GParamSpec *pspec,
+ gpointer user_data)
+{
+ YelpSettings *settings = yelp_settings_get_default ();
+ settings_set_fonts (settings);
+}