diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index 9c1f2a0b4..392def8df 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -100,7 +100,8 @@ struct _MetaBackendClass typedef enum _MetaExperimentalFeature { META_EXPERIMENTAL_FEATURE_NONE = 0, - META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0) + META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0), + META_EXPERIMENTAL_FEATURE_MONITOR_CONFIG_MANAGER = (1 << 1) } MetaExperimentalFeature; void meta_init_backend (GType backend_gtype); diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 822ddc066..71a7865f9 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -430,6 +430,8 @@ experimental_features_handler (GVariant *features_variant, /* So far no experimental features defined. */ if (g_str_equal (feature, "scale-monitor-framebuffer")) features |= META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER; + else if (g_str_equal (feature, "monitor-config-manager")) + features |= META_EXPERIMENTAL_FEATURE_MONITOR_CONFIG_MANAGER; else g_info ("Unknown experimental feature '%s'\n", feature); } diff --git a/src/backends/meta-monitor-manager-dummy.c b/src/backends/meta-monitor-manager-dummy.c index 2c31d62b1..05ffd4d89 100644 --- a/src/backends/meta-monitor-manager-dummy.c +++ b/src/backends/meta-monitor-manager-dummy.c @@ -356,7 +356,7 @@ meta_monitor_manager_dummy_ensure_initial_config (MetaMonitorManager *manager) config = meta_monitor_manager_ensure_configured (manager); - if (manager->config_manager) + if (meta_is_monitor_config_manager_enabled ()) meta_monitor_manager_update_logical_state (manager, config); else meta_monitor_manager_update_logical_state_derived (manager); diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h index 4dc113984..175520d10 100644 --- a/src/backends/meta-monitor-manager-private.h +++ b/src/backends/meta-monitor-manager-private.h @@ -315,6 +315,8 @@ struct _MetaMonitorManager GnomePnpIds *pnp_ids; UpClient *up_client; + + gulong experimental_features_changed_handler_id; }; struct _MetaMonitorManagerClass @@ -390,6 +392,8 @@ struct _MetaMonitorManagerClass MetaLogicalMonitorLayoutMode (*get_default_layout_mode) (MetaMonitorManager *); }; +gboolean meta_is_monitor_config_manager_enabled (void); + void meta_monitor_manager_rebuild (MetaMonitorManager *manager, MetaMonitorsConfig *config); void meta_monitor_manager_rebuild_derived (MetaMonitorManager *manager); diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c index 832dbea27..9fbe2d513 100644 --- a/src/backends/meta-monitor-manager.c +++ b/src/backends/meta-monitor-manager.c @@ -74,6 +74,14 @@ meta_monitor_manager_init (MetaMonitorManager *manager) { } +gboolean +meta_is_monitor_config_manager_enabled (void) +{ + return meta_backend_is_experimental_feature_enabled ( + meta_get_backend (), + META_EXPERIMENTAL_FEATURE_MONITOR_CONFIG_MANAGER); +} + static void meta_monitor_manager_set_primary_logical_monitor (MetaMonitorManager *manager, MetaLogicalMonitor *logical_monitor) @@ -240,7 +248,7 @@ power_save_mode_changed (MetaMonitorManager *manager, void meta_monitor_manager_lid_is_closed_changed (MetaMonitorManager *manager) { - if (manager->config_manager) + if (meta_is_monitor_config_manager_enabled ()) meta_monitor_manager_ensure_configured (manager); else meta_monitor_config_lid_is_closed_changed (manager->legacy_config, manager); @@ -390,7 +398,7 @@ meta_monitor_manager_ensure_configured (MetaMonitorManager *manager) MetaMonitorsConfigMethod fallback_method = META_MONITORS_CONFIG_METHOD_TEMPORARY; - if (!manager->config_manager) + if (!meta_is_monitor_config_manager_enabled ()) { legacy_ensure_configured (manager); return NULL; @@ -497,13 +505,41 @@ done: return config; } +static void +experimental_features_changed (MetaBackend *backend, + MetaMonitorManager *manager) +{ + MetaDBusDisplayConfig *skeleton = META_DBUS_DISPLAY_CONFIG (manager); + gboolean was_config_manager_enabled; + gboolean is_config_manager_enabled; + + is_config_manager_enabled = meta_is_monitor_config_manager_enabled (); + was_config_manager_enabled = + meta_dbus_display_config_get_is_experimental_api_enabled (skeleton); + + if (was_config_manager_enabled != is_config_manager_enabled) + { + meta_dbus_display_config_set_is_experimental_api_enabled ( + skeleton, is_config_manager_enabled); + + meta_monitor_manager_on_hotplug (manager); + } +} + static void meta_monitor_manager_constructed (GObject *object) { MetaMonitorManager *manager = META_MONITOR_MANAGER (object); + MetaDBusDisplayConfig *skeleton = META_DBUS_DISPLAY_CONFIG (manager); MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_GET_CLASS (manager); + manager->experimental_features_changed_handler_id = + g_signal_connect (meta_get_backend (), + "experimental-features-changed", + G_CALLBACK (experimental_features_changed), + manager); + if (manager_class->is_lid_closed == meta_monitor_manager_real_is_lid_closed) { manager->up_client = up_client_new (); @@ -514,12 +550,18 @@ meta_monitor_manager_constructed (GObject *object) g_signal_connect_object (manager, "notify::power-save-mode", G_CALLBACK (power_save_mode_changed), manager, 0); + meta_dbus_display_config_set_is_experimental_api_enabled ( + skeleton, + meta_is_monitor_config_manager_enabled ()); + manager->in_init = TRUE; - if (g_strcmp0 (g_getenv ("MUTTER_USE_CONFIG_MANAGER"), "1") == 0) - manager->config_manager = meta_monitor_config_manager_new (manager); - else - manager->legacy_config = meta_monitor_config_new (manager); + /* + * MetaMonitorConfigManager will only be used if the corresponding + * experimental feature is enabled. + */ + manager->config_manager = meta_monitor_config_manager_new (manager); + manager->legacy_config = meta_monitor_config_new (manager); meta_monitor_manager_read_current_state (manager); @@ -613,6 +655,9 @@ meta_monitor_manager_finalize (GObject *object) meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs); g_list_free_full (manager->logical_monitors, g_object_unref); + g_signal_handler_disconnect (meta_get_backend (), + manager->experimental_features_changed_handler_id); + G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object); } @@ -993,10 +1038,7 @@ save_config_timeout (gpointer user_data) { MetaMonitorManager *manager = user_data; - if (manager->config_manager) - g_assert (!"missing implementation"); - else - legacy_restore_previous_config (manager); + legacy_restore_previous_config (manager); manager->persistent_timeout_id = 0; return G_SOURCE_REMOVE; @@ -1020,13 +1062,8 @@ meta_monitor_manager_legacy_handle_apply_configuration (MetaDBusDisplayConfig * guint output_index; GPtrArray *crtc_infos, *output_infos; - if (manager->config_manager) - { - g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, - G_DBUS_ERROR_NOT_SUPPORTED, - "Used old configuration API with new configuration system"); - return TRUE; - } + if (meta_monitor_config_manager_get_current (manager->config_manager)) + meta_monitor_config_manager_set_current (manager->config_manager, NULL); if (serial != manager->serial) { @@ -1286,6 +1323,14 @@ meta_monitor_manager_handle_get_current_state (MetaDBusDisplayConfig *skeleton, MetaMonitorManagerCapability capabilities; int max_screen_width, max_screen_height; + if (!meta_is_monitor_config_manager_enabled ()) + { + g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, + G_DBUS_ERROR_ACCESS_DENIED, + "This experimental API is currently not enabled"); + return TRUE; + } + g_variant_builder_init (&monitors_builder, G_VARIANT_TYPE (MONITORS_FORMAT)); g_variant_builder_init (&logical_monitors_builder, @@ -1741,11 +1786,11 @@ meta_monitor_manager_handle_apply_monitors_config (MetaDBusDisplayConfig *skelet GList *logical_monitor_configs = NULL; GError *error = NULL; - if (!manager->config_manager) + if (!meta_is_monitor_config_manager_enabled ()) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, - G_DBUS_ERROR_NOT_SUPPORTED, - "Used new configuration API with old configuration system"); + G_DBUS_ERROR_ACCESS_DENIED, + "This experimental API is currently not enabled"); return TRUE; } @@ -1888,10 +1933,7 @@ meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager, g_source_remove (manager->persistent_timeout_id); manager->persistent_timeout_id = 0; - if (manager->config_manager) - g_assert (!"not implemented"); - else - legacy_confirm_configuration (manager, ok); + legacy_confirm_configuration (manager, ok); } static gboolean @@ -2643,7 +2685,7 @@ legacy_on_hotplug (MetaMonitorManager *manager) void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager) { - if (manager->legacy_config) + if (!meta_is_monitor_config_manager_enabled ()) { legacy_on_hotplug (manager); return; diff --git a/src/backends/native/meta-monitor-manager-kms.c b/src/backends/native/meta-monitor-manager-kms.c index 78930b854..46cd5c2b1 100644 --- a/src/backends/native/meta-monitor-manager-kms.c +++ b/src/backends/native/meta-monitor-manager-kms.c @@ -1260,7 +1260,7 @@ meta_monitor_manager_kms_ensure_initial_config (MetaMonitorManager *manager) config = meta_monitor_manager_ensure_configured (manager); - if (manager->config_manager) + if (meta_is_monitor_config_manager_enabled ()) meta_monitor_manager_update_logical_state (manager, config); else meta_monitor_manager_update_logical_state_derived (manager); diff --git a/src/org.gnome.Mutter.DisplayConfig.xml b/src/org.gnome.Mutter.DisplayConfig.xml index bb48768d3..74c1d27b6 100644 --- a/src/org.gnome.Mutter.DisplayConfig.xml +++ b/src/org.gnome.Mutter.DisplayConfig.xml @@ -291,6 +291,17 @@ --> + + +