[metacity] ui: track window scale and xft dpi



commit 2a7e7be6e28a25e85b31519ca88656e81705a0b4
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Sun Apr 2 18:44:33 2017 +0300

    ui: track window scale and xft dpi

 src/ui/ui.c |   70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)
---
diff --git a/src/ui/ui.c b/src/ui/ui.c
index c329f1b..18e2287 100644
--- a/src/ui/ui.c
+++ b/src/ui/ui.c
@@ -37,7 +37,10 @@
 struct _MetaUI
 {
   Display *xdisplay;
+
   gboolean composited;
+  gint scale;
+  gdouble dpi;
 
   MetaTheme *theme;
   MetaFrames *frames;
@@ -50,6 +53,67 @@ struct _MetaUI
   guint32 button_click_time;
 };
 
+static gboolean
+get_int_setting (const gchar *name,
+                 gint        *value)
+{
+  GValue gvalue = G_VALUE_INIT;
+
+  g_value_init (&gvalue, G_TYPE_INT);
+
+  if (gdk_screen_get_setting (gdk_screen_get_default (), name, &gvalue))
+    {
+      *value = g_value_get_int (&gvalue);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static gint
+get_window_scaling_factor (MetaUI *ui)
+{
+  gint scale;
+
+  if (get_int_setting ("gdk-window-scaling-factor", &scale))
+    return scale;
+
+  return 1;
+}
+
+static gdouble
+get_xft_dpi (MetaUI *ui)
+{
+  const gchar *dpi_scale_env;
+  gint xft_dpi;
+  gdouble dpi;
+
+  dpi = 96.0;
+  if (get_int_setting ("gtk-xft-dpi", &xft_dpi) && xft_dpi > 0)
+    dpi = xft_dpi / 1024.0 / ui->scale;
+
+  dpi_scale_env = g_getenv ("GDK_DPI_SCALE");
+  if (dpi_scale_env != NULL)
+    {
+      gdouble dpi_scale;
+
+      dpi_scale = g_ascii_strtod (dpi_scale_env, NULL);
+      if (dpi_scale != 0)
+        dpi *= dpi_scale;
+    }
+
+  return dpi;
+}
+
+static void
+notify_gtk_xft_dpi_cb (GtkSettings *settings,
+                       GParamSpec  *pspec,
+                       MetaUI      *ui)
+{
+  ui->scale = get_window_scaling_factor (ui);
+  ui->dpi = get_xft_dpi (ui);
+}
+
 void
 meta_ui_init (int *argc, char ***argv)
 {
@@ -280,7 +344,13 @@ meta_ui_new (Display  *xdisplay,
 
   ui = g_new0 (MetaUI, 1);
   ui->xdisplay = xdisplay;
+
   ui->composited = composited;
+  ui->scale = get_window_scaling_factor (ui);
+  ui->dpi = get_xft_dpi (ui);
+
+  g_signal_connect (gtk_settings_get_default (), "notify::gtk-xft-dpi",
+                    G_CALLBACK (notify_gtk_xft_dpi_cb), ui);
 
   gdisplay = gdk_x11_lookup_xdisplay (xdisplay);
   g_assert (gdisplay == gdk_display_get_default ());


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