[mutter] monitor-config-manager: Use single filter function to build configs
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-config-manager: Use single filter function to build configs
- Date: Wed, 4 Aug 2021 14:30:25 +0000 (UTC)
commit 4574f2d9afd10874b32955741e5eae3e5d27d2e9
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date: Wed Mar 27 06:22:15 2019 +0100
monitor-config-manager: Use single filter function to build configs
Add a find_monitors function that allows to search for monitors that match
the MonitorMatchRule filter and use this to look for the primary monitor and
the other monitors that need to match the requested filter in order to be
configured.
Having just one function doing this kind of checks reduces the possibility
of unexpected results.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/522>
src/backends/meta-monitor-config-manager.c | 146 ++++++++++++++++++-----------
1 file changed, 91 insertions(+), 55 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 9de418a5d6..6d695dd571 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -542,19 +542,76 @@ meta_monitor_config_manager_get_stored (MetaMonitorConfigManager *config_manager
typedef enum _MonitorMatchRule
{
MONITOR_MATCH_ALL = 0,
- MONITOR_MATCH_EXTERNAL = (1 << 0)
+ MONITOR_MATCH_EXTERNAL = (1 << 0),
+ MONITOR_MATCH_BUILTIN = (1 << 1),
+ MONITOR_MATCH_VISIBLE = (1 << 2),
+ MONITOR_MATCH_WITH_SUGGESTED_POSITION = (1 << 3),
} MonitorMatchRule;
+static gboolean
+monitor_matches_rule (MetaMonitor *monitor,
+ MetaMonitorManager *monitor_manager,
+ MonitorMatchRule match_rule)
+{
+ if (!monitor)
+ return FALSE;
+
+ if (match_rule & MONITOR_MATCH_BUILTIN)
+ {
+ if (!meta_monitor_is_laptop_panel (monitor))
+ return FALSE;
+ }
+ else if (match_rule & MONITOR_MATCH_EXTERNAL)
+ {
+ if (meta_monitor_is_laptop_panel (monitor))
+ return FALSE;
+ }
+
+ if (match_rule & MONITOR_MATCH_VISIBLE)
+ {
+ if (meta_monitor_is_laptop_panel (monitor) &&
+ is_lid_closed (monitor_manager))
+ return FALSE;
+ }
+
+ if (match_rule & MONITOR_MATCH_WITH_SUGGESTED_POSITION)
+ {
+ if (!meta_monitor_get_suggested_position (monitor, NULL, NULL))
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+static GList *
+find_monitors (MetaMonitorManager *monitor_manager,
+ MonitorMatchRule match_rule)
+{
+ GList *result = NULL;
+ GList *monitors, *l;
+
+ monitors = meta_monitor_manager_get_monitors (monitor_manager);
+ for (l = g_list_last (monitors); l; l = l->prev)
+ {
+ MetaMonitor *monitor = l->data;
+
+ if (monitor_matches_rule (monitor, monitor_manager, match_rule))
+ result = g_list_prepend (result, monitor);
+ }
+
+ return result;
+}
+
static MetaMonitor *
find_monitor_with_highest_preferred_resolution (MetaMonitorManager *monitor_manager,
MonitorMatchRule match_rule)
{
- GList *monitors;
+ g_autoptr (GList) monitors = NULL;
GList *l;
int largest_area = 0;
MetaMonitor *largest_monitor = NULL;
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
+ monitors = find_monitors (monitor_manager, match_rule);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
@@ -562,12 +619,6 @@ find_monitor_with_highest_preferred_resolution (MetaMonitorManager *monitor_mana
int width, height;
int area;
- if (match_rule & MONITOR_MATCH_EXTERNAL)
- {
- if (meta_monitor_is_laptop_panel (monitor))
- continue;
- }
-
mode = meta_monitor_get_preferred_mode (monitor);
meta_monitor_mode_get_resolution (mode, &width, &height);
area = width * height;
@@ -593,38 +644,28 @@ find_monitor_with_highest_preferred_resolution (MetaMonitorManager *monitor_mana
* alternatives, except if no other alternatives exist.
*/
static MetaMonitor *
-find_primary_monitor (MetaMonitorManager *monitor_manager)
+find_primary_monitor (MetaMonitorManager *monitor_manager,
+ MonitorMatchRule match_rule)
{
MetaMonitor *monitor;
- if (is_lid_closed (monitor_manager))
- {
- monitor = meta_monitor_manager_get_primary_monitor (monitor_manager);
- if (monitor && !meta_monitor_is_laptop_panel (monitor))
- return monitor;
-
- monitor =
- find_monitor_with_highest_preferred_resolution (monitor_manager,
- MONITOR_MATCH_EXTERNAL);
- if (monitor)
- return monitor;
-
- return find_monitor_with_highest_preferred_resolution (monitor_manager,
- MONITOR_MATCH_ALL);
- }
- else
- {
- monitor = meta_monitor_manager_get_primary_monitor (monitor_manager);
- if (monitor)
- return monitor;
+ match_rule |= MONITOR_MATCH_VISIBLE;
- monitor = meta_monitor_manager_get_laptop_panel (monitor_manager);
- if (monitor)
- return monitor;
+ monitor = meta_monitor_manager_get_primary_monitor (monitor_manager);
+ if (monitor_matches_rule (monitor, monitor_manager, match_rule))
+ return monitor;
- return find_monitor_with_highest_preferred_resolution (monitor_manager,
- MONITOR_MATCH_ALL);
- }
+ monitor = meta_monitor_manager_get_laptop_panel (monitor_manager);
+ if (monitor_matches_rule (monitor, monitor_manager, match_rule))
+ return monitor;
+
+ monitor = find_monitor_with_highest_preferred_resolution (monitor_manager,
+ match_rule);
+ if (monitor)
+ return monitor;
+
+ return find_monitor_with_highest_preferred_resolution (monitor_manager,
+ MONITOR_MATCH_ALL);
}
static MetaMonitorConfig *
@@ -744,20 +785,22 @@ MetaMonitorsConfig *
meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_manager)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
+ g_autoptr (GList) monitors = NULL;
GList *logical_monitor_configs;
MetaMonitor *primary_monitor;
MetaLogicalMonitorLayoutMode layout_mode;
MetaLogicalMonitorConfig *primary_logical_monitor_config;
int x;
- GList *monitors;
GList *l;
MetaMonitorsConfig *monitors_config;
- primary_monitor = find_primary_monitor (monitor_manager);
+ primary_monitor = find_primary_monitor (monitor_manager,
+ MONITOR_MATCH_VISIBLE);
if (!primary_monitor)
return NULL;
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
+ monitors = find_monitors (monitor_manager, MONITOR_MATCH_VISIBLE);
primary_logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
@@ -770,7 +813,6 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
primary_logical_monitor_config);
x = primary_logical_monitor_config->layout.width;
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
@@ -779,10 +821,6 @@ meta_monitor_config_manager_create_linear (MetaMonitorConfigManager *config_mana
if (monitor == primary_monitor)
continue;
- if (meta_monitor_is_laptop_panel (monitor) &&
- is_lid_closed (monitor_manager))
- continue;
-
logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
monitor,
@@ -815,7 +853,7 @@ meta_monitor_config_manager_create_fallback (MetaMonitorConfigManager *config_ma
MetaLogicalMonitorLayoutMode layout_mode;
MetaLogicalMonitorConfig *primary_logical_monitor_config;
- primary_monitor = find_primary_monitor (monitor_manager);
+ primary_monitor = find_primary_monitor (monitor_manager, MONITOR_MATCH_ALL);
if (!primary_monitor)
return NULL;
@@ -842,21 +880,24 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
MetaLogicalMonitorConfig *primary_logical_monitor_config = NULL;
+ g_autoptr (GList) monitors = NULL;
MetaMonitor *primary_monitor;
MetaLogicalMonitorLayoutMode layout_mode;
GList *logical_monitor_configs;
GList *region;
- int x, y;
- GList *monitors;
GList *l;
+ int x, y;
- primary_monitor = find_primary_monitor (monitor_manager);
+ primary_monitor = find_primary_monitor (monitor_manager,
+ MONITOR_MATCH_WITH_SUGGESTED_POSITION);
if (!primary_monitor)
return NULL;
if (!meta_monitor_get_suggested_position (primary_monitor, &x, &y))
return NULL;
+ monitors = find_monitors (monitor_manager,
+ MONITOR_MATCH_WITH_SUGGESTED_POSITION);
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
primary_logical_monitor_config =
@@ -870,7 +911,6 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
primary_logical_monitor_config);
region = g_list_prepend (NULL, &primary_logical_monitor_config->layout);
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
@@ -879,8 +919,7 @@ meta_monitor_config_manager_create_suggested (MetaMonitorConfigManager *config_m
if (monitor == primary_monitor)
continue;
- if (!meta_monitor_get_suggested_position (monitor, &x, &y))
- continue;
+ meta_monitor_get_suggested_position (monitor, &x, &y);
logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
@@ -1211,24 +1250,21 @@ static MetaMonitorsConfig *
create_for_switch_config_external (MetaMonitorConfigManager *config_manager)
{
MetaMonitorManager *monitor_manager = config_manager->monitor_manager;
+ g_autoptr (GList) monitors = NULL;
GList *logical_monitor_configs = NULL;
int x = 0;
MetaLogicalMonitorLayoutMode layout_mode;
- GList *monitors;
GList *l;
MetaMonitorsConfig *monitors_config;
+ monitors = find_monitors (monitor_manager, MONITOR_MATCH_EXTERNAL);
layout_mode = meta_monitor_manager_get_default_layout_mode (monitor_manager);
- monitors = meta_monitor_manager_get_monitors (monitor_manager);
for (l = monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
MetaLogicalMonitorConfig *logical_monitor_config;
- if (meta_monitor_is_laptop_panel (monitor))
- continue;
-
logical_monitor_config =
create_preferred_logical_monitor_config (monitor_manager,
monitor,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]