diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c index 71652962a..bd65625c0 100644 --- a/src/backends/meta-monitor-config-manager.c +++ b/src/backends/meta-monitor-config-manager.c @@ -117,6 +117,7 @@ assign_monitor_crtc (MetaMonitor *monitor, MonitorAssignmentData *data = user_data; MetaOutput *output; MetaCrtc *crtc; + int crtc_x, crtc_y; MetaCrtcInfo *crtc_info; MetaOutputInfo *output_info; MetaMonitorConfig *first_monitor_config; @@ -136,12 +137,15 @@ assign_monitor_crtc (MetaMonitor *monitor, return FALSE; } + meta_monitor_calculate_crtc_pos (monitor, mode, output, + &crtc_x, &crtc_y); + crtc_info = g_slice_new0 (MetaCrtcInfo); *crtc_info = (MetaCrtcInfo) { .crtc = crtc, .mode = monitor_crtc_mode->crtc_mode, - .x = monitor_crtc_mode->x, - .y = monitor_crtc_mode->y, + .x = crtc_x, + .y = crtc_y, .transform = META_MONITOR_TRANSFORM_NORMAL, .outputs = g_ptr_array_new () }; diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 9a242cd93..dfc3c4178 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -32,6 +32,13 @@ typedef struct _MetaMonitorMode MetaMonitorCrtcMode *crtc_modes; } MetaMonitorMode; +typedef struct _MetaMonitorModeTiled +{ + MetaMonitorMode parent; + + gboolean is_tiled; +} MetaMonitorModeTiled; + typedef struct _MetaMonitorPrivate { GList *outputs; @@ -347,8 +354,6 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal) }, mode->crtc_modes = g_new (MetaMonitorCrtcMode, 1); mode->crtc_modes[0] = (MetaMonitorCrtcMode) { - .x = 0, - .y = 0, .output = output, .crtc_mode = crtc_mode }; @@ -403,6 +408,17 @@ meta_monitor_normal_derive_dimensions (MetaMonitor *monitor, *height = output->crtc->rect.height; } +static void +meta_monitor_normal_calculate_crtc_pos (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaOutput *output, + int *out_x, + int *out_y) +{ + *out_x = 0; + *out_y = 0; +} + static void meta_monitor_normal_init (MetaMonitorNormal *monitor) { @@ -415,6 +431,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass) monitor_class->get_main_output = meta_monitor_normal_get_main_output; monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions; + monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos; } uint32_t @@ -463,10 +480,10 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager, } static void -calculate_tile_coordinate (MetaMonitor *monitor, - MetaOutput *output, - int *out_x, - int *out_y) +calculate_tile_coordinate (MetaMonitor *monitor, + MetaOutput *output, + int *out_x, + int *out_y) { MetaMonitorPrivate *monitor_priv = meta_monitor_get_instance_private (monitor); @@ -548,40 +565,35 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled) MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitorPrivate *monitor_priv = meta_monitor_get_instance_private (monitor); - MetaMonitorMode *mode; + MetaMonitorModeTiled *mode; GList *l; int i; - mode = g_new0 (MetaMonitorMode, 1); + mode = g_new0 (MetaMonitorModeTiled, 1); + mode->is_tiled = TRUE; meta_monitor_tiled_calculate_tiled_size (monitor, - &mode->spec.width, - &mode->spec.height); - mode->crtc_modes = g_new0 (MetaMonitorCrtcMode, - g_list_length (monitor_priv->outputs)); + &mode->parent.spec.width, + &mode->parent.spec.height); + mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, + g_list_length (monitor_priv->outputs)); for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) { MetaOutput *output = l->data; MetaCrtcMode *preferred_crtc_mode = output->preferred_mode; - int x; - int y; - calculate_tile_coordinate (monitor, output, &x, &y); - - mode->crtc_modes[i] = (MetaMonitorCrtcMode) { - .x = x, - .y = y, + mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { .output = output, .crtc_mode = preferred_crtc_mode }; - g_warn_if_fail (mode->spec.refresh_rate == 0.0f || - (mode->spec.refresh_rate == + g_warn_if_fail (mode->parent.spec.refresh_rate == 0.0f || + (mode->parent.spec.refresh_rate == preferred_crtc_mode->refresh_rate)); - mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate; + mode->parent.spec.refresh_rate = preferred_crtc_mode->refresh_rate; } - return mode; + return &mode->parent; } static MetaMonitorMode * @@ -592,7 +604,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled, MetaMonitor *monitor = META_MONITOR (monitor_tiled); MetaMonitorPrivate *monitor_priv = meta_monitor_get_instance_private (monitor); - MetaMonitorMode *mode; + MetaMonitorModeTiled *mode; GList *l; int i; @@ -604,14 +616,15 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled, crtc_mode->height == (int) main_output->tile_info.tile_h) return NULL; - mode = g_new0 (MetaMonitorMode, 1); + mode = g_new0 (MetaMonitorModeTiled, 1); - mode->spec = (MetaMonitorModeSpec) { + mode->is_tiled = FALSE; + mode->parent.spec = (MetaMonitorModeSpec) { .width = crtc_mode->width, .height = crtc_mode->height, .refresh_rate = crtc_mode->refresh_rate }; - mode->crtc_modes = g_new0 (MetaMonitorCrtcMode, + mode->parent.crtc_modes = g_new0 (MetaMonitorCrtcMode, g_list_length (monitor_priv->outputs)); for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++) @@ -620,23 +633,21 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled, if (output == main_output) { - mode->crtc_modes[i] = (MetaMonitorCrtcMode) { - .x = 0, - .y = 0, + mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { .output = output, .crtc_mode = crtc_mode }; } else { - mode->crtc_modes[i] = (MetaMonitorCrtcMode) { + mode->parent.crtc_modes[i] = (MetaMonitorCrtcMode) { .output = output, .crtc_mode = NULL }; } } - return mode; + return &mode->parent; } static void @@ -744,6 +755,27 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor, *out_height = max_y - min_y; } +static void +meta_monitor_tiled_calculate_crtc_pos (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaOutput *output, + int *out_x, + int *out_y) +{ + MetaMonitorModeTiled *mode_tiled = (MetaMonitorModeTiled *) monitor_mode; + + if (mode_tiled->is_tiled) + { + calculate_tile_coordinate (monitor, output, + out_x, out_y); + } + else + { + *out_x = 0; + *out_y = 0; + } +} + static void meta_monitor_tiled_finalize (GObject *object) { @@ -771,6 +803,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass) monitor_class->get_main_output = meta_monitor_tiled_get_main_output; monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions; + monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos; } static void @@ -882,6 +915,20 @@ meta_monitor_get_modes (MetaMonitor *monitor) return priv->modes; } +void +meta_monitor_calculate_crtc_pos (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaOutput *output, + int *out_x, + int *out_y) +{ + META_MONITOR_GET_CLASS (monitor)->calculate_crtc_pos (monitor, + monitor_mode, + output, + out_x, + out_y); +} + MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode) { diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index fc75c8ca6..36149d0c2 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -43,8 +43,6 @@ typedef struct _MetaMonitorModeSpec typedef struct _MetaMonitorCrtcMode { - int x; - int y; MetaOutput *output; MetaCrtcMode *crtc_mode; } MetaMonitorCrtcMode; @@ -66,6 +64,11 @@ struct _MetaMonitorClass void (* derive_dimensions) (MetaMonitor *monitor, int *width, int *height); + void (* calculate_crtc_pos) (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaOutput *output, + int *out_x, + int *out_y); }; #define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ()) @@ -143,6 +146,12 @@ void meta_monitor_set_current_mode (MetaMonitor *monitor, GList * meta_monitor_get_modes (MetaMonitor *monitor); +void meta_monitor_calculate_crtc_pos (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaOutput *output, + int *out_x, + int *out_y); + MetaMonitorModeSpec * meta_monitor_mode_get_spec (MetaMonitorMode *monitor_mode); void meta_monitor_mode_get_resolution (MetaMonitorMode *monitor_mode, diff --git a/src/backends/native/meta-cursor-renderer-native.c b/src/backends/native/meta-cursor-renderer-native.c index 5dbfadb8e..471106f22 100644 --- a/src/backends/native/meta-cursor-renderer-native.c +++ b/src/backends/native/meta-cursor-renderer-native.c @@ -240,15 +240,20 @@ update_monitor_crtc_cursor (MetaMonitor *monitor, meta_cursor_renderer_native_get_instance_private (cursor_renderer_native); MetaRectangle scaled_crtc_rect; int scale; + int crtc_x, crtc_y; if (meta_is_stage_views_scaled ()) scale = meta_logical_monitor_get_scale (data->in_logical_monitor); else scale = 1; + meta_monitor_calculate_crtc_pos (monitor, monitor_mode, + monitor_crtc_mode->output, + &crtc_x, &crtc_y); + scaled_crtc_rect = (MetaRectangle) { - .x = monitor_crtc_mode->x / scale, - .y = monitor_crtc_mode->y / scale, + .x = crtc_x / scale, + .y = crtc_y / scale, .width = monitor_crtc_mode->crtc_mode->width / scale, .height = monitor_crtc_mode->crtc_mode->height / scale }; diff --git a/src/tests/monitor-unit-tests.c b/src/tests/monitor-unit-tests.c index b3f458c2a..5f354c276 100644 --- a/src/tests/monitor-unit-tests.c +++ b/src/tests/monitor-unit-tests.c @@ -128,8 +128,6 @@ typedef struct _MonitorTestCaseMonitorCrtcMode { int output; int crtc_mode; - int x; - int y; } MetaTestCaseMonitorCrtcMode; typedef struct _MonitorTestCaseMonitorMode @@ -162,6 +160,8 @@ typedef struct _MonitorTestCaseLogicalMonitor typedef struct _MonitorTestCaseCrtcExpect { int current_mode; + int x; + int y; } MonitorTestCaseCrtcExpect; typedef struct _MonitorTestCaseExpect @@ -351,9 +351,6 @@ check_monitor_mode (MetaMonitor *monitor, g_assert (monitor_crtc_mode->output == output); g_assert (monitor_crtc_mode->crtc_mode == crtc_mode); - g_assert_cmpint (monitor_crtc_mode->x, ==, data->expect_crtc_mode_iter->x); - g_assert_cmpint (monitor_crtc_mode->y, ==, data->expect_crtc_mode_iter->y); - data->expect_crtc_mode_iter++; return TRUE; @@ -489,6 +486,42 @@ check_logical_monitor (MonitorTestCase *test_case, g_assert_nonnull (primary_output); } +static void +get_compensated_crtc_position (MetaCrtc *crtc, + int *x, + int *y) +{ + MetaLogicalMonitor *logical_monitor; + MetaBackend *backend = meta_get_backend (); + MetaRenderer *renderer = meta_backend_get_renderer (backend); + GList *views; + GList *l; + + logical_monitor = crtc->logical_monitor; + g_assert_nonnull (logical_monitor); + + views = meta_renderer_get_views (renderer); + for (l = views; l; l = l->next) + { + MetaRendererView *view = l->data; + MetaRectangle view_layout; + + clutter_stage_view_get_layout (CLUTTER_STAGE_VIEW (view), + &view_layout); + + if (meta_rectangle_equal (&view_layout, + &logical_monitor->rect)) + { + *x = crtc->rect.x - view_layout.x; + *y = crtc->rect.y - view_layout.y; + return; + } + } + + *x = crtc->rect.x; + *y = crtc->rect.y; +} + static void check_monitor_configuration (MonitorTestCase *test_case) { @@ -671,8 +704,14 @@ check_monitor_configuration (MonitorTestCase *test_case) MetaCrtc *crtc = &monitor_manager->crtcs[i]; MetaCrtcMode *expected_current_mode = &monitor_manager->modes[test_case->expect.crtcs[i].current_mode]; + int crtc_x, crtc_y; g_assert (crtc->current_mode == expected_current_mode); + + get_compensated_crtc_position (crtc, &crtc_x, &crtc_y); + + g_assert_cmpint (crtc_x, ==, test_case->expect.crtcs[i].x); + g_assert_cmpint (crtc_y, ==, test_case->expect.crtcs[i].y); } } } @@ -1224,8 +1263,6 @@ meta_test_monitor_tiled_linear_config (void) { .output = 1, .crtc_mode = 0, - .x = 400, - .y = 0 } } }, @@ -1254,6 +1291,8 @@ meta_test_monitor_tiled_linear_config (void) }, { .current_mode = 0, + .x = 400, + .y = 0 } }, .n_crtcs = 2, @@ -2826,14 +2865,10 @@ meta_test_monitor_custom_tiled_config (void) { .output = 0, .crtc_mode = 0, - .x = 0, - .y = 0, }, { .output = 1, .crtc_mode = 0, - .x = 400, - .y = 0, } } } @@ -2862,6 +2897,8 @@ meta_test_monitor_custom_tiled_config (void) }, { .current_mode = 0, + .x = 400, + .y = 0 } }, .n_crtcs = 2, @@ -2969,14 +3006,10 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void) { .output = 0, .crtc_mode = 0, - .x = 0, - .y = 0, }, { .output = 1, .crtc_mode = 0, - .x = 400, - .y = 0, } } }, @@ -2987,8 +3020,6 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void) { .output = 0, .crtc_mode = 1, - .x = 0, - .y = 0, }, { .output = 1, @@ -3021,6 +3052,8 @@ meta_test_monitor_custom_tiled_custom_resolution_config (void) }, { .current_mode = -1, + .x = 400, + .y = 0, } }, .n_crtcs = 2,