diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2017-04-02 18:44:33 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2017-04-02 18:44:33 +0300 |
commit | 2a7e7be6e28a25e85b31519ca88656e81705a0b4 (patch) | |
tree | ca59e1e292e064064ccc3fd550d275f3d50aa560 | |
parent | a6b386499265d22aeed26292d113f095eebda769 (diff) | |
download | metacity-2a7e7be6e28a25e85b31519ca88656e81705a0b4.tar.gz |
ui: track window scale and xft dpi
-rw-r--r-- | 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 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 ()); |