summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-04-02 18:44:33 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-04-02 18:44:33 +0300
commit2a7e7be6e28a25e85b31519ca88656e81705a0b4 (patch)
treeca59e1e292e064064ccc3fd550d275f3d50aa560
parenta6b386499265d22aeed26292d113f095eebda769 (diff)
downloadmetacity-2a7e7be6e28a25e85b31519ca88656e81705a0b4.tar.gz
ui: track window scale and xft dpi
-rw-r--r--src/ui/ui.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/ui/ui.c b/src/ui/ui.c
index c329f1b8..18e22873 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 ());