monitor-manager: Add forlease config to monitors.xml

Allow to configure a list of monitors as available for lease in
monitors.xml.

The monitors available for lease, must be disabled as well.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4112>
This commit is contained in:
José Expósito 2024-10-28 08:37:12 +01:00 committed by Marge Bot
parent 11ef52639f
commit 406de0d6d7
3 changed files with 103 additions and 1 deletions

View File

@ -1495,6 +1495,8 @@ meta_monitors_config_key_new (GList *logical_monitor_conf
} }
} }
/* Monitors for lease must be disabled (see meta_verify_monitors_config ()).
Therefore, there is no need to include them here. */
for (l = disabled_monitor_specs; l; l = l->next) for (l = disabled_monitor_specs; l; l = l->next)
{ {
MetaMonitorSpec *monitor_spec = l->data; MetaMonitorSpec *monitor_spec = l->data;
@ -1598,6 +1600,7 @@ meta_monitors_config_set_parent_config (MetaMonitorsConfig *config,
MetaMonitorsConfig * MetaMonitorsConfig *
meta_monitors_config_new_full (GList *logical_monitor_configs, meta_monitors_config_new_full (GList *logical_monitor_configs,
GList *disabled_monitor_specs, GList *disabled_monitor_specs,
GList *for_lease_monitor_specs,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags) MetaMonitorsConfigFlag flags)
{ {
@ -1606,6 +1609,7 @@ meta_monitors_config_new_full (GList *logical_monitor_con
config = g_object_new (META_TYPE_MONITORS_CONFIG, NULL); config = g_object_new (META_TYPE_MONITORS_CONFIG, NULL);
config->logical_monitor_configs = logical_monitor_configs; config->logical_monitor_configs = logical_monitor_configs;
config->disabled_monitor_specs = disabled_monitor_specs; config->disabled_monitor_specs = disabled_monitor_specs;
config->for_lease_monitor_specs = for_lease_monitor_specs;
config->layout_mode = layout_mode; config->layout_mode = layout_mode;
config->key = meta_monitors_config_key_new (logical_monitor_configs, config->key = meta_monitors_config_key_new (logical_monitor_configs,
disabled_monitor_specs, disabled_monitor_specs,
@ -1649,6 +1653,7 @@ meta_monitors_config_new (MetaMonitorManager *monitor_manager,
return meta_monitors_config_new_full (logical_monitor_configs, return meta_monitors_config_new_full (logical_monitor_configs,
disabled_monitor_specs, disabled_monitor_specs,
NULL,
layout_mode, layout_mode,
flags); flags);
} }
@ -1664,6 +1669,8 @@ meta_monitors_config_finalize (GObject *object)
(GDestroyNotify) meta_logical_monitor_config_free); (GDestroyNotify) meta_logical_monitor_config_free);
g_list_free_full (config->disabled_monitor_specs, g_list_free_full (config->disabled_monitor_specs,
(GDestroyNotify) meta_monitor_spec_free); (GDestroyNotify) meta_monitor_spec_free);
g_list_free_full (config->for_lease_monitor_specs,
(GDestroyNotify) meta_monitor_spec_free);
G_OBJECT_CLASS (meta_monitors_config_parent_class)->finalize (object); G_OBJECT_CLASS (meta_monitors_config_parent_class)->finalize (object);
} }
@ -1907,5 +1914,21 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
} }
} }
for (l = config->for_lease_monitor_specs; l; l = l->next)
{
MetaMonitorSpec *monitor_spec = l->data;
gpointer disabled = NULL;
disabled = g_list_find_custom (config->disabled_monitor_specs,
monitor_spec,
(GCompareFunc) meta_monitor_spec_compare);
if (!disabled)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"For lease monitor must be explicitly disabled");
return FALSE;
}
}
return TRUE; return TRUE;
} }

View File

@ -67,6 +67,7 @@ struct _MetaMonitorsConfig
GList *logical_monitor_configs; GList *logical_monitor_configs;
GList *disabled_monitor_specs; GList *disabled_monitor_specs;
GList *for_lease_monitor_specs;
MetaMonitorsConfigFlag flags; MetaMonitorsConfigFlag flags;
@ -142,6 +143,7 @@ void meta_monitor_config_manager_save_current (MetaMonitorConfigManager *config_
META_EXPORT_TEST META_EXPORT_TEST
MetaMonitorsConfig * meta_monitors_config_new_full (GList *logical_monitor_configs, MetaMonitorsConfig * meta_monitors_config_new_full (GList *logical_monitor_configs,
GList *disabled_monitors, GList *disabled_monitors,
GList *for_lease_monitors,
MetaLogicalMonitorLayoutMode layout_mode, MetaLogicalMonitorLayoutMode layout_mode,
MetaMonitorsConfigFlag flags); MetaMonitorsConfigFlag flags);

View File

@ -89,6 +89,14 @@
* <serial>Serial C</serial> * <serial>Serial C</serial>
* </monitorspec> * </monitorspec>
* </disabled> * </disabled>
* <forlease>
* <monitorspec>
* <connector>LVDS3</connector>
* <vendor>Vendor C</vendor>
* <product>Product C</product>
* <serial>Serial C</serial>
* </monitorspec>
* </forlease>
* </configuration> * </configuration>
* </monitors> * </monitors>
* *
@ -158,6 +166,7 @@ typedef enum
STATE_MONITOR_MAXBPC, STATE_MONITOR_MAXBPC,
STATE_MONITOR_RGB_RANGE, STATE_MONITOR_RGB_RANGE,
STATE_DISABLED, STATE_DISABLED,
STATE_FOR_LEASE,
STATE_POLICY, STATE_POLICY,
STATE_STORES, STATE_STORES,
STATE_STORE, STATE_STORE,
@ -184,6 +193,7 @@ typedef struct
MetaMonitorConfig *current_monitor_config; MetaMonitorConfig *current_monitor_config;
MetaLogicalMonitorConfig *current_logical_monitor_config; MetaLogicalMonitorConfig *current_logical_monitor_config;
GList *current_disabled_monitor_specs; GList *current_disabled_monitor_specs;
GList *current_for_lease_monitor_specs;
gboolean seen_policy; gboolean seen_policy;
gboolean seen_stores; gboolean seen_stores;
gboolean seen_dbus; gboolean seen_dbus;
@ -333,6 +343,10 @@ handle_start_element (GMarkupParseContext *context,
{ {
parser->state = STATE_DISABLED; parser->state = STATE_DISABLED;
} }
else if (g_str_equal (element_name, "forlease"))
{
parser->state = STATE_FOR_LEASE;
}
else else
{ {
enter_unknown_element (parser, element_name, enter_unknown_element (parser, element_name,
@ -578,6 +592,22 @@ handle_start_element (GMarkupParseContext *context,
return; return;
} }
case STATE_FOR_LEASE:
{
if (!g_str_equal (element_name, "monitorspec"))
{
g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ELEMENT,
"Invalid element '%s' under forlease", element_name);
return;
}
parser->current_monitor_spec = g_new0 (MetaMonitorSpec, 1);
parser->monitor_spec_parent_state = STATE_FOR_LEASE;
parser->state = STATE_MONITOR_SPEC;
return;
}
case STATE_POLICY: case STATE_POLICY:
{ {
if (!(parser->extra_config_flags & if (!(parser->extra_config_flags &
@ -673,6 +703,15 @@ finish_monitor_spec (ConfigParser *parser)
parser->current_monitor_spec); parser->current_monitor_spec);
parser->current_monitor_spec = NULL; parser->current_monitor_spec = NULL;
return;
}
case STATE_FOR_LEASE:
{
parser->current_for_lease_monitor_specs =
g_list_prepend (parser->current_for_lease_monitor_specs,
parser->current_monitor_spec);
parser->current_monitor_spec = NULL;
return; return;
} }
@ -729,12 +768,15 @@ static gboolean
detect_layout_mode_configs (MetaMonitorManager *monitor_manager, detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
GList *logical_monitor_configs, GList *logical_monitor_configs,
GList *disabled_monitor_specs, GList *disabled_monitor_specs,
GList *for_lease_monitor_specs,
MetaMonitorsConfigFlag config_flags, MetaMonitorsConfigFlag config_flags,
MetaMonitorsConfig **physical_layout_mode_config, MetaMonitorsConfig **physical_layout_mode_config,
MetaMonitorsConfig **logical_layout_mode_config, MetaMonitorsConfig **logical_layout_mode_config,
GError **error) GError **error)
{ {
GList *logical_monitor_configs_copy, *disabled_monitor_specs_copy; GList *logical_monitor_configs_copy;
GList *disabled_monitor_specs_copy;
GList *for_lease_monitor_specs_copy;
MetaMonitorsConfig *physical_config, *logical_config; MetaMonitorsConfig *physical_config, *logical_config;
g_autoptr (GError) local_error_physical = NULL; g_autoptr (GError) local_error_physical = NULL;
g_autoptr (GError) local_error_logical = NULL; g_autoptr (GError) local_error_logical = NULL;
@ -743,12 +785,15 @@ detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
meta_clone_logical_monitor_config_list (logical_monitor_configs); meta_clone_logical_monitor_config_list (logical_monitor_configs);
disabled_monitor_specs_copy = disabled_monitor_specs_copy =
g_list_copy_deep (disabled_monitor_specs, (GCopyFunc) meta_monitor_spec_clone, NULL); g_list_copy_deep (disabled_monitor_specs, (GCopyFunc) meta_monitor_spec_clone, NULL);
for_lease_monitor_specs_copy =
g_list_copy_deep (for_lease_monitor_specs, (GCopyFunc) meta_monitor_spec_clone, NULL);
derive_logical_monitor_layouts (logical_monitor_configs, derive_logical_monitor_layouts (logical_monitor_configs,
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL); META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL);
physical_config = physical_config =
meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs), meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs),
g_steal_pointer (&disabled_monitor_specs), g_steal_pointer (&disabled_monitor_specs),
g_steal_pointer (&for_lease_monitor_specs),
META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL, META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL,
config_flags); config_flags);
@ -761,6 +806,7 @@ detect_layout_mode_configs (MetaMonitorManager *monitor_manager,
logical_config = logical_config =
meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs_copy), meta_monitors_config_new_full (g_steal_pointer (&logical_monitor_configs_copy),
g_steal_pointer (&disabled_monitor_specs_copy), g_steal_pointer (&disabled_monitor_specs_copy),
g_steal_pointer (&for_lease_monitor_specs_copy),
META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL,
config_flags); config_flags);
@ -1207,6 +1253,7 @@ static MetaMonitorsConfig *
attempt_layout_mode_conversion (MetaMonitorManager *monitor_manager, attempt_layout_mode_conversion (MetaMonitorManager *monitor_manager,
GList *logical_monitor_configs, GList *logical_monitor_configs,
GList *disabled_monitor_specs, GList *disabled_monitor_specs,
GList *for_lease_monitor_specs,
MetaMonitorsConfigFlag config_flags) MetaMonitorsConfigFlag config_flags)
{ {
GList *logical_monitor_configs_copy; GList *logical_monitor_configs_copy;
@ -1251,6 +1298,9 @@ create_full_config:
g_list_copy_deep (disabled_monitor_specs, g_list_copy_deep (disabled_monitor_specs,
(GCopyFunc) meta_monitor_spec_clone, (GCopyFunc) meta_monitor_spec_clone,
NULL), NULL),
g_list_copy_deep (for_lease_monitor_specs,
(GCopyFunc) meta_monitor_spec_clone,
NULL),
META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL,
config_flags); config_flags);
@ -1438,6 +1488,14 @@ handle_end_element (GMarkupParseContext *context,
return; return;
} }
case STATE_FOR_LEASE:
{
g_assert (g_str_equal (element_name, "forlease"));
parser->state = STATE_CONFIGURATION;
return;
}
case STATE_CONFIGURATION: case STATE_CONFIGURATION:
{ {
MetaMonitorConfigStore *store = parser->config_store; MetaMonitorConfigStore *store = parser->config_store;
@ -1458,6 +1516,7 @@ handle_end_element (GMarkupParseContext *context,
if (!detect_layout_mode_configs (store->monitor_manager, if (!detect_layout_mode_configs (store->monitor_manager,
parser->current_logical_monitor_configs, parser->current_logical_monitor_configs,
parser->current_disabled_monitor_specs, parser->current_disabled_monitor_specs,
parser->current_for_lease_monitor_specs,
config_flags, config_flags,
&physical_layout_mode_config, &physical_layout_mode_config,
&logical_layout_mode_config, &logical_layout_mode_config,
@ -1465,11 +1524,13 @@ handle_end_element (GMarkupParseContext *context,
{ {
parser->current_logical_monitor_configs = NULL; parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL; parser->current_disabled_monitor_specs = NULL;
parser->current_for_lease_monitor_specs = NULL;
return; return;
} }
parser->current_logical_monitor_configs = NULL; parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL; parser->current_disabled_monitor_specs = NULL;
parser->current_for_lease_monitor_specs = NULL;
if (physical_layout_mode_config) if (physical_layout_mode_config)
{ {
@ -1487,6 +1548,7 @@ handle_end_element (GMarkupParseContext *context,
attempt_layout_mode_conversion (store->monitor_manager, attempt_layout_mode_conversion (store->monitor_manager,
physical_layout_mode_config->logical_monitor_configs, physical_layout_mode_config->logical_monitor_configs,
physical_layout_mode_config->disabled_monitor_specs, physical_layout_mode_config->disabled_monitor_specs,
physical_layout_mode_config->for_lease_monitor_specs,
config_flags); config_flags);
} }
} }
@ -1508,11 +1570,13 @@ handle_end_element (GMarkupParseContext *context,
config = config =
meta_monitors_config_new_full (parser->current_logical_monitor_configs, meta_monitors_config_new_full (parser->current_logical_monitor_configs,
parser->current_disabled_monitor_specs, parser->current_disabled_monitor_specs,
parser->current_for_lease_monitor_specs,
layout_mode, layout_mode,
config_flags); config_flags);
parser->current_logical_monitor_configs = NULL; parser->current_logical_monitor_configs = NULL;
parser->current_disabled_monitor_specs = NULL; parser->current_disabled_monitor_specs = NULL;
parser->current_for_lease_monitor_specs = NULL;
if (!meta_verify_monitors_config (config, store->monitor_manager, if (!meta_verify_monitors_config (config, store->monitor_manager,
error)) error))
@ -1747,6 +1811,7 @@ handle_text (GMarkupParseContext *context,
case STATE_MONITOR_MODE: case STATE_MONITOR_MODE:
case STATE_TRANSFORM: case STATE_TRANSFORM:
case STATE_DISABLED: case STATE_DISABLED:
case STATE_FOR_LEASE:
case STATE_POLICY: case STATE_POLICY:
case STATE_STORES: case STATE_STORES:
{ {
@ -2323,6 +2388,18 @@ generate_config_xml (MetaMonitorConfigStore *config_store)
g_string_append (buffer, " </disabled>\n"); g_string_append (buffer, " </disabled>\n");
} }
if (config->for_lease_monitor_specs)
{
g_string_append (buffer, " <forlease>\n");
for (l = config->for_lease_monitor_specs; l; l = l->next)
{
MetaMonitorSpec *monitor_spec = l->data;
append_monitor_spec (buffer, monitor_spec, " ");
}
g_string_append (buffer, " </forlease>\n");
}
g_string_append (buffer, " </configuration>\n"); g_string_append (buffer, " </configuration>\n");
} }