From 88cae8bd3d8003bbc6f4bb267cf924d65dbab7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 5 May 2017 18:05:21 +0800 Subject: [PATCH] settings: Manage our own font DPI Previously gnome-shell listened on the Xft Xsettings via GTK+s GtkSettings to get the font DPI setting. The Xsetting might not be what we want, and we should not rely on Xsettings when we don't need to, so lets manage it ourself. https://bugzilla.gnome.org/show_bug.cgi?id=765011 --- clutter/clutter/x11/clutter-settings-x11.h | 1 - src/backends/meta-settings.c | 66 ++++++++++++++++++++++ src/meta/meta-settings.h | 2 + 3 files changed, 68 insertions(+), 1 deletion(-) diff --git a/clutter/clutter/x11/clutter-settings-x11.h b/clutter/clutter/x11/clutter-settings-x11.h index e76eb2d18..3e0888521 100644 --- a/clutter/clutter/x11/clutter-settings-x11.h +++ b/clutter/clutter/x11/clutter-settings-x11.h @@ -10,7 +10,6 @@ static const struct { { "Net/DndDragThreshold", "dnd-drag-threshold" }, { "Gtk/FontName", "font-name" }, { "Xft/Antialias", "font-antialias" }, - { "Xft/DPI", "font-dpi" }, { "Xft/Hinting", "font-hinting" }, { "Xft/HintStyle", "font-hint-style" }, { "Xft/RGBA", "font-subpixel-order" }, diff --git a/src/backends/meta-settings.c b/src/backends/meta-settings.c index d1dd97f3b..98cfcabb5 100644 --- a/src/backends/meta-settings.c +++ b/src/backends/meta-settings.c @@ -34,6 +34,7 @@ enum { UI_SCALING_FACTOR_CHANGED, GLOBAL_SCALING_FACTOR_CHANGED, + FONT_DPI_CHANGED, EXPERIMENTAL_FEATURES_CHANGED, N_SIGNALS @@ -53,6 +54,8 @@ struct _MetaSettings int ui_scaling_factor; int global_scaling_factor; + int font_dpi; + MetaExperimentalFeature experimental_features; gboolean experimental_features_overridden; }; @@ -198,6 +201,54 @@ meta_settings_get_global_scaling_factor (MetaSettings *settings, return TRUE; } +static gboolean +update_font_dpi (MetaSettings *settings) +{ + double text_scaling_factor; + /* Number of logical pixels on an inch when unscaled */ + const double dots_per_inch = 96; + /* Being based on Xft, API users expect the DPI to be 1/1024th of an inch. */ + const double xft_factor = 1024; + int font_dpi; + + text_scaling_factor = g_settings_get_double (settings->interface_settings, + "text-scaling-factor"); + font_dpi = (int) (text_scaling_factor * + dots_per_inch * + xft_factor * + settings->ui_scaling_factor); + + if (font_dpi != settings->font_dpi) + { + settings->font_dpi = font_dpi; + + g_object_set (clutter_settings_get_default (), + "font-dpi", font_dpi, + NULL); + + return TRUE; + } + else + { + return FALSE; + } +} + +static void +meta_settings_update_font_dpi (MetaSettings *settings) +{ + if (update_font_dpi (settings)) + g_signal_emit (settings, signals[FONT_DPI_CHANGED], 0); +} + +int +meta_settings_get_font_dpi (MetaSettings *settings) +{ + g_assert (settings->font_dpi != 0); + + return settings->font_dpi; +} + static void interface_settings_changed (GSettings *interface_settings, const char *key, @@ -208,6 +259,10 @@ interface_settings_changed (GSettings *interface_settings, if (update_global_scaling_factor (settings)) g_signal_emit (settings, signals[GLOBAL_SCALING_FACTOR_CHANGED], 0); } + else if (g_str_equal (key, "text-scaling-factor")) + { + meta_settings_update_font_dpi (settings); + } } gboolean @@ -340,6 +395,8 @@ meta_settings_init (MetaSettings *settings) /* Chain up inter-dependent settings. */ g_signal_connect (settings, "global-scaling-factor-changed", G_CALLBACK (meta_settings_update_ui_scaling_factor), NULL); + g_signal_connect (settings, "ui-scaling-factor-changed", + G_CALLBACK (meta_settings_update_font_dpi), NULL); update_global_scaling_factor (settings); update_experimental_features (settings); @@ -349,6 +406,7 @@ void meta_settings_post_init (MetaSettings *settings) { update_ui_scaling_factor (settings); + update_font_dpi (settings); } static void @@ -374,6 +432,14 @@ meta_settings_class_init (MetaSettingsClass *klass) NULL, NULL, NULL, G_TYPE_NONE, 0); + signals[FONT_DPI_CHANGED] = + g_signal_new ("font-dpi-changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, NULL, NULL, + G_TYPE_NONE, 0); + signals[EXPERIMENTAL_FEATURES_CHANGED] = g_signal_new ("experimental-features-changed", G_TYPE_FROM_CLASS (object_class), diff --git a/src/meta/meta-settings.h b/src/meta/meta-settings.h index 1edc8600e..c76b1cb1d 100644 --- a/src/meta/meta-settings.h +++ b/src/meta/meta-settings.h @@ -26,4 +26,6 @@ int meta_settings_get_ui_scaling_factor (MetaSettings *settings); +int meta_settings_get_font_dpi (MetaSettings *settings); + #endif /* META_SETTINGS_H */