[mutter] monitor: Allow monitor mode foreach crtc iterator failable



commit be13d0f8ee1f162c5333152bab089d1cb8a41013
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Dec 20 23:23:27 2016 +0800

    monitor: Allow monitor mode foreach crtc iterator failable
    
    Allow the function used to iterate over the CRTC modes of a monitor
    mode to fail, causing the iteration to fail as well.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-monitor.c    |   10 +++++++---
 src/backends/meta-monitor.h    |   18 ++++++++++--------
 src/tests/monitor-unit-tests.c |   10 +++++++---
 3 files changed, 24 insertions(+), 14 deletions(-)
---
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 33dc655..11c0faf 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -576,11 +576,12 @@ meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode)
   return monitor_mode->spec.refresh_rate;
 }
 
-void
+gboolean
 meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
                                 MetaMonitorMode    *mode,
                                 MetaMonitorModeFunc func,
-                                gpointer            user_data)
+                                gpointer            user_data,
+                                GError            **error)
 {
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
@@ -591,6 +592,9 @@ meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
     {
       MetaMonitorCrtcMode *monitor_crtc_mode = &mode->crtc_modes[i];
 
-      func (monitor, mode, monitor_crtc_mode, user_data);
+      if (!func (monitor, mode, monitor_crtc_mode, user_data, error))
+        return FALSE;
     }
+
+  return TRUE;
 }
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index bb48589..f39b3f4 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -51,10 +51,11 @@ typedef struct _MetaMonitorCrtcMode
   MetaCrtcMode *crtc_mode;
 } MetaMonitorCrtcMode;
 
-typedef void (* MetaMonitorModeFunc) (MetaMonitor         *monitor,
-                                      MetaMonitorMode     *mode,
-                                      MetaMonitorCrtcMode *monitor_crtc_mode,
-                                      gpointer             user_data);
+typedef gboolean (* MetaMonitorModeFunc) (MetaMonitor         *monitor,
+                                          MetaMonitorMode     *mode,
+                                          MetaMonitorCrtcMode *monitor_crtc_mode,
+                                          gpointer             user_data,
+                                          GError             **error);
 
 #define META_TYPE_MONITOR (meta_monitor_get_type ())
 G_DECLARE_DERIVABLE_TYPE (MetaMonitor, meta_monitor, META, MONITOR, GObject)
@@ -120,10 +121,11 @@ void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode,
 
 float meta_monitor_mode_get_refresh_rate (MetaMonitorMode *monitor_mode);
 
-void meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
-                                     MetaMonitorMode    *mode,
-                                     MetaMonitorModeFunc func,
-                                     gpointer            user_data);
+gboolean meta_monitor_mode_foreach_crtc (MetaMonitor        *monitor,
+                                         MetaMonitorMode    *mode,
+                                         MetaMonitorModeFunc func,
+                                         gpointer            user_data,
+                                         GError            **error);
 
 MetaMonitorSpec * meta_monitor_spec_clone (MetaMonitorSpec *monitor_id);
 
diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c
index 6b74295..1ce2094 100644
--- a/src/tests/monitor-unit-tests.c
+++ b/src/tests/monitor-unit-tests.c
@@ -288,11 +288,12 @@ typedef struct _CheckMonitorModeData
   MetaTestCaseMonitorCrtcMode *expect_crtc_mode_iter;
 } CheckMonitorModeData;
 
-static void
+static gboolean
 check_monitor_mode (MetaMonitor         *monitor,
                     MetaMonitorMode     *mode,
                     MetaMonitorCrtcMode *monitor_crtc_mode,
-                    gpointer             user_data)
+                    gpointer             user_data,
+                    GError             **error)
 {
   CheckMonitorModeData *data = user_data;
   MetaMonitorManager *monitor_manager = data->monitor_manager;
@@ -307,6 +308,8 @@ check_monitor_mode (MetaMonitor         *monitor,
   g_assert (monitor_crtc_mode->crtc_mode == crtc_mode);
 
   data->expect_crtc_mode_iter++;
+
+  return TRUE;
 }
 
 static void
@@ -383,7 +386,8 @@ check_monitor_configuration (MonitorTestCase *test_case)
           };
           meta_monitor_mode_foreach_crtc (monitor, mode,
                                           check_monitor_mode,
-                                          &data);
+                                          &data,
+                                          NULL);
         }
     }
 


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