summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2018-11-23 22:35:51 -0500
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2021-07-22 15:38:02 +0200
commit1ac63fcd77a25b1d1c529adf94cb108ed2d0e400 (patch)
treed62ae0995c826d4dea6c7d8ae9e7e0120f2db19d
parent67eb60c19a93d8399a691e3788b4c00279825d94 (diff)
downloadmutter-1ac63fcd77a25b1d1c529adf94cb108ed2d0e400.tar.gz
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: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/336>
-rw-r--r--src/backends/meta-monitor.c41
-rw-r--r--src/backends/x11/meta-monitor-manager-xrandr.c104
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);
-
- ensure_supported_monitor_scales (manager);
+ MetaMonitorScalesConstraint constraints;
- *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;