[mutter] settings: Manage our own font DPI



commit 88cae8bd3d8003bbc6f4bb267cf924d65dbab7bb
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri May 5 18:05:21 2017 +0800

    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 deletions(-)
---
diff --git a/clutter/clutter/x11/clutter-settings-x11.h b/clutter/clutter/x11/clutter-settings-x11.h
index e76eb2d..3e08885 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 d1dd97f..98cfcab 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 1edc860..c76b1cb 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 */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]