[mutter] monitor-manager/kms: Move scale calculation to MetaMonitor



commit 3b097c7e77e420c8e1db732e91f33daa6060f150
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Apr 21 17:28:22 2017 +0800

    monitor-manager/kms: Move scale calculation to MetaMonitor
    
    The scale calculation doesn't really have anything to do with KMS, and
    eventually we'll want to have mutter calculate the monitor scale for
    non-KMS backends too, so move the scale calculation to MetaMonitor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-monitor.c                    |   89 ++++++++++++++++++++++++
 src/backends/meta-monitor.h                    |    3 +
 src/backends/native/meta-monitor-manager-kms.c |   81 +---------------------
 3 files changed, 93 insertions(+), 80 deletions(-)
---
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 9f3fe58..6c85ac4 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -25,6 +25,7 @@
 
 #include "backends/meta-backend-private.h"
 #include "backends/meta-monitor-manager-private.h"
+#include "backends/meta-settings-private.h"
 
 typedef struct _MetaMonitorMode
 {
@@ -976,6 +977,94 @@ meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
                                                         out_y);
 }
 
+/* The minimum resolution at which we turn on a window-scale of 2 */
+#define HIDPI_LIMIT 192
+
+/*
+ * The minimum screen height at which we turn on a window-scale of 2;
+ * below this there just isn't enough vertical real estate for GNOME
+ * apps to work, and it's better to just be tiny
+ */
+#define HIDPI_MIN_HEIGHT 1200
+
+/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
+#define SMALLEST_4K_WIDTH 3656
+
+static int
+calculate_scale (MetaMonitor     *monitor,
+                 MetaMonitorMode *monitor_mode)
+{
+  int resolution_width, resolution_height;
+  int width_mm, height_mm;
+  int scale;
+
+  scale = 1;
+
+  meta_monitor_mode_get_resolution (monitor_mode,
+                                    &resolution_width,
+                                    &resolution_height);
+
+  if (resolution_height < HIDPI_MIN_HEIGHT)
+    goto out;
+
+  /* 4K TV */
+  switch (meta_monitor_get_connector_type (monitor))
+    {
+    case META_CONNECTOR_TYPE_HDMIA:
+    case META_CONNECTOR_TYPE_HDMIB:
+      if (resolution_width >= SMALLEST_4K_WIDTH)
+        goto out;
+      break;
+    default:
+      break;
+    }
+
+  meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
+
+  /*
+   * Somebody encoded the aspect ratio (16/9 or 16/10) instead of the physical
+   * size.
+   */
+  if ((width_mm == 160 && height_mm == 90) ||
+      (width_mm == 160 && height_mm == 100) ||
+      (width_mm == 16 && height_mm == 9) ||
+      (width_mm == 16 && height_mm == 10))
+    goto out;
+
+  if (width_mm > 0 && height_mm > 0)
+    {
+      double dpi_x, dpi_y;
+
+      dpi_x = (double) resolution_width / (width_mm / 25.4);
+      dpi_y = (double) resolution_height / (height_mm / 25.4);
+
+      /*
+       * We don't completely trust these values so both must be high, and never
+       * pick higher ratio than 2 automatically.
+       */
+      if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
+        scale = 2;
+    }
+
+out:
+  return scale;
+}
+
+int
+meta_monitor_calculate_mode_scale (MetaMonitor     *monitor,
+                                   MetaMonitorMode *monitor_mode)
+{
+  MetaBackend *backend = meta_get_backend ();
+  MetaSettings *settings = meta_backend_get_settings (backend);
+  int global_scaling_factor;
+
+  if (meta_settings_get_global_scaling_factor (settings,
+                                               &global_scaling_factor))
+    return global_scaling_factor;
+
+  return calculate_scale (monitor, monitor_mode);
+}
+
 MetaMonitorModeSpec *
 meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode)
 {
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index ccc9a28..e3adb6a 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -156,6 +156,9 @@ void meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
                                       int                 *out_x,
                                       int                 *out_y);
 
+int meta_monitor_calculate_mode_scale (MetaMonitor     *monitor,
+                                       MetaMonitorMode *monitor_mode);
+
 MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode);
 
 void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c
index 372c02a..6000a77 100644
--- a/src/backends/native/meta-monitor-manager-kms.c
+++ b/src/backends/native/meta-monitor-manager-kms.c
@@ -28,7 +28,6 @@
 #include "meta-monitor-config-manager.h"
 #include "meta-backend-private.h"
 #include "meta-renderer-native.h"
-#include "backends/meta-input-settings-private.h"
 
 #include <string.h>
 #include <stdlib.h>
@@ -1829,90 +1828,12 @@ meta_monitor_manager_kms_is_transform_handled (MetaMonitorManager  *manager,
     return FALSE;
 }
 
-/* The minimum resolution at which we turn on a window-scale of 2 */
-#define HIDPI_LIMIT 192
-
-/* The minimum screen height at which we turn on a window-scale of 2;
- * below this there just isn't enough vertical real estate for GNOME
- * apps to work, and it's better to just be tiny */
-#define HIDPI_MIN_HEIGHT 1200
-
-/* From http://en.wikipedia.org/wiki/4K_resolution#Resolutions_of_common_formats */
-#define SMALLEST_4K_WIDTH 3656
-
-static int
-compute_scale (MetaMonitor     *monitor,
-               MetaMonitorMode *monitor_mode)
-{
-  int resolution_width, resolution_height;
-  int width_mm, height_mm;
-  int scale;
-
-  scale = 1;
-
-  meta_monitor_mode_get_resolution (monitor_mode,
-                                    &resolution_width,
-                                    &resolution_height);
-
-  if (resolution_height < HIDPI_MIN_HEIGHT)
-    goto out;
-
-  /* 4K TV */
-  switch (meta_monitor_get_connector_type (monitor))
-    {
-    case META_CONNECTOR_TYPE_HDMIA:
-    case META_CONNECTOR_TYPE_HDMIB:
-      if (resolution_width >= SMALLEST_4K_WIDTH)
-        goto out;
-      break;
-    default:
-      break;
-    }
-
-  meta_monitor_get_physical_dimensions (monitor, &width_mm, &height_mm);
-
-  /*
-   * Somebody encoded the aspect ratio (16/9 or 16/10) instead of the physical
-   * size.
-   */
-  if ((width_mm == 160 && height_mm == 90) ||
-      (width_mm == 160 && height_mm == 100) ||
-      (width_mm == 16 && height_mm == 9) ||
-      (width_mm == 16 && height_mm == 10))
-    goto out;
-
-  if (width_mm > 0 && height_mm > 0)
-    {
-      double dpi_x, dpi_y;
-
-      dpi_x = (double) resolution_width / (width_mm / 25.4);
-      dpi_y = (double) resolution_height / (height_mm / 25.4);
-
-      /*
-       * We don't completely trust these values so both must be high, and never
-       * pick higher ratio than 2 automatically.
-       */
-      if (dpi_x > HIDPI_LIMIT && dpi_y > HIDPI_LIMIT)
-        scale = 2;
-    }
-
-out:
-  return scale;
-}
-
 static int
 meta_monitor_manager_kms_calculate_monitor_mode_scale (MetaMonitorManager *manager,
                                                        MetaMonitor        *monitor,
                                                        MetaMonitorMode    *monitor_mode)
 {
-  MetaBackend *backend = meta_get_backend ();
-  MetaSettings *settings = meta_backend_get_settings (backend);
-  int global_scale;
-
-  if (meta_settings_get_global_scaling_factor (settings, &global_scale))
-    return global_scale;
-  else
-    return compute_scale (monitor, monitor_mode);
+  return meta_monitor_calculate_mode_scale (monitor, monitor_mode);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]