diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c
index 5d3f5f46d..2610d76df 100644
--- a/src/backends/meta-monitor-config-store.c
+++ b/src/backends/meta-monitor-config-store.c
@@ -50,6 +50,10 @@
* 60.049972534179688
*
*
+ *
+ * right
+ * no
+ *
* yes
* no
*
@@ -97,6 +101,9 @@ typedef enum
STATE_LOGICAL_MONITOR_PRIMARY,
STATE_LOGICAL_MONITOR_PRESENTATION,
STATE_LOGICAL_MONITOR_SCALE,
+ STATE_TRANSFORM,
+ STATE_TRANSFORM_ROTATION,
+ STATE_TRANSFORM_FLIPPED,
STATE_MONITOR,
STATE_MONITOR_SPEC,
STATE_MONITOR_SPEC_CONNECTOR,
@@ -117,6 +124,8 @@ typedef struct
GList *current_logical_monitor_configs;
MetaMonitorSpec *current_monitor_spec;
+ gboolean current_transform_flipped;
+ MetaMonitorTransform current_transform;
MetaMonitorModeSpec *current_monitor_mode_spec;
MetaMonitorConfig *current_monitor_config;
MetaLogicalMonitorConfig *current_logical_monitor_config;
@@ -221,6 +230,10 @@ handle_start_element (GMarkupParseContext *context,
{
parser->state = STATE_LOGICAL_MONITOR_PRESENTATION;
}
+ else if (g_str_equal (element_name, "transform"))
+ {
+ parser->state = STATE_TRANSFORM;
+ }
else if (g_str_equal (element_name, "monitor"))
{
parser->current_monitor_config = g_new0 (MetaMonitorConfig, 1);;
@@ -248,6 +261,28 @@ handle_start_element (GMarkupParseContext *context,
return;
}
+ case STATE_TRANSFORM:
+ {
+ if (g_str_equal (element_name, "rotation"))
+ {
+ parser->state = STATE_TRANSFORM_ROTATION;
+ }
+ else if (g_str_equal (element_name, "flipped"))
+ {
+ parser->state = STATE_TRANSFORM_FLIPPED;
+ }
+
+ return;
+ }
+
+ case STATE_TRANSFORM_ROTATION:
+ case STATE_TRANSFORM_FLIPPED:
+ {
+ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Invalid transform element '%s'", element_name);
+ return;
+ }
+
case STATE_MONITOR:
{
if (g_str_equal (element_name, "monitorspec"))
@@ -383,15 +418,25 @@ derive_logical_monitor_layout (MetaLogicalMonitorConfig *logical_monitor_conf
}
}
+ if (meta_monitor_transform_is_rotated (logical_monitor_config->transform))
+ {
+ width = mode_height;
+ height = mode_width;
+ }
+ else
+ {
+ width = mode_width;
+ height = mode_height;
+ }
+
switch (layout_mode)
{
case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
- width = mode_width / logical_monitor_config->scale;
- height = mode_height / logical_monitor_config->scale;
+ width /= logical_monitor_config->scale;
+ height /= logical_monitor_config->scale;
break;
case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
- width = mode_width;
- height = mode_height;
+ break;
}
logical_monitor_config->layout.width = width;
@@ -420,6 +465,32 @@ handle_end_element (GMarkupParseContext *context,
return;
}
+ case STATE_TRANSFORM:
+ {
+ g_assert (g_str_equal (element_name, "transform"));
+
+ parser->current_logical_monitor_config->transform =
+ parser->current_transform;
+ if (parser->current_transform_flipped)
+ {
+ parser->current_logical_monitor_config->transform +=
+ META_MONITOR_TRANSFORM_FLIPPED;
+ }
+
+ parser->current_transform = META_MONITOR_TRANSFORM_NORMAL;
+ parser->current_transform_flipped = FALSE;
+
+ parser->state = STATE_LOGICAL_MONITOR;
+ return;
+ }
+
+ case STATE_TRANSFORM_ROTATION:
+ case STATE_TRANSFORM_FLIPPED:
+ {
+ parser->state = STATE_TRANSFORM;
+ return;
+ }
+
case STATE_MONITOR_SPEC_CONNECTOR:
case STATE_MONITOR_SPEC_VENDOR:
case STATE_MONITOR_SPEC_PRODUCT:
@@ -687,6 +758,7 @@ handle_text (GMarkupParseContext *context,
case STATE_MONITOR:
case STATE_MONITOR_SPEC:
case STATE_MONITOR_MODE:
+ case STATE_TRANSFORM:
{
if (!is_all_whitespace (text, text_len))
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
@@ -765,6 +837,31 @@ handle_text (GMarkupParseContext *context,
return;
}
+ case STATE_TRANSFORM_ROTATION:
+ {
+ if (strncmp (text, "normal", text_len) == 0)
+ parser->current_transform = META_MONITOR_TRANSFORM_NORMAL;
+ else if (strncmp (text, "left", text_len) == 0)
+ parser->current_transform = META_MONITOR_TRANSFORM_90;
+ else if (strncmp (text, "upside_down", text_len) == 0)
+ parser->current_transform = META_MONITOR_TRANSFORM_180;
+ else if (strncmp (text, "right", text_len) == 0)
+ parser->current_transform = META_MONITOR_TRANSFORM_270;
+ else
+ g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
+ "Invalid rotation type %.*s", (int)text_len, text);
+
+ return;
+ }
+
+ case STATE_TRANSFORM_FLIPPED:
+ {
+ read_bool (text, text_len,
+ &parser->current_transform_flipped,
+ error);
+ return;
+ }
+
case STATE_MONITOR_MODE_WIDTH:
{
read_int (text, text_len,