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 */