[mutter] monitor-config-manager: Support logical monitor transforms



commit 472a434212f7f22234c2886eacb0a5d2a6ee85c9
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Mar 21 14:17:18 2017 +0800

    monitor-config-manager: Support logical monitor transforms
    
    Add support for rotated monitors. This is done per logical monitor, as
    every monitor assigned to a logical monitor must be transformed in the
    same way. This includes being transformed on the same level; e.g. if
    the backend does not support transforming any monitor of a logical
    monitor natively, then all monitors will be transformed using the
    offscreen intermediate framebuffer.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-logical-monitor.c               |    1 +
 src/backends/meta-monitor-config-manager.c        |   35 +++++++++++---
 src/backends/meta-monitor-config-manager.h        |    1 +
 src/backends/meta-monitor-manager.c               |    1 +
 src/backends/meta-monitor.c                       |   52 ++++++++++++++++++---
 src/backends/meta-monitor.h                       |    2 +
 src/backends/native/meta-cursor-renderer-native.c |    1 +
 7 files changed, 78 insertions(+), 15 deletions(-)
---
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
index 9a271c7..4123165 100644
--- a/src/backends/meta-logical-monitor.c
+++ b/src/backends/meta-logical-monitor.c
@@ -79,6 +79,7 @@ meta_logical_monitor_new (MetaMonitorManager       *monitor_manager,
   logical_monitor->number = monitor_number;
   logical_monitor->winsys_id = main_output->winsys_id;
   logical_monitor->scale = logical_monitor_config->scale;
+  logical_monitor->transform = logical_monitor_config->transform;
   logical_monitor->in_fullscreen = -1;
   logical_monitor->rect = logical_monitor_config->layout;
 
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index bd65625..601d4c3 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -101,6 +101,7 @@ find_unassigned_crtc (MetaOutput *output,
 
 typedef struct
 {
+  MetaMonitorManager *monitor_manager;
   MetaLogicalMonitorConfig *logical_monitor_config;
   MetaMonitorConfig *monitor_config;
   GPtrArray *crtc_infos;
@@ -117,6 +118,8 @@ assign_monitor_crtc (MetaMonitor         *monitor,
   MonitorAssignmentData *data = user_data;
   MetaOutput *output;
   MetaCrtc *crtc;
+  MetaMonitorTransform transform;
+  MetaMonitorTransform crtc_transform;
   int crtc_x, crtc_y;
   MetaCrtcInfo *crtc_info;
   MetaOutputInfo *output_info;
@@ -137,7 +140,15 @@ assign_monitor_crtc (MetaMonitor         *monitor,
       return FALSE;
     }
 
-  meta_monitor_calculate_crtc_pos (monitor, mode, output,
+  transform = data->logical_monitor_config->transform;
+  if (meta_monitor_manager_is_transform_handled (data->monitor_manager,
+                                                 crtc,
+                                                 transform))
+    crtc_transform = transform;
+  else
+    crtc_transform = META_MONITOR_TRANSFORM_NORMAL;
+
+  meta_monitor_calculate_crtc_pos (monitor, mode, output, crtc_transform,
                                    &crtc_x, &crtc_y);
 
   crtc_info = g_slice_new0 (MetaCrtcInfo);
@@ -146,7 +157,7 @@ assign_monitor_crtc (MetaMonitor         *monitor,
     .mode = monitor_crtc_mode->crtc_mode,
     .x = crtc_x,
     .y = crtc_y,
-    .transform = META_MONITOR_TRANSFORM_NORMAL,
+    .transform = crtc_transform,
     .outputs = g_ptr_array_new ()
   };
   g_ptr_array_add (crtc_info->outputs, output);
@@ -229,6 +240,7 @@ assign_monitor_crtcs (MetaMonitorManager       *manager,
     }
 
   data = (MonitorAssignmentData) {
+    .monitor_manager = manager,
     .logical_monitor_config = logical_monitor_config,
     .monitor_config = monitor_config,
     .crtc_infos = crtc_infos,
@@ -925,17 +937,24 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig    *logical_monitor
       return FALSE;
     }
 
+  if (meta_monitor_transform_is_rotated (logical_monitor_config->transform))
+    {
+      expected_mode_width = logical_monitor_config->layout.height;
+      expected_mode_height = logical_monitor_config->layout.width;
+    }
+  else
+    {
+      expected_mode_width = logical_monitor_config->layout.width;
+      expected_mode_height = logical_monitor_config->layout.height;
+    }
+
   switch (layout_mode)
     {
     case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
-      expected_mode_width = (logical_monitor_config->layout.width *
-                             logical_monitor_config->scale);
-      expected_mode_height = (logical_monitor_config->layout.height *
-                              logical_monitor_config->scale);
+      expected_mode_width *= logical_monitor_config->scale;
+      expected_mode_height *= logical_monitor_config->scale;
       break;
     case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
-      expected_mode_width = logical_monitor_config->layout.width;
-      expected_mode_height = logical_monitor_config->layout.height;
       break;
     }
 
diff --git a/src/backends/meta-monitor-config-manager.h b/src/backends/meta-monitor-config-manager.h
index de79114..6e5c3e2 100644
--- a/src/backends/meta-monitor-config-manager.h
+++ b/src/backends/meta-monitor-config-manager.h
@@ -40,6 +40,7 @@ typedef struct _MetaLogicalMonitorConfig
 {
   MetaRectangle layout;
   GList *monitor_configs;
+  MetaMonitorTransform transform;
   int scale;
   gboolean is_primary;
   gboolean is_presentation;
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index e412f37..fcdff8f 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1736,6 +1736,7 @@ create_logical_monitor_config_from_variant (MetaMonitorManager          *manager
       .width = width,
       .height = height
     },
+    .transform = META_MONITOR_TRANSFORM_NORMAL,
     .scale = (int) scale,
     .is_primary = is_primary,
     .monitor_configs = monitor_configs
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index dfc3c41..05c8e3a 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -412,6 +412,7 @@ static void
 meta_monitor_normal_calculate_crtc_pos (MetaMonitor         *monitor,
                                         MetaMonitorMode     *monitor_mode,
                                         MetaOutput          *output,
+                                        MetaMonitorTransform crtc_transform,
                                         int                 *out_x,
                                         int                 *out_y)
 {
@@ -482,6 +483,7 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
 static void
 calculate_tile_coordinate (MetaMonitor         *monitor,
                            MetaOutput          *output,
+                           MetaMonitorTransform crtc_transform,
                            int                 *out_x,
                            int                 *out_y)
 {
@@ -495,12 +497,45 @@ calculate_tile_coordinate (MetaMonitor         *monitor,
     {
       MetaOutput *other_output = l->data;
 
-      if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
-          other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
-        x += other_output->tile_info.tile_w;
-      if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
-          other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
-        y += other_output->tile_info.tile_h;
+      switch (crtc_transform)
+        {
+        case META_MONITOR_TRANSFORM_NORMAL:
+        case META_MONITOR_TRANSFORM_FLIPPED:
+          if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+              other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
+            x += other_output->tile_info.tile_w;
+          if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+              other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
+            y += other_output->tile_info.tile_h;
+          break;
+        case META_MONITOR_TRANSFORM_180:
+        case META_MONITOR_TRANSFORM_FLIPPED_180:
+          if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+              other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
+            x += other_output->tile_info.tile_w;
+          if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+              other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
+            y += other_output->tile_info.tile_h;
+          break;
+        case META_MONITOR_TRANSFORM_270:
+        case META_MONITOR_TRANSFORM_FLIPPED_270:
+          if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+              other_output->tile_info.loc_h_tile < output->tile_info.loc_h_tile)
+            y += other_output->tile_info.tile_w;
+          if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+              other_output->tile_info.loc_v_tile < output->tile_info.loc_v_tile)
+            x += other_output->tile_info.tile_h;
+          break;
+        case META_MONITOR_TRANSFORM_90:
+        case META_MONITOR_TRANSFORM_FLIPPED_90:
+          if (other_output->tile_info.loc_v_tile == output->tile_info.loc_v_tile &&
+              other_output->tile_info.loc_h_tile > output->tile_info.loc_h_tile)
+            y += other_output->tile_info.tile_w;
+          if (other_output->tile_info.loc_h_tile == output->tile_info.loc_h_tile &&
+              other_output->tile_info.loc_v_tile > output->tile_info.loc_v_tile)
+            x += other_output->tile_info.tile_h;
+          break;
+        }
     }
 
   *out_x = x;
@@ -759,6 +794,7 @@ static void
 meta_monitor_tiled_calculate_crtc_pos (MetaMonitor         *monitor,
                                        MetaMonitorMode     *monitor_mode,
                                        MetaOutput          *output,
+                                       MetaMonitorTransform crtc_transform,
                                        int                 *out_x,
                                        int                 *out_y)
 {
@@ -766,7 +802,7 @@ meta_monitor_tiled_calculate_crtc_pos (MetaMonitor         *monitor,
 
   if (mode_tiled->is_tiled)
     {
-      calculate_tile_coordinate (monitor, output,
+      calculate_tile_coordinate (monitor, output, crtc_transform,
                                  out_x, out_y);
     }
   else
@@ -919,12 +955,14 @@ void
 meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
                                  MetaMonitorMode     *monitor_mode,
                                  MetaOutput          *output,
+                                 MetaMonitorTransform crtc_transform,
                                  int                 *out_x,
                                  int                 *out_y)
 {
   META_MONITOR_GET_CLASS (monitor)->calculate_crtc_pos (monitor,
                                                         monitor_mode,
                                                         output,
+                                                        crtc_transform,
                                                         out_x,
                                                         out_y);
 }
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 36149d0..09aec21 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -67,6 +67,7 @@ struct _MetaMonitorClass
   void (* calculate_crtc_pos) (MetaMonitor         *monitor,
                                MetaMonitorMode     *monitor_mode,
                                MetaOutput          *output,
+                               MetaMonitorTransform crtc_transform,
                                int                 *out_x,
                                int                 *out_y);
 };
@@ -149,6 +150,7 @@ GList * meta_monitor_get_modes (MetaMonitor *monitor);
 void meta_monitor_calculate_crtc_pos (MetaMonitor         *monitor,
                                       MetaMonitorMode     *monitor_mode,
                                       MetaOutput          *output,
+                                      MetaMonitorTransform crtc_transform,
                                       int                 *out_x,
                                       int                 *out_y);
 
diff --git a/src/backends/native/meta-cursor-renderer-native.c 
b/src/backends/native/meta-cursor-renderer-native.c
index 471106f..29d104c 100644
--- a/src/backends/native/meta-cursor-renderer-native.c
+++ b/src/backends/native/meta-cursor-renderer-native.c
@@ -249,6 +249,7 @@ update_monitor_crtc_cursor (MetaMonitor         *monitor,
 
   meta_monitor_calculate_crtc_pos (monitor, monitor_mode,
                                    monitor_crtc_mode->output,
+                                   META_MONITOR_TRANSFORM_NORMAL,
                                    &crtc_x, &crtc_y);
 
   scaled_crtc_rect = (MetaRectangle) {


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