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
This commit is contained in:
Rui Matos 2017-04-28 17:59:44 +02:00
parent 6d082bf442
commit 26b66826dc
2 changed files with 82 additions and 0 deletions

View File

@ -36,6 +36,7 @@
#include "boxes-private.h" #include "boxes-private.h"
#include "meta-monitor-config.h" #include "meta-monitor-config.h"
#include "meta-backend-private.h"
#include <string.h> #include <string.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
@ -142,6 +143,28 @@ config_new (void)
return config; 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 static unsigned long
output_key_hash (const MetaOutputKey *key) 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 { typedef struct {
MetaMonitorConfig *config; MetaMonitorConfig *config;
GString *buffer; GString *buffer;

View File

@ -49,4 +49,9 @@ gboolean meta_monitor_config_get_is_builtin_display_on (MetaMonitorCon
void meta_monitor_config_lid_is_closed_changed (MetaMonitorConfig *self, void meta_monitor_config_lid_is_closed_changed (MetaMonitorConfig *self,
MetaMonitorManager *manager); 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 */ #endif /* META_MONITOR_CONFIG_H */