[mutter/cherry-pick-c93e402a: 2/2] monitor-manager: Ensure monitors settings after backend has been updated




commit 0f06a7ddb3d72d2a573b3d3f9baafec1748a5f94
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date:   Wed Apr 13 01:42:14 2022 +0200

    monitor-manager: Ensure monitors settings after backend has been updated
    
    The monitors settings such as the privacy screen property is propagated
    to the monitors via kms updates, however during initialization and
    on monitors changes, we end up clearing the pending KMS updates because
    such settings are added to the queue before the backend has fully
    initialized the monitors, and this may lead to discarding all the
    pending updates, including the one we've just planned.
    
    To avoid this, move settings applications after we've both initialized
    the backend and notified it about changes.
    
    Also avoid to try set the settings during actual initialization, but
    delay that after post-init.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2372>
    
    
    (cherry picked from commit c93e402a898d2e45b4b15e176d5d428a54797d4a)

 src/backends/meta-monitor-manager-private.h |  1 +
 src/backends/meta-monitor-manager.c         | 37 ++++++++++++++++++++---------
 2 files changed, 27 insertions(+), 11 deletions(-)
---
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index 12bb840384..edf7e45019 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -70,6 +70,7 @@ typedef enum _MetaLogicalMonitorLayoutMode
 typedef enum
 {
   META_PRIVACY_SCREEN_CHANGE_STATE_NONE,
+  META_PRIVACY_SCREEN_CHANGE_STATE_INIT,
   META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_HOTKEY,
   META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_SETTING,
 } MetaPrivacyScreenChangeState;
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 83fe107802..be99b46642 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1080,21 +1080,25 @@ get_global_privacy_screen_state (MetaMonitorManager *manager)
   return global_state;
 }
 
-static void
-apply_privacy_screen_settings (MetaMonitorManager *manager)
+static gboolean
+privacy_screen_needs_update (MetaMonitorManager *manager)
 {
   MetaSettings *settings = meta_backend_get_settings (manager->backend);
   MetaPrivacyScreenState privacy_screen_state =
     get_global_privacy_screen_state (manager);
 
   if (privacy_screen_state == META_PRIVACY_SCREEN_UNAVAILABLE)
-    return;
+    return FALSE;
 
-  if (!!(privacy_screen_state & META_PRIVACY_SCREEN_ENABLED) ==
-      meta_settings_is_privacy_screen_enabled (settings))
-    return;
+  return (!!(privacy_screen_state & META_PRIVACY_SCREEN_ENABLED) !=
+      meta_settings_is_privacy_screen_enabled (settings));
+}
 
-  if (ensure_monitors_settings (manager))
+static void
+apply_privacy_screen_settings (MetaMonitorManager *manager)
+{
+  if (privacy_screen_needs_update (manager) &&
+      ensure_monitors_settings (manager))
     {
       manager->privacy_screen_change_state =
         META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_SETTING;
@@ -1181,7 +1185,8 @@ meta_monitor_manager_setup (MetaMonitorManager *manager)
 
   meta_monitor_manager_ensure_initial_config (manager);
 
-  apply_privacy_screen_settings (manager);
+  if (privacy_screen_needs_update (manager))
+    manager->privacy_screen_change_state = META_PRIVACY_SCREEN_CHANGE_STATE_INIT;
 
   manager->in_init = FALSE;
 }
@@ -1506,7 +1511,8 @@ meta_monitor_manager_maybe_emit_privacy_screen_change (MetaMonitorManager *manag
 {
   MetaPrivacyScreenChangeState reason = manager->privacy_screen_change_state;
 
-  if (reason == META_PRIVACY_SCREEN_CHANGE_STATE_NONE)
+  if (reason == META_PRIVACY_SCREEN_CHANGE_STATE_NONE ||
+      reason == META_PRIVACY_SCREEN_CHANGE_STATE_INIT)
     return;
 
   if (reason == META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_HOTKEY)
@@ -3561,10 +3567,10 @@ meta_monitor_manager_rebuild (MetaMonitorManager *manager,
 
   meta_monitor_manager_update_logical_state (manager, config);
 
-  ensure_monitors_settings (manager);
-
   meta_monitor_manager_notify_monitors_changed (manager);
 
+  ensure_monitors_settings (manager);
+
   g_list_free_full (old_logical_monitors, g_object_unref);
 }
 
@@ -3840,6 +3846,15 @@ meta_monitor_manager_post_init (MetaMonitorManager *manager)
   ClutterBackend *clutter_backend;
   ClutterSeat *seat;
 
+  if (manager->privacy_screen_change_state ==
+      META_PRIVACY_SCREEN_CHANGE_STATE_INIT)
+    {
+      manager->privacy_screen_change_state =
+        META_PRIVACY_SCREEN_CHANGE_STATE_NONE;
+    }
+
+  apply_privacy_screen_settings (manager);
+
   clutter_backend = meta_backend_get_clutter_backend (manager->backend);
   seat = clutter_backend_get_default_seat (clutter_backend);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]