[mutter] monitor-manager: Apply privacy monitor settings on changes
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] monitor-manager: Apply privacy monitor settings on changes
- Date: Tue, 25 Jan 2022 08:10:39 +0000 (UTC)
commit f96a167aea2d633619228b95ec4cb7a334f0ea18
Author: Marco Trevisan (TreviƱo) <mail 3v1n0 net>
Date: Mon Mar 22 01:15:40 2021 +0100
monitor-manager: Apply privacy monitor settings on changes
When both a setting change and a monitor change happens we need to
ensure that the monitor settings are applied.
This is currently only related to privacy settings, but will in future
also handle other monitor parameters such as brightness.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1952>
src/backends/meta-monitor-manager-private.h | 3 +
src/backends/meta-monitor-manager.c | 100 ++++++++++++++++++++++++++++
2 files changed, 103 insertions(+)
---
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index 3282b373ac..abf63ce51a 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -229,6 +229,9 @@ struct _MetaMonitorManagerClass
unsigned short *green,
unsigned short *blue);
+ gboolean (* set_privacy_screen_enabled) (MetaMonitorManager *manager,
+ gboolean enabled);
+
void (* tiled_monitor_added) (MetaMonitorManager *manager,
MetaMonitor *monitor);
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 1a68d71e0d..1430171e72 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1006,6 +1006,95 @@ experimental_features_changed (MetaSettings *settings,
meta_settings_update_ui_scaling_factor (settings);
}
+static gboolean
+meta_monitor_manager_real_set_privacy_screen_enabled (MetaMonitorManager *manager,
+ gboolean enabled)
+{
+ GList *l;
+
+ for (l = manager->monitors; l; l = l->next)
+ {
+ g_autoptr (GError) error = NULL;
+ MetaMonitor *monitor = l->data;
+
+ if (!meta_monitor_set_privacy_screen_enabled (monitor, enabled, &error))
+ {
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED))
+ continue;
+
+ g_warning ("Failed to set privacy screen setting on monitor %s: %s",
+ meta_monitor_get_display_name (monitor), error->message);
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static gboolean
+set_privacy_screen_enabled (MetaMonitorManager *manager,
+ gboolean enabled)
+{
+ MetaMonitorManagerClass *manager_class =
+ META_MONITOR_MANAGER_GET_CLASS (manager);
+
+ return manager_class->set_privacy_screen_enabled (manager, enabled);
+}
+
+static gboolean
+ensure_monitors_settings (MetaMonitorManager *manager)
+{
+ MetaSettings *settings = meta_backend_get_settings (manager->backend);
+
+ return set_privacy_screen_enabled (
+ manager, meta_settings_is_privacy_screen_enabled (settings));
+}
+
+static MetaPrivacyScreenState
+get_global_privacy_screen_state (MetaMonitorManager *manager)
+{
+ MetaPrivacyScreenState global_state = META_PRIVACY_SCREEN_UNAVAILABLE;
+ GList *l;
+
+ for (l = manager->monitors; l; l = l->next)
+ {
+ MetaMonitor *monitor = l->data;
+ MetaPrivacyScreenState monitor_state;
+
+ if (!meta_monitor_is_active (monitor))
+ continue;
+
+ monitor_state = meta_monitor_get_privacy_screen_state (monitor);
+ if (monitor_state == META_PRIVACY_SCREEN_UNAVAILABLE)
+ continue;
+
+ if (monitor_state & META_PRIVACY_SCREEN_DISABLED)
+ return META_PRIVACY_SCREEN_DISABLED;
+
+ if (monitor_state & META_PRIVACY_SCREEN_ENABLED)
+ global_state = META_PRIVACY_SCREEN_ENABLED;
+ }
+
+ return global_state;
+}
+
+static void
+apply_privacy_screen_settings (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;
+
+ if (!!(privacy_screen_state & META_PRIVACY_SCREEN_ENABLED) ==
+ meta_settings_is_privacy_screen_enabled (settings))
+ return;
+
+ ensure_monitors_settings (manager);
+}
+
static void
update_panel_orientation_managed (MetaMonitorManager *manager)
{
@@ -1077,6 +1166,8 @@ meta_monitor_manager_setup (MetaMonitorManager *manager)
meta_monitor_manager_ensure_initial_config (manager);
+ apply_privacy_screen_settings (manager);
+
manager->in_init = FALSE;
}
@@ -1094,6 +1185,11 @@ meta_monitor_manager_constructed (GObject *object)
G_CALLBACK (experimental_features_changed),
manager, 0);
+ g_signal_connect_object (settings,
+ "privacy-screen-changed",
+ G_CALLBACK (apply_privacy_screen_settings),
+ manager, G_CONNECT_SWAPPED);
+
monitor_manager_setup_dbus_config_handlers (manager);
g_signal_connect_object (manager->display_config, "notify::power-save-mode",
@@ -1223,6 +1319,8 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
klass->read_edid = meta_monitor_manager_real_read_edid;
klass->read_current_state = meta_monitor_manager_real_read_current_state;
+ klass->set_privacy_screen_enabled =
+ meta_monitor_manager_real_set_privacy_screen_enabled;
signals[MONITORS_CHANGED] =
g_signal_new ("monitors-changed",
@@ -3356,6 +3454,8 @@ 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);
g_list_free_full (old_logical_monitors, g_object_unref);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]