[mutter] logical-monitor: Track whether the logical monitor is transformed



commit d38c4c1f2d7b03d14811b8aab4cc148cfd22d0f8
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Mar 17 16:33:18 2017 +0800

    logical-monitor: Track whether the logical monitor is transformed
    
    Keep track of the logical monitor transform. When a logical monitor is
    transformed, all of its monitors are also transformed in the same way.
    A logical monitor can either be transformed on the CRTC level, or using
    an offscreen intermediate buffer. In both cases will the logical
    monitor be transformed, but only in the latter will the view be
    transformed.
    
    MetaCrtcs::transform currently does not represent whether the CRTC is
    configured to be transformed or not; only when the backend can handle
    it does it correctly correspond to the actual CRTC configuration. This
    is intended to change with MetaMonitorConfigManager.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=777732

 src/backends/meta-logical-monitor.c                |   14 ++++++++++++++
 src/backends/meta-logical-monitor.h                |    1 +
 src/backends/meta-monitor-manager.c                |    6 +-----
 src/backends/native/meta-renderer-native.c         |    4 ++--
 src/backends/x11/nested/meta-renderer-x11-nested.c |    4 ++--
 5 files changed, 20 insertions(+), 9 deletions(-)
---
diff --git a/src/backends/meta-logical-monitor.c b/src/backends/meta-logical-monitor.c
index f1e2a0f..9a271c7 100644
--- a/src/backends/meta-logical-monitor.c
+++ b/src/backends/meta-logical-monitor.c
@@ -92,6 +92,16 @@ meta_logical_monitor_new (MetaMonitorManager       *monitor_manager,
   return logical_monitor;
 }
 
+static MetaMonitorTransform
+derive_monitor_transform (MetaMonitor *monitor)
+{
+  MetaOutput *main_output;
+
+  main_output = meta_monitor_get_main_output (monitor);
+
+  return main_output->crtc->transform;
+}
+
 MetaLogicalMonitor *
 meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
                                   MetaMonitor        *monitor,
@@ -102,6 +112,7 @@ meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
   MetaOutput *main_output;
   MetaMonitorMode *monitor_mode;
   int scale;
+  MetaMonitorTransform transform;
 
   logical_monitor = g_object_new (META_TYPE_LOGICAL_MONITOR, NULL);
 
@@ -110,10 +121,13 @@ meta_logical_monitor_new_derived (MetaMonitorManager *monitor_manager,
                                                              monitor,
                                                              monitor_mode);
 
+  transform = derive_monitor_transform (monitor);
+
   main_output = meta_monitor_get_main_output (monitor);
   logical_monitor->number = monitor_number;
   logical_monitor->winsys_id = main_output->winsys_id;
   logical_monitor->scale = scale;
+  logical_monitor->transform = transform;
   logical_monitor->in_fullscreen = -1;
   logical_monitor->rect = *layout;
 
diff --git a/src/backends/meta-logical-monitor.h b/src/backends/meta-logical-monitor.h
index f9f99cf..c1bd5be 100644
--- a/src/backends/meta-logical-monitor.h
+++ b/src/backends/meta-logical-monitor.h
@@ -41,6 +41,7 @@ struct _MetaLogicalMonitor
   gboolean is_presentation; /* XXX: not yet used */
   gboolean in_fullscreen;
   int scale;
+  MetaMonitorTransform transform;
 
   /* The primary or first output for this monitor, 0 if we can't figure out.
      It can be matched to a winsys_id of a MetaOutput.
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 9fbe2d5..e412f37 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -2734,17 +2734,13 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
                                          MetaLogicalMonitor *logical_monitor,
                                          gfloat              matrix[6])
 {
-  MetaMonitor *main_monitor;
-  MetaOutput *main_output;
   MetaMonitorTransform transform;
   gfloat viewport[9];
 
   if (!calculate_viewport_matrix (manager, logical_monitor, viewport))
     return FALSE;
 
-  main_monitor = meta_logical_monitor_get_monitors (logical_monitor)->data;
-  main_output = meta_monitor_get_main_output (main_monitor);
-  transform = main_output->crtc->transform;
+  transform = logical_monitor->transform;
   multiply_matrix (viewport, transform_matrices[transform],
                    matrix);
   return TRUE;
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index ae3381b..6a58ae8 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -1686,10 +1686,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
 
   if (meta_monitor_manager_is_transform_handled (monitor_manager,
                                                  main_output->crtc,
-                                                 main_output->crtc->transform))
+                                                 logical_monitor->transform))
     return META_MONITOR_TRANSFORM_NORMAL;
   else
-    return main_output->crtc->transform;
+    return logical_monitor->transform;
 }
 
 static MetaRendererView *
diff --git a/src/backends/x11/nested/meta-renderer-x11-nested.c 
b/src/backends/x11/nested/meta-renderer-x11-nested.c
index abd6a53..124ceef 100644
--- a/src/backends/x11/nested/meta-renderer-x11-nested.c
+++ b/src/backends/x11/nested/meta-renderer-x11-nested.c
@@ -59,10 +59,10 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
 
   if (meta_monitor_manager_is_transform_handled (monitor_manager,
                                                  main_output->crtc,
-                                                 main_output->crtc->transform))
+                                                 logical_monitor->transform))
     return META_MONITOR_TRANSFORM_NORMAL;
   else
-    return main_output->crtc->transform;
+    return logical_monitor->transform;
 }
 
 static MetaRendererView *


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