[mutter] monitor-manager: Let the MetaMonitor derive the whole layout



commit 32fd1e8c08055345d681525576699f61d351c807
Author: Jonas Ådahl <jadahl gmail com>
Date:   Wed Jul 12 15:42:20 2017 +0800

    monitor-manager: Let the MetaMonitor derive the whole layout
    
    Instead of letting MetaMonitor derive the logical monitor size, then
    using the main monitor for the position, just let MetaMonitor derive
    the whole layout including the position. This means it can deal with
    tiled monitors better, for example when the main output (the output
    always active when the monitor is active) is not the origin output (the
    output with tile position (0, 0)).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781723

 src/backends/meta-monitor-manager.c |   29 +--------------------------
 src/backends/meta-monitor.c         |   37 +++++++++++++++++++---------------
 src/backends/meta-monitor.h         |   10 +++-----
 3 files changed, 26 insertions(+), 50 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index f83f391..8112f29 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -158,33 +158,6 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager,
                                                     primary_logical_monitor);
 }
 
-static void
-derive_monitor_layout (MetaMonitor   *monitor,
-                       MetaRectangle *layout)
-{
-  GList *outputs;
-  GList *l;
-  int x = INT_MAX;
-  int y = INT_MAX;
-
-  outputs = meta_monitor_get_outputs (monitor);
-  for (l = outputs; l; l = l->next)
-    {
-      MetaOutput *output = l->data;
-
-      if (!output->crtc)
-        continue;
-
-      x = MIN (x, output->crtc->rect.x);
-      y = MIN (y, output->crtc->rect.y);
-    }
-
-  layout->x = x;
-  layout->y = y;
-
-  meta_monitor_derive_dimensions (monitor, &layout->width, &layout->height);
-}
-
 static float
 derive_configured_global_scale (MetaMonitorManager *manager)
 {
@@ -283,7 +256,7 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager
       if (!meta_monitor_is_active (monitor))
         continue;
 
-      derive_monitor_layout (monitor, &layout);
+      meta_monitor_derive_layout (monitor, &layout);
       logical_monitor = logical_monitor_from_layout (manager, logical_monitors,
                                                      &layout);
       if (logical_monitor)
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 7c2ba11..c2477e6 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -258,11 +258,10 @@ meta_monitor_get_current_resolution (MetaMonitor *monitor,
 }
 
 void
-meta_monitor_derive_dimensions (MetaMonitor   *monitor,
-                                int           *width,
-                                int           *height)
+meta_monitor_derive_layout (MetaMonitor   *monitor,
+                            MetaRectangle *layout)
 {
-  META_MONITOR_GET_CLASS (monitor)->derive_dimensions (monitor, width, height);
+  META_MONITOR_GET_CLASS (monitor)->derive_layout (monitor, layout);
 }
 
 void
@@ -464,15 +463,18 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor)
 }
 
 static void
-meta_monitor_normal_derive_dimensions (MetaMonitor   *monitor,
-                                       int           *width,
-                                       int           *height)
+meta_monitor_normal_derive_layout (MetaMonitor   *monitor,
+                                   MetaRectangle *layout)
 {
   MetaOutput *output;
 
   output = meta_monitor_get_main_output (monitor);
-  *width = output->crtc->rect.width;
-  *height = output->crtc->rect.height;
+  *layout = (MetaRectangle) {
+    .x = output->crtc->rect.x,
+    .y = output->crtc->rect.y,
+    .width = output->crtc->rect.width,
+    .height = output->crtc->rect.height
+  };
 }
 
 static gboolean
@@ -515,7 +517,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
   MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass);
 
   monitor_class->get_main_output = meta_monitor_normal_get_main_output;
-  monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
+  monitor_class->derive_layout = meta_monitor_normal_derive_layout;
   monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos;
   monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position;
 }
@@ -1101,9 +1103,8 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor)
 }
 
 static void
-meta_monitor_tiled_derive_dimensions (MetaMonitor   *monitor,
-                                      int           *out_width,
-                                      int           *out_height)
+meta_monitor_derived_derive_layout (MetaMonitor   *monitor,
+                                    MetaRectangle *layout)
 {
   MetaMonitorPrivate *monitor_priv =
     meta_monitor_get_instance_private (monitor);
@@ -1127,8 +1128,12 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor   *monitor,
       max_y = MAX (output->crtc->rect.y + output->crtc->rect.height, max_y);
     }
 
-  *out_width = max_x - min_x;
-  *out_height = max_y - min_y;
+  *layout = (MetaRectangle) {
+    .x = min_x,
+    .y = min_y,
+    .width = max_x - min_x,
+    .height = max_y - min_y
+  };
 }
 
 static gboolean
@@ -1186,7 +1191,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
   object_class->finalize = meta_monitor_tiled_finalize;
 
   monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
-  monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
+  monitor_class->derive_layout = meta_monitor_derived_derive_layout;
   monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos;
   monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position;
 }
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index fa9654b..3a6307c 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -68,9 +68,8 @@ struct _MetaMonitorClass
   GObjectClass parent_class;
 
   MetaOutput * (* get_main_output) (MetaMonitor *monitor);
-  void (* derive_dimensions) (MetaMonitor   *monitor,
-                              int           *width,
-                              int           *height);
+  void (* derive_layout) (MetaMonitor   *monitor,
+                          MetaRectangle *layout);
   void (* calculate_crtc_pos) (MetaMonitor         *monitor,
                                MetaMonitorMode     *monitor_mode,
                                MetaOutput          *output,
@@ -118,9 +117,8 @@ void meta_monitor_get_current_resolution (MetaMonitor *monitor,
                                           int           *width,
                                           int           *height);
 
-void meta_monitor_derive_dimensions (MetaMonitor   *monitor,
-                                     int           *width,
-                                     int           *height);
+void meta_monitor_derive_layout (MetaMonitor   *monitor,
+                                 MetaRectangle *layout);
 
 void meta_monitor_get_physical_dimensions (MetaMonitor *monitor,
                                            int         *width_mm,


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