From 32fd1e8c08055345d681525576699f61d351c807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Wed, 12 Jul 2017 15:42:20 +0800 Subject: [PATCH] monitor-manager: Let the MetaMonitor derive the whole layout Instead of letting MetaMonitor derive the logical monitor size, then using the main monitor for the position, just let MetaMonitor derive the whole layout including the position. This means it can deal with tiled monitors better, for example when the main output (the output always active when the monitor is active) is not the origin output (the output with tile position (0, 0)). https://bugzilla.gnome.org/show_bug.cgi?id=781723 --- src/backends/meta-monitor-manager.c | 29 +--------------------- src/backends/meta-monitor.c | 37 ++++++++++++++++------------- src/backends/meta-monitor.h | 10 ++++---- 3 files changed, 26 insertions(+), 50 deletions(-) diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index f83f39104..8112f290c 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -158,33 +158,6 @@ meta_monitor_manager_rebuild_logical_monitors (MetaMonitorManager *manager, primary_logical_monitor); } -static void -derive_monitor_layout (MetaMonitor *monitor, - MetaRectangle *layout) -{ - GList *outputs; - GList *l; - int x = INT_MAX; - int y = INT_MAX; - - outputs = meta_monitor_get_outputs (monitor); - for (l = outputs; l; l = l->next) - { - MetaOutput *output = l->data; - - if (!output->crtc) - continue; - - x = MIN (x, output->crtc->rect.x); - y = MIN (y, output->crtc->rect.y); - } - - layout->x = x; - layout->y = y; - - meta_monitor_derive_dimensions (monitor, &layout->width, &layout->height); -} - static float derive_configured_global_scale (MetaMonitorManager *manager) { @@ -283,7 +256,7 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager if (!meta_monitor_is_active (monitor)) continue; - derive_monitor_layout (monitor, &layout); + meta_monitor_derive_layout (monitor, &layout); logical_monitor = logical_monitor_from_layout (manager, logical_monitors, &layout); if (logical_monitor) diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 7c2ba11cd..c2477e60d 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -258,11 +258,10 @@ meta_monitor_get_current_resolution (MetaMonitor *monitor, } void -meta_monitor_derive_dimensions (MetaMonitor *monitor, - int *width, - int *height) +meta_monitor_derive_layout (MetaMonitor *monitor, + MetaRectangle *layout) { - META_MONITOR_GET_CLASS (monitor)->derive_dimensions (monitor, width, height); + META_MONITOR_GET_CLASS (monitor)->derive_layout (monitor, layout); } void @@ -464,15 +463,18 @@ meta_monitor_normal_get_main_output (MetaMonitor *monitor) } static void -meta_monitor_normal_derive_dimensions (MetaMonitor *monitor, - int *width, - int *height) +meta_monitor_normal_derive_layout (MetaMonitor *monitor, + MetaRectangle *layout) { MetaOutput *output; output = meta_monitor_get_main_output (monitor); - *width = output->crtc->rect.width; - *height = output->crtc->rect.height; + *layout = (MetaRectangle) { + .x = output->crtc->rect.x, + .y = output->crtc->rect.y, + .width = output->crtc->rect.width, + .height = output->crtc->rect.height + }; } static gboolean @@ -515,7 +517,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass) MetaMonitorClass *monitor_class = META_MONITOR_CLASS (klass); monitor_class->get_main_output = meta_monitor_normal_get_main_output; - monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions; + monitor_class->derive_layout = meta_monitor_normal_derive_layout; monitor_class->calculate_crtc_pos = meta_monitor_normal_calculate_crtc_pos; monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position; } @@ -1101,9 +1103,8 @@ meta_monitor_tiled_get_main_output (MetaMonitor *monitor) } static void -meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor, - int *out_width, - int *out_height) +meta_monitor_derived_derive_layout (MetaMonitor *monitor, + MetaRectangle *layout) { MetaMonitorPrivate *monitor_priv = meta_monitor_get_instance_private (monitor); @@ -1127,8 +1128,12 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor, max_y = MAX (output->crtc->rect.y + output->crtc->rect.height, max_y); } - *out_width = max_x - min_x; - *out_height = max_y - min_y; + *layout = (MetaRectangle) { + .x = min_x, + .y = min_y, + .width = max_x - min_x, + .height = max_y - min_y + }; } static gboolean @@ -1186,7 +1191,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass) object_class->finalize = meta_monitor_tiled_finalize; monitor_class->get_main_output = meta_monitor_tiled_get_main_output; - monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions; + monitor_class->derive_layout = meta_monitor_derived_derive_layout; monitor_class->calculate_crtc_pos = meta_monitor_tiled_calculate_crtc_pos; monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position; } diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index fa9654b09..3a6307c85 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -68,9 +68,8 @@ struct _MetaMonitorClass GObjectClass parent_class; MetaOutput * (* get_main_output) (MetaMonitor *monitor); - void (* derive_dimensions) (MetaMonitor *monitor, - int *width, - int *height); + void (* derive_layout) (MetaMonitor *monitor, + MetaRectangle *layout); void (* calculate_crtc_pos) (MetaMonitor *monitor, MetaMonitorMode *monitor_mode, MetaOutput *output, @@ -118,9 +117,8 @@ void meta_monitor_get_current_resolution (MetaMonitor *monitor, int *width, int *height); -void meta_monitor_derive_dimensions (MetaMonitor *monitor, - int *width, - int *height); +void meta_monitor_derive_layout (MetaMonitor *monitor, + MetaRectangle *layout); void meta_monitor_get_physical_dimensions (MetaMonitor *monitor, int *width_mm,