summaryrefslogtreecommitdiff
path: root/src/backends/meta-monitor.c
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2017-03-21 14:17:18 +0800
committerJonas Ådahl <jadahl@gmail.com>2017-04-07 22:30:49 +0800
commit472a434212f7f22234c2886eacb0a5d2a6ee85c9 (patch)
tree19d4c2bbf1feaa23e9a49d83222414e519f17efc /src/backends/meta-monitor.c
parent7c226462e048e4b72a613ccb04c22f2aaf1dfd30 (diff)
downloadmutter-472a434212f7f22234c2886eacb0a5d2a6ee85c9.tar.gz
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
Diffstat (limited to 'src/backends/meta-monitor.c')
-rw-r--r--src/backends/meta-monitor.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index dfc3c4178..05c8e3aa3 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);
}