diff options
author | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2021-08-02 18:22:46 +0200 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2022-01-25 07:31:19 +0000 |
commit | 8cf3485ab0acec04c541dd9ba984e88f7a192d59 (patch) | |
tree | 21f2d34db66c8708917de8756500bae9415899dc /src/backends/meta-monitor-manager.c | |
parent | 4e10324a808561cca3ef9f90bac9ee95cf0458f7 (diff) | |
download | mutter-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.c | 64 |
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, |