From 1ac63fcd77a25b1d1c529adf94cb108ed2d0e400 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 23 Nov 2018 22:35:51 -0500 Subject: [PATCH] monitor-manager-xrandr: Use monitor to calculate scaling In Xrandr we were caching the available scaling modes that were computed just for the current mode, for each monitor, while we can actually reuse the default implementation, by just passing the proper scaling constraint. In monitor we need then to properly filter these values, by only accepting integer scaling factors that would allow to have a minimal logical monitor size. Fixes https://gitlab.gnome.org/GNOME/mutter/issues/407 Part-of: --- src/backends/meta-monitor.c | 41 ++++--- .../x11/meta-monitor-manager-xrandr.c | 104 ++---------------- 2 files changed, 35 insertions(+), 110 deletions(-) diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c index 41f30eeb3..d4fb3c0bd 100644 --- a/src/backends/meta-monitor.c +++ b/src/backends/meta-monitor.c @@ -1737,6 +1737,18 @@ is_logical_size_large_enough (int width, return width * height >= MINIMUM_LOGICAL_AREA; } +static gboolean +is_scale_valid_for_size (float width, + float height, + float scale) +{ + if (scale < MINIMUM_SCALE_FACTOR || scale > MAXIMUM_SCALE_FACTOR) + return FALSE; + + return is_logical_size_large_enough (floorf (width / scale), + floorf (height / scale)); +} + gboolean meta_monitor_mode_should_be_advertised (MetaMonitorMode *monitor_mode) { @@ -1766,20 +1778,16 @@ get_closest_scale_factor_for_resolution (float width, gboolean found_one; best_scale = 0; - scaled_w = width / scale; - scaled_h = height / scale; - if (scale < MINIMUM_SCALE_FACTOR || - scale > MAXIMUM_SCALE_FACTOR || - !is_logical_size_large_enough (floorf (scaled_w), floorf (scaled_h))) + if (!is_scale_valid_for_size (width, height, scale)) goto out; - if (floorf (scaled_w) == scaled_w && floorf (scaled_h) == scaled_h) + if (fmodf (width, scale) == 0.0 && fmodf (height, scale) == 0.0) return scale; i = 0; found_one = FALSE; - base_scaled_w = floorf (scaled_w); + base_scaled_w = floorf (width / scale); do { @@ -1840,15 +1848,20 @@ meta_monitor_calculate_supported_scales (MetaMonitor *monitor, float scale; float scale_value = i + j * SCALE_FACTORS_STEPS; - if ((constraints & META_MONITOR_SCALES_CONSTRAINT_NO_FRAC) && - fmodf (scale_value, 1.0) != 0.0) + if (constraints & META_MONITOR_SCALES_CONSTRAINT_NO_FRAC) { - continue; - } + if (fmodf (scale_value, 1.0) != 0.0 || + !is_scale_valid_for_size (width, height, scale_value)) + continue; - scale = get_closest_scale_factor_for_resolution (width, - height, - scale_value); + scale = scale_value; + } + else + { + scale = get_closest_scale_factor_for_resolution (width, + height, + scale_value); + } if (scale > 0.0f) g_array_append_val (supported_scales, scale); diff --git a/src/backends/x11/meta-monitor-manager-xrandr.c b/src/backends/x11/meta-monitor-manager-xrandr.c index adf196079..e99e1656b 100644 --- a/src/backends/x11/meta-monitor-manager-xrandr.c +++ b/src/backends/x11/meta-monitor-manager-xrandr.c @@ -77,9 +77,6 @@ struct _MetaMonitorManagerXrandr xcb_timestamp_t last_xrandr_set_timestamp; GHashTable *tiled_monitor_atoms; - - float *supported_scales; - int n_supported_scales; }; struct _MetaMonitorManagerXrandrClass @@ -584,17 +581,6 @@ meta_monitor_manager_xrandr_ensure_initial_config (MetaMonitorManager *manager) meta_monitor_manager_update_logical_state_derived (manager, config); } -static void -meta_monitor_manager_xrandr_rebuild_derived (MetaMonitorManager *manager, - MetaMonitorsConfig *config) -{ - MetaMonitorManagerXrandr *manager_xrandr = - META_MONITOR_MANAGER_XRANDR (manager); - - g_clear_pointer (&manager_xrandr->supported_scales, g_free); - meta_monitor_manager_rebuild_derived (manager, config); -} - static gboolean meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *manager, MetaMonitorsConfig *config, @@ -609,7 +595,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana if (!manager->in_init) apply_crtc_assignments (manager, TRUE, NULL, 0, NULL, 0); - meta_monitor_manager_xrandr_rebuild_derived (manager, NULL); + meta_monitor_manager_rebuild_derived (manager, NULL); return TRUE; } @@ -644,7 +630,7 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana } else { - meta_monitor_manager_xrandr_rebuild_derived (manager, config); + meta_monitor_manager_rebuild_derived (manager, config); } } @@ -891,77 +877,6 @@ meta_monitor_manager_xrandr_calculate_monitor_mode_scale (MetaMonitorManager return meta_monitor_calculate_mode_scale (monitor, monitor_mode, constraints); } -static void -add_supported_scale (GArray *supported_scales, - float scale) -{ - unsigned int i; - - for (i = 0; i < supported_scales->len; i++) - { - float supported_scale = g_array_index (supported_scales, float, i); - - if (scale == supported_scale) - return; - } - - g_array_append_val (supported_scales, scale); -} - -static int -compare_scales (gconstpointer a, - gconstpointer b) -{ - float f = *(float *) a - *(float *) b; - - if (f < 0) - return -1; - if (f > 0) - return 1; - return 0; -} - -static void -ensure_supported_monitor_scales (MetaMonitorManager *manager) -{ - MetaMonitorManagerXrandr *manager_xrandr = - META_MONITOR_MANAGER_XRANDR (manager); - MetaMonitorScalesConstraint constraints; - GList *l; - GArray *supported_scales; - - if (manager_xrandr->supported_scales) - return; - - constraints = META_MONITOR_SCALES_CONSTRAINT_NO_FRAC; - supported_scales = g_array_new (FALSE, FALSE, sizeof (float)); - - for (l = manager->monitors; l; l = l->next) - { - MetaMonitor *monitor = l->data; - MetaMonitorMode *monitor_mode; - float *monitor_scales; - int n_monitor_scales; - int i; - - monitor_mode = meta_monitor_get_preferred_mode (monitor); - monitor_scales = - meta_monitor_calculate_supported_scales (monitor, - monitor_mode, - constraints, - &n_monitor_scales); - - for (i = 0; i < n_monitor_scales; i++) - add_supported_scale (supported_scales, monitor_scales[i]); - g_array_sort (supported_scales, compare_scales); - g_free (monitor_scales); - } - - manager_xrandr->supported_scales = (float *) supported_scales->data; - manager_xrandr->n_supported_scales = supported_scales->len; - g_array_free (supported_scales, FALSE); -} - static float * meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager *manager, MetaLogicalMonitorLayoutMode layout_mode, @@ -969,14 +884,12 @@ meta_monitor_manager_xrandr_calculate_supported_scales (MetaMonitorManager MetaMonitorMode *monitor_mode, int *n_supported_scales) { - MetaMonitorManagerXrandr *manager_xrandr = - META_MONITOR_MANAGER_XRANDR (manager); + MetaMonitorScalesConstraint constraints; - ensure_supported_monitor_scales (manager); - - *n_supported_scales = manager_xrandr->n_supported_scales; - return g_memdup2 (manager_xrandr->supported_scales, - manager_xrandr->n_supported_scales * sizeof (float)); + constraints = META_MONITOR_SCALES_CONSTRAINT_NO_FRAC; + return meta_monitor_calculate_supported_scales (monitor, monitor_mode, + constraints, + n_supported_scales); } static MetaMonitorManagerCapability @@ -1063,7 +976,6 @@ meta_monitor_manager_xrandr_finalize (GObject *object) MetaMonitorManagerXrandr *manager_xrandr = META_MONITOR_MANAGER_XRANDR (object); g_hash_table_destroy (manager_xrandr->tiled_monitor_atoms); - g_free (manager_xrandr->supported_scales); G_OBJECT_CLASS (meta_monitor_manager_xrandr_parent_class)->finalize (object); } @@ -1148,7 +1060,7 @@ meta_monitor_manager_xrandr_handle_xevent (MetaMonitorManagerXrandr *manager_xra config = NULL; } - meta_monitor_manager_xrandr_rebuild_derived (manager, config); + meta_monitor_manager_rebuild_derived (manager, config); } return TRUE;