diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c index 0253e072f..8b0b9f9b5 100644 --- a/src/backends/meta-monitor-config-manager.c +++ b/src/backends/meta-monitor-config-manager.c @@ -700,6 +700,7 @@ create_preferred_logical_monitor_config (MetaMonitorManager *monitor_ma scale = primary_logical_monitor_config->scale; else scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, + layout_mode, monitor, mode); @@ -1087,6 +1088,7 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager) GList *l; MetaMonitorsConfig *monitors_config; + layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager); monitors = meta_monitor_manager_get_monitors (monitor_manager); monitor = monitors->data; modes = meta_monitor_get_modes (monitor); @@ -1159,7 +1161,9 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager) if (!mode) continue; - scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, monitor, mode); + scale = meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, + layout_mode, + monitor, mode); best_scale = MAX (best_scale, scale); monitor_configs = g_list_prepend (monitor_configs, create_monitor_config (monitor, mode)); } @@ -1177,7 +1181,6 @@ create_for_switch_config_all_mirror (MetaMonitorConfigManager *config_manager) }; logical_monitor_configs = g_list_append (NULL, logical_monitor_config); - layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager); monitors_config = meta_monitors_config_new (monitor_manager, logical_monitor_configs, layout_mode, diff --git a/src/backends/meta-monitor-config-migration.c b/src/backends/meta-monitor-config-migration.c index d619dc433..69c426cd7 100644 --- a/src/backends/meta-monitor-config-migration.c +++ b/src/backends/meta-monitor-config-migration.c @@ -1190,6 +1190,9 @@ meta_finish_monitors_config_migration (MetaMonitorManager *monitor_manager, MetaMonitorConfigStore *config_store = meta_monitor_config_manager_get_store (config_manager); GList *l; + MetaLogicalMonitorLayoutMode layout_mode; + + layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager); for (l = config->logical_monitor_configs; l; l = l->next) { @@ -1199,7 +1202,6 @@ meta_finish_monitors_config_migration (MetaMonitorManager *monitor_manager, MetaMonitor *monitor; MetaMonitorModeSpec *monitor_mode_spec; MetaMonitorMode *monitor_mode; - float scale; monitor_config = logical_monitor_config->monitor_configs->data; monitor_spec = monitor_config->monitor_spec; @@ -1215,13 +1217,14 @@ meta_finish_monitors_config_migration (MetaMonitorManager *monitor_manager, return FALSE; } - scale = meta_monitor_calculate_mode_scale (monitor, monitor_mode); - - logical_monitor_config->scale = scale; + logical_monitor_config->scale = + meta_monitor_manager_calculate_monitor_mode_scale (monitor_manager, + layout_mode, + monitor, + monitor_mode); } - config->layout_mode = - meta_monitor_manager_get_default_layout_mode (monitor_manager); + config->layout_mode = layout_mode; config->flags &= ~META_MONITORS_CONFIG_FLAG_MIGRATED; if (!meta_verify_monitors_config (config, monitor_manager, error)) diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c index d08fb022b..66d15bda0 100644 --- a/src/backends/meta-monitor-manager-dummy.c +++ b/src/backends/meta-monitor-manager-dummy.c @@ -638,9 +638,10 @@ meta_monitor_manager_dummy_is_transform_handled (MetaMonitorManager *manager, } static float -meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +meta_monitor_manager_dummy_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) { MetaOutput *output; MetaOutputDummy *output_dummy; diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h index 60c1e9082..a05a7231e 100644 --- a/src/backends/meta-monitor-manager-private.h +++ b/src/backends/meta-monitor-manager-private.h @@ -241,9 +241,10 @@ struct _MetaMonitorManagerClass MetaCrtc *crtc, MetaMonitorTransform transform); - float (* calculate_monitor_mode_scale) (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode); + float (* calculate_monitor_mode_scale) (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode); float * (* calculate_supported_scales) (MetaMonitorManager *manager, MetaLogicalMonitorLayoutMode layout_mode, @@ -366,9 +367,10 @@ void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManage gboolean meta_monitor_manager_is_headless (MetaMonitorManager *manager); -float meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode); +float meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode); float * meta_monitor_manager_calculate_supported_scales (MetaMonitorManager *, MetaLogicalMonitorLayoutMode , diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index e6d50bd99..1e08f3a82 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -230,6 +230,7 @@ calculate_monitor_scale (MetaMonitorManager *manager, monitor_mode = meta_monitor_get_current_mode (monitor); return meta_monitor_manager_calculate_monitor_mode_scale (manager, + manager->layout_mode, monitor, monitor_mode); } @@ -432,14 +433,16 @@ meta_monitor_manager_is_headless (MetaMonitorManager *manager) } float -meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +meta_monitor_manager_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) { MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager); return manager_class->calculate_monitor_mode_scale (manager, + layout_mode, monitor, monitor_mode); } @@ -1562,6 +1565,7 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, preferred_scale = meta_monitor_manager_calculate_monitor_mode_scale (manager, + manager->layout_mode, monitor, monitor_mode); diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index e02f8ed45..41f30eeb3 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -1657,8 +1657,9 @@ meta_monitor_calculate_crtc_pos (MetaMonitor *monitor, #define SMALLEST_4K_WIDTH 3656 static float -calculate_scale (MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +calculate_scale (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaMonitorScalesConstraint constraints) { int resolution_width, resolution_height; int width_mm, height_mm; @@ -1714,8 +1715,9 @@ out: } float -meta_monitor_calculate_mode_scale (MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +meta_monitor_calculate_mode_scale (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaMonitorScalesConstraint constraints) { MetaBackend *backend = meta_get_backend (); MetaSettings *settings = meta_backend_get_settings (backend); @@ -1725,7 +1727,7 @@ meta_monitor_calculate_mode_scale (MetaMonitor *monitor, &global_scaling_factor)) return global_scaling_factor; - return calculate_scale (monitor, monitor_mode); + return calculate_scale (monitor, monitor_mode, constraints); } static gboolean diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h index 341657ae3..c1b62806e 100644 --- a/src/backends/meta-monitor.h +++ b/src/backends/meta-monitor.h @@ -211,8 +211,9 @@ void meta_monitor_calculate_crtc_pos (MetaMonitor *monitor, int *out_y); META_EXPORT_TEST -float meta_monitor_calculate_mode_scale (MetaMonitor *monitor, - MetaMonitorMode *monitor_mode); +float meta_monitor_calculate_mode_scale (MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + MetaMonitorScalesConstraint constraints); META_EXPORT_TEST float * meta_monitor_calculate_supported_scales (MetaMonitor *monitor, diff --git a/src/backends/native/meta-monitor-manager-native.c b/src/backends/native/meta-monitor-manager-native.c index fd5e7784f..2d598af12 100644 --- a/src/backends/native/meta-monitor-manager-native.c +++ b/src/backends/native/meta-monitor-manager-native.c @@ -34,6 +34,7 @@ * See also #MetaMonitorManagerXrandr for an implementation using XRandR. */ +#include "backends/meta-monitor.h" #include "config.h" #include "backends/native/meta-monitor-manager-native.h" @@ -571,20 +572,8 @@ meta_monitor_manager_native_is_transform_handled (MetaMonitorManager *manager, transform); } -static float -meta_monitor_manager_native_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) -{ - return meta_monitor_calculate_mode_scale (monitor, monitor_mode); -} - -static float * -meta_monitor_manager_native_calculate_supported_scales (MetaMonitorManager *manager, - MetaLogicalMonitorLayoutMode layout_mode, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode, - int *n_supported_scales) +static MetaMonitorScalesConstraint +get_monitor_scale_constraints_from_layout_mode (MetaLogicalMonitorLayoutMode layout_mode) { MetaMonitorScalesConstraint constraints = META_MONITOR_SCALES_CONSTRAINT_NONE; @@ -598,6 +587,31 @@ meta_monitor_manager_native_calculate_supported_scales (MetaMonitorManager break; } + return constraints; +} + +static float +meta_monitor_manager_native_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) +{ + MetaMonitorScalesConstraint constraints = + get_monitor_scale_constraints_from_layout_mode (layout_mode); + + return meta_monitor_calculate_mode_scale (monitor, monitor_mode, constraints); +} + +static float * +meta_monitor_manager_native_calculate_supported_scales (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode, + int *n_supported_scales) +{ + MetaMonitorScalesConstraint constraints = + get_monitor_scale_constraints_from_layout_mode (layout_mode); + return meta_monitor_calculate_supported_scales (monitor, monitor_mode, constraints, n_supported_scales); diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c index 489a9b424..adf196079 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c @@ -880,11 +880,15 @@ meta_monitor_manager_xrandr_is_transform_handled (MetaMonitorManager *manager, } static float -meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) { - return meta_monitor_calculate_mode_scale (monitor, monitor_mode); + MetaMonitorScalesConstraint constraints; + + constraints = META_MONITOR_SCALES_CONSTRAINT_NO_FRAC; + return meta_monitor_calculate_mode_scale (monitor, monitor_mode, constraints); } static void diff --git a/src/tests/meta-monitor-manager-test.c b/src/tests/meta-monitor-manager-test.c index e3b4f46cf..efff2361c 100644 --- a/src/tests/meta-monitor-manager-test.c +++ b/src/tests/meta-monitor-manager-test.c @@ -291,9 +291,10 @@ meta_monitor_manager_test_is_transform_handled (MetaMonitorManager *manager, } static float -meta_monitor_manager_test_calculate_monitor_mode_scale (MetaMonitorManager *manager, - MetaMonitor *monitor, - MetaMonitorMode *monitor_mode) +meta_monitor_manager_test_calculate_monitor_mode_scale (MetaMonitorManager *manager, + MetaLogicalMonitorLayoutMode layout_mode, + MetaMonitor *monitor, + MetaMonitorMode *monitor_mode) { MetaOutput *output; MetaOutputTest *output_test;