mirror of
https://github.com/brl/mutter.git
synced 2025-06-13 16:59:30 +00:00
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
This commit is contained in:
@ -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),
|
||||
|
Reference in New Issue
Block a user