[mutter] monitor-manager-xrandr: Use monitor to calculate scaling



commit 1ac63fcd77a25b1d1c529adf94cb108ed2d0e400
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Fri Nov 23 22:35:51 2018 -0500

    monitor-manager-xrandr: Use monitor to calculate scaling
    
    In Xrandr we were caching the available scaling modes that were computed just
    for the current mode, for each monitor, while we can actually reuse the
    default implementation, by just passing the proper scaling constraint.
    
    In monitor we need then to properly filter these values, by only accepting
    integer scaling factors that would allow to have a minimal logical monitor
    size.
    
    Fixes https://gitlab.gnome.org/GNOME/mutter/issues/407
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/336>

 src/backends/meta-monitor.c                    |  41 ++++++----
 src/backends/x11/meta-monitor-manager-xrandr.c | 104 ++-----------------------
 2 files changed, 35 insertions(+), 110 deletions(-)
---
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 41f30eeb3c..d4fb3c0bd7 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -1737,6 +1737,18 @@ is_logical_size_large_enough (int width,
   return width * height >= MINIMUM_LOGICAL_AREA;
 }
 
+static gboolean
+is_scale_valid_for_size (float width,
+                         float height,
+                         float scale)
+{
+  if (scale < MINIMUM_SCALE_FACTOR || scale > MAXIMUM_SCALE_FACTOR)
+    return FALSE;
+
+  return is_logical_size_large_enough (floorf (width / scale),
+                                       floorf (height / scale));
+}
+
 gboolean
 meta_monitor_mode_should_be_advertised (MetaMonitorMode *monitor_mode)
 {
@@ -1766,20 +1778,16 @@ get_closest_scale_factor_for_resolution (float width,
   gboolean found_one;
 
   best_scale = 0;
-  scaled_w = width / scale;
-  scaled_h = height / scale;
 
-  if (scale < MINIMUM_SCALE_FACTOR ||
-      scale > MAXIMUM_SCALE_FACTOR ||
-      !is_logical_size_large_enough (floorf (scaled_w), floorf (scaled_h)))
+  if (!is_scale_valid_for_size (width, height, scale))
     goto out;
 
-  if (floorf (scaled_w) == scaled_w && floorf (scaled_h) == scaled_h)
+  if (fmodf (width, scale) == 0.0 && fmodf (height, scale) == 0.0)
     return scale;
 
   i = 0;
   found_one = FALSE;
-  base_scaled_w = floorf (scaled_w);
+  base_scaled_w = floorf (width / scale);
 
   do
     {
@@ -1840,15 +1848,20 @@ meta_monitor_calculate_supported_scales (MetaMonitor                 *monitor,
           float scale;
           float scale_value = i + j * SCALE_FACTORS_STEPS;
 
-          if ((constraints & META_MONITOR_SCALES_CONSTRAINT_NO_FRAC) &&
-              fmodf (scale_value, 1.0) != 0.0)
+          if (constraints & META_MONITOR_SCALES_CONSTRAINT_NO_FRAC)
             {
-              continue;
-            }
+              if (fmodf (scale_value, 1.0) != 0.0 ||
+                  !is_scale_valid_for_size (width, height, scale_value))
+                continue;
 
-          scale = get_closest_scale_factor_for_resolution (width,
-                                                           height,
-                                                           scale_value);
+              scale = scale_value;
+            }
+          else
+            {
+              scale = get_closest_scale_factor_for_resolution (width,
+                                                               height,
+                                                               scale_value);
+            }
 
           if (scale > 0.0f)
             g_array_append_val (supported_scales, scale);
diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c
index adf1960791..e99e1656b4 100644
--- a/src/backends/x11/meta-monitor-manager-xrandr.c
+++ b/src/backends/x11/meta-monitor-manager-xrandr.c
@@ -77,9 +77,6 @@ struct _MetaMonitorManagerXrandr
   xcb_timestamp_t last_xrandr_set_timestamp;
 
   GHashTable *tiled_monitor_atoms;
-
-  float *supported_scales;
-  int n_supported_scales;
 };
 
 struct _MetaMonitorManagerXrandrClass
@@ -584,17 +581,6 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager)
   meta_monitor_manager_update_logical_state_derived (manager, config);
 }
 
-static void
-meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager,
-                                             MetaMonitorsConfig *config)
-{
-  MetaMonitorManagerXrandr *manager_xrandr =
-    META_MONITOR_MANAGER_XRANDR (manager);
-
-  g_clear_pointer (&manager_xrandr->supported_scales, g_free);
-  meta_monitor_manager_rebuild_derived (manager, config);
-}
-
 static gboolean
 meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager      *manager,
                                                    MetaMonitorsConfig      *config,
@@ -609,7 +595,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager      *mana
       if (!manager->in_init)
         apply_crtc_assignments (manager, TRUE, NULL, 0, NULL, 0);
 
-      meta_monitor_manager_xrandr_rebuild_derived (manager, NULL);
+      meta_monitor_manager_rebuild_derived (manager, NULL);
       return TRUE;
     }
 
@@ -644,7 +630,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager      *mana
         }
       else
         {
-          meta_monitor_manager_xrandr_rebuild_derived (manager, config);
+          meta_monitor_manager_rebuild_derived (manager, config);
         }
     }
 
@@ -891,77 +877,6 @@ meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager
   return meta_monitor_calculate_mode_scale (monitor, monitor_mode, constraints);
 }
 
-static void
-add_supported_scale (GArray *supported_scales,
-                     float   scale)
-{
-  unsigned int i;
-
-  for (i = 0; i < supported_scales->len; i++)
-    {
-      float supported_scale = g_array_index (supported_scales, float, i);
-
-      if (scale == supported_scale)
-        return;
-    }
-
-  g_array_append_val (supported_scales, scale);
-}
-
-static int
-compare_scales (gconstpointer a,
-                gconstpointer b)
-{
-  float f = *(float *) a - *(float *) b;
-
-  if (f < 0)
-    return -1;
-  if (f > 0)
-    return 1;
-  return 0;
-}
-
-static void
-ensure_supported_monitor_scales (MetaMonitorManager *manager)
-{
-  MetaMonitorManagerXrandr *manager_xrandr =
-    META_MONITOR_MANAGER_XRANDR (manager);
-  MetaMonitorScalesConstraint constraints;
-  GList *l;
-  GArray *supported_scales;
-
-  if (manager_xrandr->supported_scales)
-    return;
-
-  constraints = META_MONITOR_SCALES_CONSTRAINT_NO_FRAC;
-  supported_scales = g_array_new (FALSE, FALSE, sizeof (float));
-
-  for (l = manager->monitors; l; l = l->next)
-    {
-      MetaMonitor *monitor = l->data;
-      MetaMonitorMode *monitor_mode;
-      float *monitor_scales;
-      int n_monitor_scales;
-      int i;
-
-      monitor_mode = meta_monitor_get_preferred_mode (monitor);
-      monitor_scales =
-        meta_monitor_calculate_supported_scales (monitor,
-                                                 monitor_mode,
-                                                 constraints,
-                                                 &n_monitor_scales);
-
-      for (i = 0; i < n_monitor_scales; i++)
-        add_supported_scale (supported_scales, monitor_scales[i]);
-      g_array_sort (supported_scales, compare_scales);
-      g_free (monitor_scales);
-    }
-
-  manager_xrandr->supported_scales = (float *) supported_scales->data;
-  manager_xrandr->n_supported_scales = supported_scales->len;
-  g_array_free (supported_scales, FALSE);
-}
-
 static float *
 meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager           *manager,
                                                         MetaLogicalMonitorLayoutMode  layout_mode,
@@ -969,14 +884,12 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager
                                                         MetaMonitorMode              *monitor_mode,
                                                         int                          *n_supported_scales)
 {
-  MetaMonitorManagerXrandr *manager_xrandr =
-    META_MONITOR_MANAGER_XRANDR (manager);
-
-  ensure_supported_monitor_scales (manager);
+  MetaMonitorScalesConstraint constraints;
 
-  *n_supported_scales = manager_xrandr->n_supported_scales;
-  return g_memdup2 (manager_xrandr->supported_scales,
-                    manager_xrandr->n_supported_scales * sizeof (float));
+  constraints = META_MONITOR_SCALES_CONSTRAINT_NO_FRAC;
+  return meta_monitor_calculate_supported_scales (monitor, monitor_mode,
+                                                  constraints,
+                                                  n_supported_scales);
 }
 
 static MetaMonitorManagerCapability
@@ -1063,7 +976,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object)
   MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object);
 
   g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms);
-  g_free (manager_xrandr->supported_scales);
 
   G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object);
 }
@@ -1148,7 +1060,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra
           config = NULL;
         }
 
-      meta_monitor_manager_xrandr_rebuild_derived (manager, config);
+      meta_monitor_manager_rebuild_derived (manager, config);
     }
 
   return TRUE;


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