[mutter] meta-monitor-config: Add API to rotate the current config



commit 26b66826dc68b486b2a48effa96157b719f95f64
Author: Rui Matos <tiagomatos gmail com>
Date:   Fri Apr 28 17:59:44 2017 +0200

    meta-monitor-config: Add API to rotate the current config
    
    This will allow us to do automatic rotation of the builtin display if
    that's the only active monitor.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=781906

 src/backends/meta-monitor-config.c |   77 ++++++++++++++++++++++++++++++++++++
 src/backends/meta-monitor-config.h |    5 ++
 2 files changed, 82 insertions(+), 0 deletions(-)
---
diff --git a/src/backends/meta-monitor-config.c b/src/backends/meta-monitor-config.c
index 0928342..b527857 100644
--- a/src/backends/meta-monitor-config.c
+++ b/src/backends/meta-monitor-config.c
@@ -36,6 +36,7 @@
 
 #include "boxes-private.h"
 #include "meta-monitor-config.h"
+#include "meta-backend-private.h"
 
 #include <string.h>
 #include <clutter/clutter.h>
@@ -142,6 +143,28 @@ config_new (void)
   return config;
 }
 
+static MetaConfiguration *
+config_copy (MetaConfiguration *config)
+{
+  MetaConfiguration *new = config_new ();
+  guint i;
+
+  new->n_outputs = config->n_outputs;
+
+  new->keys = g_malloc (sizeof (MetaOutputKey) * config->n_outputs);
+  for (i = 0; i < config->n_outputs; i++)
+    {
+      new->keys[i].connector = g_strdup (config->keys[i].connector);
+      new->keys[i].vendor = g_strdup (config->keys[i].vendor);
+      new->keys[i].product = g_strdup (config->keys[i].product);
+      new->keys[i].serial = g_strdup (config->keys[i].serial);
+    }
+
+  new->outputs = g_memdup (config->outputs, sizeof (MetaOutputConfig) * config->n_outputs);
+
+  return new;
+}
+
 static unsigned long
 output_key_hash (const MetaOutputKey *key)
 {
@@ -1598,6 +1621,60 @@ meta_monitor_config_lid_is_closed_changed (MetaMonitorConfig  *self,
     }
 }
 
+static void
+do_builtin_display_rotation (MetaMonitorConfig    *self,
+                             gboolean              rotate,
+                             MetaMonitorTransform  transform)
+{
+  MetaBackend *backend = meta_get_backend ();
+  MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (backend);
+  MetaConfiguration *new_config;
+  MetaOutputConfig *output_config;
+  guint i;
+
+  if (!self->current)
+    return;
+
+  if (multiple_outputs_are_enabled (self->current) ||
+      !laptop_display_is_on (self->current))
+    return;
+
+  new_config = config_copy (self->current);
+
+  output_config = NULL;
+  for (i = 0; i < new_config->n_outputs; i++)
+    if (new_config->outputs[i].enabled)
+      {
+        output_config = &new_config->outputs[i];
+        break;
+      }
+  g_assert (output_config);
+
+  if (rotate)
+    transform = (output_config->transform + 1) % META_MONITOR_TRANSFORM_FLIPPED;
+
+  if (output_config->transform != transform)
+    {
+      output_config->transform = transform;
+      apply_configuration (self, new_config, monitor_manager);
+    }
+
+  config_unref (new_config);
+}
+
+void
+meta_monitor_config_orientation_changed (MetaMonitorConfig    *self,
+                                         MetaMonitorTransform  transform)
+{
+  do_builtin_display_rotation (self, FALSE, transform);
+}
+
+void
+meta_monitor_config_rotate_monitor (MetaMonitorConfig *self)
+{
+  do_builtin_display_rotation (self, TRUE, META_MONITOR_TRANSFORM_NORMAL);
+}
+
 typedef struct {
   MetaMonitorConfig *config;
   GString *buffer;
diff --git a/src/backends/meta-monitor-config.h b/src/backends/meta-monitor-config.h
index fff6f86..4199570 100644
--- a/src/backends/meta-monitor-config.h
+++ b/src/backends/meta-monitor-config.h
@@ -49,4 +49,9 @@ gboolean           meta_monitor_config_get_is_builtin_display_on (MetaMonitorCon
 void               meta_monitor_config_lid_is_closed_changed (MetaMonitorConfig  *self,
                                                               MetaMonitorManager *manager);
 
+void               meta_monitor_config_orientation_changed (MetaMonitorConfig    *self,
+                                                            MetaMonitorTransform  transform);
+
+void               meta_monitor_config_rotate_monitor (MetaMonitorConfig *self);
+
 #endif /* META_MONITOR_CONFIG_H */


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