diff options
author | Jonas Ådahl <jadahl@gmail.com> | 2017-03-21 14:17:18 +0800 |
---|---|---|
committer | Jonas Ådahl <jadahl@gmail.com> | 2017-04-07 22:30:49 +0800 |
commit | 472a434212f7f22234c2886eacb0a5d2a6ee85c9 (patch) | |
tree | 19d4c2bbf1feaa23e9a49d83222414e519f17efc /src/backends/meta-monitor.c | |
parent | 7c226462e048e4b72a613ccb04c22f2aaf1dfd30 (diff) | |
download | mutter-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.c | 52 |
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); } |