diff options
author | Mario Sanchez Prada <mario@endlessm.com> | 2015-02-21 20:09:23 +0000 |
---|---|---|
committer | Mario Sanchez Prada <mario@endlessm.com> | 2015-02-25 11:37:45 +0000 |
commit | 14a5099d017d5270041b7fe7effa66b8c400c4d9 (patch) | |
tree | 30d96295dea5b8ec615d5207dc476621526e4798 | |
parent | 3b9364324d8545b3bce91f83bd55b10b1b5e3c2e (diff) | |
download | yelp-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.c | 53 |
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", >k_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); +} |