[PATCH] When running on HiDPI monitors, scale anaconda by a factor of 2

David Shea dshea at redhat.com
Wed Sep 17 15:15:20 UTC 2014


This way anaconda is more or less readable on a retina display. Don't do
anything if GNOME is already handling scaling, or if scaling has already
been set via environment variables.
---
 data/liveinst/console.apps/liveinst |  3 ++-
 pyanaconda/ui/gui/__init__.py       | 42 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/data/liveinst/console.apps/liveinst b/data/liveinst/console.apps/liveinst
index 073b39c..e9067fb 100644
--- a/data/liveinst/console.apps/liveinst
+++ b/data/liveinst/console.apps/liveinst
@@ -5,4 +5,5 @@ SESSION=true
 STARTUP_NOTIFICATION_NAME="Starting Install to Hard Drive"
 DOMAIN=anaconda
 # DBus session connections fail when running setuid unless we pass DBUS_SESSION_BUS_ADDRESS through
-KEEP_ENV_VARS=DBUS_SESSION_BUS_ADDRESS,LIVECMD
+# Keep the Gdk scale settings from the user environment
+KEEP_ENV_VARS=DBUS_SESSION_BUS_ADDRESS,LIVECMD,GDK_SCALE,GDK_DPI_SCALE
diff --git a/pyanaconda/ui/gui/__init__.py b/pyanaconda/ui/gui/__init__.py
index e88dfad..995cb53 100644
--- a/pyanaconda/ui/gui/__init__.py
+++ b/pyanaconda/ui/gui/__init__.py
@@ -23,7 +23,7 @@ import meh.ui.gui
 
 from contextlib import contextmanager
 
-from gi.repository import Gdk, Gtk, AnacondaWidgets, Keybinder, GdkPixbuf, GLib
+from gi.repository import Gdk, Gtk, AnacondaWidgets, Keybinder, GdkPixbuf, GLib, GObject
 
 from pyanaconda.i18n import _
 from pyanaconda.constants import IPMI_ABORTED
@@ -480,6 +480,43 @@ class GraphicalUserInterface(UserInterface):
             else:
                 log.warning("logo image is missing")
 
+    def _widgetScale(self):
+        # First, check if the GDK_SCALE environment variable is already set. If so,
+        # leave it alone.
+        if "GDK_SCALE" in os.environ:
+            log.debug("GDK_SCALE already set to %s, not scaling", os.environ["GDK_SCALE"])
+            return
+
+        # Next, check if a scaling factor is already being applied via XSETTINGS,
+        # such as by gnome-settings-daemon
+        display = Gdk.Display.get_default()
+        screen = display.get_default_screen()
+        val = GObject.Value()
+        val.init(GObject.TYPE_INT)
+        if screen.get_setting("gdk-window-scaling-factor", val):
+            log.debug("Window scale set to %s by XSETTINGS, not scaling", val.get_int())
+            return
+
+        # Get the primary monitor dimensions in pixels and mm from Gdk
+        primary = screen.get_primary_monitor()
+        monitor_geometry = screen.get_monitor_geometry(primary)
+        monitor_scale = screen.get_monitor_scale_factor(primary)
+        monitor_width_mm = screen.get_monitor_width_mm(primary)
+        monitor_height_mm = screen.get_monitor_height_mm(primary)
+
+        # Check if this monitor is high DPI, using heuristics from gnome-settings-dpi.
+        # If the monitor has a height >= 1200 pixels and a resolution > 192 dpi in both
+        # x and y directions, apply a scaling factor of 2 so that anaconda isn't all tiny
+        monitor_width_px = monitor_geometry.width * monitor_scale
+        monitor_height_px = monitor_geometry.height * monitor_scale
+        monitor_dpi_x = monitor_width_px / (monitor_width_mm / 25.4)
+        monitor_dpi_y = monitor_height_px / (monitor_height_mm / 25.4)
+
+        log.debug("Detected primary monitor: %dx%d %ddpix %ddpiy", monitor_width_px,
+                monitor_height_px, monitor_dpi_x, monitor_dpi_y)
+        if monitor_height_px >= 1200 and monitor_dpi_x > 192 and monitor_dpi_y > 192:
+            display.set_window_scale(2)
+
     @property
     def tty_num(self):
         return 6
@@ -558,6 +595,9 @@ class GraphicalUserInterface(UserInterface):
 
             sys.exit(0)
 
+        # Apply a widget-scale to hidpi monitors
+        self._widgetScale()
+
         while not self._currentAction:
             self._currentAction = self._instantiateAction(self._actions[0])
             if not self._currentAction:
-- 
2.1.0



More information about the anaconda-patches mailing list