From 979bc4390a8e0d4d9141c8419599241df0741e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 24 Feb 2017 18:01:17 +0800 Subject: [PATCH] monitor-manager-dummy: Don't set up state at the wrong time Don't set the CRTC rect and screen size at in read_current(), as those depends on how the configuration is done. Instead, don't set the CRTC rect at all, and update the screen dimensions when being configured. https://bugzilla.gnome.org/show_bug.cgi?id=779745 --- src/backends/meta-monitor-manager-dummy.c | 59 ++++++++++++++++++----- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c index bd003e247..dff8f4755 100644 --- a/src/backends/meta-monitor-manager-dummy.c +++ b/src/backends/meta-monitor-manager-dummy.c @@ -111,8 +111,6 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager) manager->max_screen_width = 65535; manager->max_screen_height = 65535; - manager->screen_width = 1024 * num_monitors; - manager->screen_height = 768; manager->modes = g_new0 (MetaCrtcMode, 1); manager->n_modes = 1; @@ -130,11 +128,7 @@ meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager) for (i = 0; i < num_monitors; i++) { manager->crtcs[i].crtc_id = i + 1; - manager->crtcs[i].rect.x = current_x; - manager->crtcs[i].rect.y = 0; - manager->crtcs[i].rect.width = manager->modes[0].width; - manager->crtcs[i].rect.height = manager->modes[0].height; - manager->crtcs[i].current_mode = &manager->modes[0]; + manager->crtcs[i].current_mode = NULL; manager->crtcs[i].transform = META_MONITOR_TRANSFORM_NORMAL; manager->crtcs[i].all_transforms = ALL_TRANSFORMS; manager->crtcs[i].is_dirty = FALSE; @@ -191,7 +185,6 @@ apply_crtc_assignments (MetaMonitorManager *manager, unsigned int n_outputs) { unsigned i; - int screen_width = 0, screen_height = 0; for (i = 0; i < n_crtcs; i++) { @@ -234,9 +227,6 @@ apply_crtc_assignments (MetaMonitorManager *manager, crtc->current_mode = mode; crtc->transform = crtc_info->transform; - screen_width = MAX (screen_width, crtc_info->x + width); - screen_height = MAX (screen_height, crtc_info->y + height); - for (j = 0; j < crtc_info->outputs->len; j++) { output = ((MetaOutput**)crtc_info->outputs->pdata)[j]; @@ -290,6 +280,32 @@ apply_crtc_assignments (MetaMonitorManager *manager, output->crtc = NULL; output->is_primary = FALSE; } +} + +static void +update_screen_size (MetaMonitorManager *manager, + MetaMonitorsConfig *config) +{ + GList *l; + int screen_width = 0; + int screen_height = 0; + + for (l = config->logical_monitor_configs; l; l = l->next) + { + MetaLogicalMonitorConfig *logical_monitor_config = l->data; + int right_edge; + int bottom_edge; + + right_edge = (logical_monitor_config->layout.width + + logical_monitor_config->layout.x); + if (right_edge > screen_width) + screen_width = right_edge; + + bottom_edge = (logical_monitor_config->layout.height + + logical_monitor_config->layout.y); + if (bottom_edge > screen_height) + screen_height = bottom_edge; + } manager->screen_width = screen_width; manager->screen_height = screen_height; @@ -317,11 +333,30 @@ meta_monitor_manager_dummy_apply_monitors_config (MetaMonitorManager *manager, g_ptr_array_free (crtc_infos, TRUE); g_ptr_array_free (output_infos, TRUE); + update_screen_size (manager, config); meta_monitor_manager_rebuild (manager, config); return TRUE; } +static void +legacy_calculate_screen_size (MetaMonitorManager *manager) +{ + unsigned int i; + int width = 0, height = 0; + + for (i = 0; i < manager->n_crtcs; i++) + { + MetaCrtc *crtc = &manager->crtcs[i]; + + width = MAX (width, crtc->rect.x + crtc->rect.width); + height = MAX (height, crtc->rect.y + crtc->rect.height); + } + + manager->screen_width = width; + manager->screen_height = height; +} + static void meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager, MetaCrtcInfo **crtcs, @@ -331,6 +366,8 @@ meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager, { apply_crtc_assignments (manager, crtcs, n_crtcs, outputs, n_outputs); + legacy_calculate_screen_size (manager); + meta_monitor_manager_rebuild_derived (manager); }