[mutter] monitor: Add foreach output helper and fix foreach crtc helper



commit 522eec00cdb22acd81edac039cbe95ea2d55bf0a
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Aug 18 14:04:02 2017 +0800

    monitor: Add foreach output helper and fix foreach crtc helper
    
    The foreach CRTC monitor mode helper incorrectly iterated over outputs
    without CRTC when non-tiled modes were set on tiled monitors. This was
    not expected by callers, so fix the helper to only iterate over active
    outputs (that has or should have a CRTC).
    
    The test cases uses the incorrect behaviour of the foreach CRTC helper
    to check that the disabled outputs mode are set to NULL, so add a
    foreach output helper and change the tests to use that instead.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=730551

 src/backends/meta-monitor.c    |   26 ++++++++++++++++++++++++++
 src/backends/meta-monitor.h    |    6 ++++++
 src/tests/monitor-unit-tests.c |   16 ++++++++--------
 3 files changed, 40 insertions(+), 8 deletions(-)
---
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 9a15c31..e3595fc 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -1598,6 +1598,32 @@ meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
     {
       MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
 
+      if (!monitor_crtc_mode->crtc_mode)
+        continue;
+
+      if (!func (monitor, mode, monitor_crtc_mode, user_data, error))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
+gboolean
+meta_monitor_mode_foreach_output (MetaMonitor        *monitor,
+                                  MetaMonitorMode    *mode,
+                                  MetaMonitorModeFunc func,
+                                  gpointer            user_data,
+                                  GError            **error)
+{
+  MetaMonitorPrivate *monitor_priv =
+    meta_monitor_get_instance_private (monitor);
+  GList *l;
+  int i;
+
+  for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
+    {
+      MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
+
       if (!func (monitor, mode, monitor_crtc_mode, user_data, error))
         return FALSE;
     }
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 6ca93cd..f4260d6 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -197,6 +197,12 @@ gboolean meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
                                          gpointer            user_data,
                                          GError            **error);
 
+gboolean meta_monitor_mode_foreach_output (MetaMonitor        *monitor,
+                                           MetaMonitorMode    *mode,
+                                           MetaMonitorModeFunc func,
+                                           gpointer            user_data,
+                                           GError            **error);
+
 MetaMonitorSpec * meta_monitor_spec_clone (MetaMonitorSpec *monitor_id);
 
 gboolean meta_monitor_spec_equals (MetaMonitorSpec *monitor_id,
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index e2dcdc5..ddf017c 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -659,10 +659,10 @@ check_monitor_configuration (MonitorTestCase *test_case)
             .expect_crtc_mode_iter =
               test_case->expect.monitors[i].modes[j].crtc_modes
           };
-          meta_monitor_mode_foreach_crtc (monitor, mode,
-                                          check_monitor_mode,
-                                          &data,
-                                          NULL);
+          meta_monitor_mode_foreach_output (monitor, mode,
+                                            check_monitor_mode,
+                                            &data,
+                                            NULL);
         }
 
       current_mode = meta_monitor_get_current_mode (monitor);
@@ -688,10 +688,10 @@ check_monitor_configuration (MonitorTestCase *test_case)
             .expect_crtc_mode_iter =
               test_case->expect.monitors[i].modes[expected_current_mode_index].crtc_modes
           };
-          meta_monitor_mode_foreach_crtc (monitor, expected_current_mode,
-                                          check_current_monitor_mode,
-                                          &data,
-                                          NULL);
+          meta_monitor_mode_foreach_output (monitor, expected_current_mode,
+                                            check_current_monitor_mode,
+                                            &data,
+                                            NULL);
         }
 
       meta_monitor_derive_current_mode (monitor);


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