summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrea Azzarone <azzaronea@gmail.com>2018-07-16 18:09:40 +0200
committerAndrea Azzarone <azzaronea@gmail.com>2018-07-30 15:57:31 +0200
commit649c26e05a67c52a4f5acf6b4aa3b1217e9bc9c0 (patch)
treec91150eecb7ffd99867a390c1e6486b34fa9f7bf
parent48eaa36d41bb88d4831e40e9c3ef3c7afda195bc (diff)
downloadmutter-649c26e05a67c52a4f5acf6b4aa3b1217e9bc9c0.tar.gz
monitor-manager: Filter out low screen resolutions
Avoid exporting through org.gnome.Mutter.DisplayConfig.GetCurrentState excessively-low screen resolutions setting both a minimum width and a minimum height. GetCurrentState is e.g. used by Gnome Control Center to build a list of selectable resolutions. Fixes: https://bugzilla.gnome.org/show_bug.cgi?id=793223
-rw-r--r--src/backends/meta-monitor-manager.c4
-rw-r--r--src/backends/meta-monitor.c19
-rw-r--r--src/backends/meta-monitor.h2
3 files changed, 23 insertions, 2 deletions
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 610499f1c..3850dd0b9 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1302,9 +1302,13 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton,
GVariantBuilder mode_properties_builder;
MetaCrtcModeFlag mode_flags;
+ if (!meta_monitor_mode_should_be_advertised (monitor_mode))
+ continue;
+
mode_id = meta_monitor_mode_get_id (monitor_mode);
meta_monitor_mode_get_resolution (monitor_mode,
&mode_width, &mode_height);
+
refresh_rate = meta_monitor_mode_get_refresh_rate (monitor_mode);
preferred_scale =
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index 98330661e..92c61c037 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -1553,6 +1553,22 @@ meta_monitor_calculate_mode_scale (MetaMonitor *monitor,
return calculate_scale (monitor, monitor_mode);
}
+static gboolean
+is_logical_size_large_enough (gint width, gint height)
+{
+ return width >= MINIMUM_LOGICAL_WIDTH &&
+ height >= MINIMUM_LOGICAL_HEIGHT;
+}
+
+gboolean
+meta_monitor_mode_should_be_advertised (MetaMonitorMode *monitor_mode)
+{
+ g_return_val_if_fail (monitor_mode != NULL, FALSE);
+
+ return is_logical_size_large_enough (monitor_mode->spec.width,
+ monitor_mode->spec.height);
+}
+
static float
get_closest_scale_factor_for_resolution (float width,
float height,
@@ -1573,8 +1589,7 @@ get_closest_scale_factor_for_resolution (float width,
if (scale < MINIMUM_SCALE_FACTOR ||
scale > MAXIMUM_SCALE_FACTOR ||
- floorf (scaled_w) < MINIMUM_LOGICAL_WIDTH ||
- floorf (scaled_h) < MINIMUM_LOGICAL_HEIGHT)
+ !is_logical_size_large_enough (floorf (scaled_w), floorf (scaled_h)))
goto out;
if (floorf (scaled_w) == scaled_w && floorf (scaled_h) == scaled_h)
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index bc7977886..213ff2cbb 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -219,6 +219,8 @@ gboolean meta_monitor_mode_foreach_output (MetaMonitor *monitor,
gpointer user_data,
GError **error);
+gboolean meta_monitor_mode_should_be_advertised (MetaMonitorMode *monitor_mode);
+
MetaMonitorSpec * meta_monitor_spec_clone (MetaMonitorSpec *monitor_id);
gboolean meta_monitor_spec_equals (MetaMonitorSpec *monitor_id,