summaryrefslogtreecommitdiff
path: root/src/backends/meta-monitor-manager.c
diff options
context:
space:
mode:
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2021-08-02 18:22:46 +0200
committerMarge Bot <marge-bot@gnome.org>2022-01-25 07:31:19 +0000
commit8cf3485ab0acec04c541dd9ba984e88f7a192d59 (patch)
tree21f2d34db66c8708917de8756500bae9415899dc /src/backends/meta-monitor-manager.c
parent4e10324a808561cca3ef9f90bac9ee95cf0458f7 (diff)
downloadmutter-8cf3485ab0acec04c541dd9ba984e88f7a192d59.tar.gz
monitor-manager: Notify privacy screen changes on hotkey press
When privacy screen is changed and this happens on explicit user request (that is not a setting change) we should notify about this via an OSD. To perform this, we keep track of the reason that lead to a privacy screen change, and when we record it we try to notify the user about. When the hardware has not an explicit hotkey signal but we record a change we must still fallback to this case. Fixes: #2105 Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1952>
Diffstat (limited to 'src/backends/meta-monitor-manager.c')
-rw-r--r--src/backends/meta-monitor-manager.c64
1 files changed, 63 insertions, 1 deletions
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 2dff6539e..3b650c62c 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -83,6 +83,7 @@ enum
MONITORS_CHANGED_INTERNAL,
POWER_SAVE_MODE_CHANGED,
CONFIRM_DISPLAY_CHANGE,
+ MONITOR_PRIVACY_SCREEN_CHANGED,
SIGNALS_LAST
};
@@ -1092,7 +1093,11 @@ apply_privacy_screen_settings (MetaMonitorManager *manager)
meta_settings_is_privacy_screen_enabled (settings))
return;
- ensure_monitors_settings (manager);
+ if (ensure_monitors_settings (manager))
+ {
+ manager->privacy_screen_change_state =
+ META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_SETTING;
+ }
}
static void
@@ -1354,6 +1359,14 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
+ signals[MONITOR_PRIVACY_SCREEN_CHANGED] =
+ g_signal_new ("monitor-privacy-screen-changed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ 0,
+ NULL, NULL, NULL,
+ G_TYPE_NONE, 2, META_TYPE_LOGICAL_MONITOR, G_TYPE_BOOLEAN);
+
obj_props[PROP_BACKEND] =
g_param_spec_object ("backend",
"backend",
@@ -1446,6 +1459,55 @@ combine_gpu_lists (MetaMonitorManager *manager,
return list;
}
+static void
+emit_privacy_screen_change (MetaMonitorManager *manager)
+{
+ GList *l;
+
+ for (l = manager->monitors; l; l = l->next)
+ {
+ MetaMonitor *monitor = l->data;
+ MetaPrivacyScreenState privacy_screen_state;
+ gboolean enabled;
+
+ if (!meta_monitor_is_active (monitor))
+ continue;
+
+ privacy_screen_state = meta_monitor_get_privacy_screen_state (monitor);
+ if (privacy_screen_state == META_PRIVACY_SCREEN_UNAVAILABLE)
+ continue;
+
+ enabled = !!(privacy_screen_state & META_PRIVACY_SCREEN_ENABLED);
+
+ g_signal_emit (manager, signals[MONITOR_PRIVACY_SCREEN_CHANGED], 0,
+ meta_monitor_get_logical_monitor (monitor), enabled);
+ }
+}
+
+void
+meta_monitor_manager_maybe_emit_privacy_screen_change (MetaMonitorManager *manager)
+{
+ MetaPrivacyScreenChangeState reason = manager->privacy_screen_change_state;
+
+ if (reason == META_PRIVACY_SCREEN_CHANGE_STATE_NONE)
+ return;
+
+ if (reason == META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_HOTKEY)
+ emit_privacy_screen_change (manager);
+
+ if (reason != META_PRIVACY_SCREEN_CHANGE_STATE_PENDING_SETTING)
+ {
+ MetaSettings *settings = meta_backend_get_settings (manager->backend);
+
+ meta_settings_set_privacy_screen_enabled (settings,
+ get_global_privacy_screen_state (manager) ==
+ META_PRIVACY_SCREEN_ENABLED);
+ }
+
+ meta_dbus_display_config_emit_monitors_changed (manager->display_config);
+ manager->privacy_screen_change_state = META_PRIVACY_SCREEN_CHANGE_STATE_NONE;
+}
+
static gboolean
meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation,