Description: Read display scaling from gsettings.
Author: Chad MILLER <chad.miller@canonical.com>
Forwarded: yes

--- a/build/config/linux/BUILD.gn
+++ b/build/config/linux/BUILD.gn
@@ -86,6 +86,10 @@ config("libresolv") {
   libs = [ "resolv" ]
 }
 
+config("libgio") {
+  libs = [ "gio" ]
+}
+
 if (use_glib) {
   pkg_config("glib") {
     packages = [
--- a/ui/views/widget/desktop_aura/desktop_screen_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_screen_x11.cc
@@ -7,7 +7,12 @@
 #include <X11/extensions/Xrandr.h>
 #include <X11/Xlib.h>
 
-// It clashes with out RootWindow.
+#ifdef USE_GLIB
+#include <gio/gio.h>
+#include <glib.h>
+#endif
+
+// It clashes with our RootWindow.
 #undef RootWindow
 
 #include "base/logging.h"
@@ -43,11 +48,50 @@ const char* const kAtomsToCache[] = {
 // in |Dispatch()|.
 const int64_t kConfigureDelayMs = 500;
 
-double GetDeviceScaleFactor() {
+double GetDeviceScaleFactor(char *output_info_name) {
   float device_scale_factor = 1.0f;
+
+  int density_indicator = 0;
+
+  GSettingsSchemaSource* gsettings_schema_source =
+      g_settings_schema_source_get_default();
+  GSettingsSchema* gsettings_schema =
+      g_settings_schema_source_lookup(gsettings_schema_source,
+                                      "com.ubuntu.user-interface", TRUE);
+
+  GVariant* display_scales = NULL;
+  if (gsettings_schema != NULL) {
+    GSettings* gsettings = NULL;
+    gsettings = g_settings_new_full(gsettings_schema, NULL, NULL);
+
+    if (gsettings != NULL) {
+      g_settings_get(gsettings, "scale-factor", "@a{si}", &display_scales);
+      DVLOG(1) << "Got com.ubuntu.desktop gsettings.";
+    } else {
+      DVLOG(1) << "No com.ubuntu.desktop gsettings available.";
+    }
+  } else {
+    DVLOG(1) << "No com.ubuntu.desktop gsettings schema available.";
+  }
+
+
+  if (display_scales != NULL) {
+    (void) g_variant_lookup(display_scales, output_info_name, "i",
+                            &density_indicator);
+    DCHECK_LE(0, density_indicator);
+    DVLOG(1) << "Got density indictor " << density_indicator << " from display_scales for " << output_info_name;
+  }
+
+
+  if (density_indicator != 0) {
+    // n/8 is actual scaling factor.  Zero means discover from hardware.
+    device_scale_factor = float(density_indicator / 8.0);
+    DVLOG(1) << "Set " << output_info_name << " screen scaling to "
+             << device_scale_factor << " from gsettings.";
+  } else
   if (views::LinuxUI::instance()) {
     device_scale_factor =
-      views::LinuxUI::instance()->GetDeviceScaleFactor();
+      views::LinuxUI::instance()->GetDeviceScaleFactor(output_info_name);
   } else if (display::Display::HasForceDeviceScaleFactor()) {
     device_scale_factor = display::Display::GetForcedDeviceScaleFactor();
   }
@@ -55,11 +99,11 @@ double GetDeviceScaleFactor() {
 }
 
 gfx::Point PixelToDIPPoint(const gfx::Point& pixel_point) {
-  return gfx::ScaleToFlooredPoint(pixel_point, 1.0f / GetDeviceScaleFactor());
+  return gfx::ScaleToFlooredPoint(pixel_point, 1.0f / GetDeviceScaleFactor(output_info->name));
 }
 
 gfx::Point DIPToPixelPoint(const gfx::Point& dip_point) {
-  return gfx::ScaleToFlooredPoint(dip_point, GetDeviceScaleFactor());
+  return gfx::ScaleToFlooredPoint(dip_point, GetDeviceScaleFactor(output_info->name));
 }
 
 std::vector<display::Display> GetFallbackDisplayList() {
@@ -73,7 +117,7 @@ std::vector<display::Display> GetFallbac
   display::Display gfx_display(0, bounds_in_pixels);
   if (!display::Display::HasForceDeviceScaleFactor() &&
       !display::IsDisplaySizeBlackListed(physical_size)) {
-    const float device_scale_factor = GetDeviceScaleFactor();
+    const float device_scale_factor = GetDeviceScaleFactor(output_info->name);
     DCHECK_LE(1.0f, device_scale_factor);
     gfx_display.SetScaleAndBounds(device_scale_factor, bounds_in_pixels);
   }
@@ -316,7 +360,7 @@ std::vector<display::Display> DesktopScr
 
   // As per-display scale factor is not supported right now,
   // the X11 root window's scale factor is always used.
-  const float device_scale_factor = GetDeviceScaleFactor();
+  const float device_scale_factor = GetDeviceScaleFactor(output_info->name);
   for (int i = 0; i < resources->noutput; ++i) {
     RROutput output_id = resources->outputs[i];
     gfx::XScopedPtr<XRROutputInfo,
@@ -346,6 +390,7 @@ std::vector<display::Display> DesktopScr
       display::Display display(display_id, crtc_bounds);
 
       if (!display::Display::HasForceDeviceScaleFactor()) {
+        DVLOG(1) << "Didn't use gsettings info at all.  Picked " << device_scale_factor;
         display.SetScaleAndBounds(device_scale_factor, crtc_bounds);
       }
 
