[mutter/wip/wayland-display] MonitorManager: ignore configuration changes that disable all outputs



commit 537955aea79095be40f855edf8998923383fa729
Author: Giovanni Campagna <gcampagn redhat com>
Date:   Fri Jul 26 15:31:17 2013 +0200

    MonitorManager: ignore configuration changes that disable all outputs
    
    If we compute a screen size of 0 in either direction, we crash
    later on, as it is invalid for clutter, cogl and X.

 src/core/monitor.c |   42 +++++++++++++++++++++++++++++++-----------
 1 files changed, 31 insertions(+), 11 deletions(-)
---
diff --git a/src/core/monitor.c b/src/core/monitor.c
index 1a2a7f7..ba1a3a5 100644
--- a/src/core/monitor.c
+++ b/src/core/monitor.c
@@ -1536,6 +1536,7 @@ meta_monitor_manager_handle_apply_configuration  (MetaDBusDisplayConfig *skeleto
   GVariant *properties;
   guint crtc_id;
   int new_mode, x, y;
+  int new_screen_width, new_screen_height;
   guint transform;
   guint output_id;
   GPtrArray *crtc_infos, *output_infos;
@@ -1554,6 +1555,7 @@ meta_monitor_manager_handle_apply_configuration  (MetaDBusDisplayConfig *skeleto
                                        (GDestroyNotify) meta_output_info_free);
 
   /* Validate all arguments */
+  new_screen_width = 0; new_screen_height = 0;
   g_variant_iter_init (&crtc_iter, crtcs);
   while (g_variant_iter_loop (&crtc_iter, "(uiiiuaua{sv})",
                               &crtc_id, &new_mode, &x, &y, &transform,
@@ -1588,19 +1590,29 @@ meta_monitor_manager_handle_apply_configuration  (MetaDBusDisplayConfig *skeleto
       mode = new_mode != -1 ? &manager->modes[new_mode] : NULL;
       crtc_info->mode = mode;
 
-      if (mode &&
-          (x < 0 ||
-           x + mode->width > manager->max_screen_width ||
-           y < 0 ||
-           y + mode->height > manager->max_screen_height))
+      if (mode)
         {
-          g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
-                                                 G_DBUS_ERROR_INVALID_ARGS,
-                                                 "Invalid CRTC geometry");
-          return TRUE;
+          if (x < 0 ||
+              x + mode->width > manager->max_screen_width ||
+              y < 0 ||
+              y + mode->height > manager->max_screen_height)
+            {
+              g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
+                                                     G_DBUS_ERROR_INVALID_ARGS,
+                                                     "Invalid CRTC geometry");
+              return TRUE;
+            }
+
+          new_screen_width = MAX (new_screen_width, x + mode->width);
+          new_screen_height = MAX (new_screen_height, y + mode->height);
+          crtc_info->x = x;
+          crtc_info->y = y;
+        }
+      else
+        {
+          crtc_info->x = 0;
+          crtc_info->y = 0;
         }
-      crtc_info->x = x;
-      crtc_info->y = y;
 
       if (transform < WL_OUTPUT_TRANSFORM_NORMAL ||
           transform > WL_OUTPUT_TRANSFORM_FLIPPED_270)
@@ -1660,6 +1672,14 @@ meta_monitor_manager_handle_apply_configuration  (MetaDBusDisplayConfig *skeleto
       g_ptr_array_add (crtc_infos, crtc_info);
     }
 
+  if (new_screen_width == 0 || new_screen_height == 0)
+    {
+      g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
+                                             G_DBUS_ERROR_INVALID_ARGS,
+                                             "Refusing to disable all outputs");
+      return TRUE;
+    }
+
   g_variant_iter_init (&output_iter, outputs);
   while (g_variant_iter_loop (&output_iter, "(u a{sv})", &output_id, &properties))
     {


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