Description: Adjust settings for HiDPI display. Author: Shih-Yuan Lee (FourDollars) Bug: https://bugs.launchpad.net/bugs/1382291 --- This patch header follows DEP-3: http://dep.debian.net/deps/dep3/ Index: unity-settings-daemon/plugins/xsettings/gsd-xsettings-manager.c =================================================================== --- unity-settings-daemon.orig/plugins/xsettings/gsd-xsettings-manager.c 2014-10-16 14:41:43.000000000 +0800 +++ unity-settings-daemon/plugins/xsettings/gsd-xsettings-manager.c 2014-11-06 09:44:42.041249381 +0800 @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -52,6 +53,12 @@ #define SOUND_SETTINGS_SCHEMA "org.gnome.desktop.sound" #define PRIVACY_SETTINGS_SCHEMA "org.gnome.desktop.privacy" +#define UNITY_GSETTINGS_SCHEMA "com.ubuntu.user-interface" +#define SCALE_FACTOR_KEY "scale-factor" +#define UI_SCALE_DEFAULT 8.0 +#define GNOME_GSETTINGS_SCHEMA "org.gnome.desktop.interface" +#define SCALING_FACTOR_KEY "scaling-factor" + #define XSETTINGS_PLUGIN_SCHEMA "org.gnome.settings-daemon.plugins.xsettings" #define XSETTINGS_OVERRIDE_KEY "overrides" @@ -960,6 +967,81 @@ NULL); } +static GVariant* +add_dict_entry (GVariant *dict, const char *key, int value) +{ + GVariantBuilder builder; + GVariantIter iter; + + const gchar *k; + guint32 v; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{si}")); + g_variant_iter_init (&iter, dict); + + while (g_variant_iter_next (&iter, "{&si}", &k, &v)) + { + if (!g_str_equal (k, key)) + g_variant_builder_add (&builder, "{si}", k, v); + } + g_variant_builder_add (&builder, "{si}", key, value); + + return g_variant_builder_end (&builder); +} + +static void adjust_settings_for_hidpi_display () +{ + GSettings *unity = g_settings_new (UNITY_GSETTINGS_SCHEMA); + GVariant *dict = g_settings_get_value (unity, SCALE_FACTOR_KEY); + GdkScreen *screen = gdk_screen_get_default (); + gint primary = gdk_screen_get_primary_monitor (screen); + gint length = gdk_screen_get_n_monitors (screen); + gint i; + + for (i = 0; i < length; i++) { + GdkRectangle area; + gchar *monitor; + gint width_mm, height_mm, ppi, value; + gdouble diagonal, diagonal_mm; + GVariant *new_dict; + + monitor = gdk_screen_get_monitor_plug_name (screen, i); + + if (g_variant_lookup (dict, monitor, "i", &value)) { + g_free (monitor); + continue; + } + + gdk_screen_get_monitor_geometry (screen, i, &area); + + diagonal = sqrt (area.width * area.width + area.height * area.height); + + width_mm = gdk_screen_get_monitor_width_mm (screen, i); + height_mm = gdk_screen_get_monitor_height_mm (screen, i); + + diagonal_mm = sqrt (width_mm * width_mm + height_mm * height_mm); + ppi = (gint) (diagonal * 25.4 / diagonal_mm); + + if (ppi >= 192 && area.height >= 1200) + value = UI_SCALE_DEFAULT * 2; + else + value = UI_SCALE_DEFAULT; + + new_dict = add_dict_entry (dict, monitor, value); + g_settings_set_value (unity, SCALE_FACTOR_KEY, new_dict); + g_variant_unref (dict); + dict = new_dict; + + if (i == primary && ppi >= 192 && area.height >= 1200) { + GSettings *gnome = g_settings_new (GNOME_GSETTINGS_SCHEMA); + g_settings_set_uint (gnome, SCALING_FACTOR_KEY, 2); + g_object_unref (gnome); + } + } + + g_object_unref (unity); +} + gboolean gnome_xsettings_manager_start (GnomeXSettingsManager *manager, GError **error) @@ -978,6 +1060,8 @@ return FALSE; } + adjust_settings_for_hidpi_display(); + manager->priv->settings = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_object_unref); Index: unity-settings-daemon/plugins/xsettings/Makefile.am =================================================================== --- unity-settings-daemon.orig/plugins/xsettings/Makefile.am 2014-10-16 14:41:43.000000000 +0800 +++ unity-settings-daemon/plugins/xsettings/Makefile.am 2014-11-03 20:48:23.000000000 +0800 @@ -44,6 +44,7 @@ usd_test_xsettings_CFLAGS = $(test_gtk_modules_CFLAGS) usd_test_xsettings_CPPFLAGS = $(test_gtk_modules_CPPFLAGS) -I$(top_srcdir)/plugins/common usd_test_xsettings_LDADD = $(test_gtk_modules_LDADD) +usd_test_xsettings_LDFLAGS = -lm plugin_LTLIBRARIES = \ libxsettings.la \ @@ -76,6 +77,7 @@ $(AM_CFLAGS) libxsettings_la_LDFLAGS = \ + -lm \ $(GSD_PLUGIN_LDFLAGS) \ $(NULL)