monitor-manager: Filter out low screen resolutions
authorAndrea Azzarone <azzaronea@gmail.com>
Mon, 16 Jul 2018 16:09:40 +0000 (18:09 +0200)
committerSimon McVittie <smcv@debian.org>
Tue, 31 Jul 2018 14:35:03 +0000 (15:35 +0100)
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
(cherry picked from commit 649c26e05a67c52a4f5acf6b4aa3b1217e9bc9c0)

Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/gnome-control-center/+bug/1772831
Bug-GNOME: https://bugzilla.gnome.org/show_bug.cgi?id=793223
Applied-Upstream: 3.28.4, commit:https://gitlab.gnome.org/GNOME/mutter/commit/0c5e61a2a

Gbp-Pq: Name monitor-manager-Filter-out-low-screen-resolutions.patch

src/backends/meta-monitor-manager.c
src/backends/meta-monitor.c
src/backends/meta-monitor.h

index 5bd34ad479824302bf33aeb28128c05b39a9e02b..c4c1db5ed81e629a63817293724dd3cb4c54f3d5 100644 (file)
@@ -1323,9 +1323,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 =
index 98330661ef9817b9cbbab933825fb003c681a558..92c61c0377847d35f0793e531f5d04158d20eeff 100644 (file)
@@ -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)
index bc79778866bfce8ba1c7e24199c8672ab682cb0a..213ff2cbb583e30d87c9f5e2668748df77e0edc7 100644 (file)
@@ -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,