From 929d41b7db91c800a201f5a9b981e5175a904657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Wed, 12 Jun 2024 18:13:13 +0200 Subject: [PATCH] feedback-manager: End too noisy feedbacks on profile level change When the profile gets lowered from e.g. quiet to silent we want to end all ongoing feedbacks that belong to the quiet level. This allows to e.g. silence an incoming phone call by switching the feedback level via phosh's quick setting. Closes: https://source.puri.sm/Librem5/feedbackd/-/issues/13 Closes: https://source.puri.sm/Librem5/feedbackd/-/issues/55 --- src/fbd-feedback-manager.c | 21 ++++++++++++++++++--- src/fbd-feedback-theme.c | 3 ++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/fbd-feedback-manager.c b/src/fbd-feedback-manager.c index 2188969..8a647de 100644 --- a/src/fbd-feedback-manager.c +++ b/src/fbd-feedback-manager.c @@ -201,8 +201,6 @@ on_profile_changed (FbdFeedbackManager *self, GParamSpec *psepc, gpointer unused if (!fbd_feedback_manager_set_profile (self, pname)) g_warning ("Invalid profile '%s'", pname); - - /* TODO: end running feedbacks that aren't allowed in new profile immediately */ } static void @@ -418,7 +416,7 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event); if (feedbacks) { for (l = feedbacks; l; l = l->next) { - FbdFeedbackBase *fb = l->data; + FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data); if (fbd_feedback_is_available (FBD_FEEDBACK_BASE (fb))) { fbd_event_add_feedback (event, fb); @@ -626,6 +624,20 @@ fbd_feedback_manager_load_theme (FbdFeedbackManager *self) } } + +static void +cancel_running (FbdFeedbackManager *self) +{ + g_autoptr (GList) running = g_hash_table_get_values (self->events); + + for (GList *l = running; l ; l = l->next) { + FbdEvent *event = FBD_EVENT (l->data); + + fbd_event_end_feedbacks_by_level (event, self->level); + } +} + + gboolean fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile) { @@ -645,5 +657,8 @@ fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile self->level = level; lfb_gdbus_feedback_set_profile (LFB_GDBUS_FEEDBACK (self), profile); g_settings_set_string (self->settings, FEEDBACKD_KEY_PROFILE, profile); + + cancel_running (self); + return TRUE; } diff --git a/src/fbd-feedback-theme.c b/src/fbd-feedback-theme.c index e416f89..2e89fcc 100644 --- a/src/fbd-feedback-theme.c +++ b/src/fbd-feedback-theme.c @@ -354,7 +354,8 @@ fbd_feedback_theme_lookup_feedback (FbdFeedbackTheme *self, FbdFeedbackBase *feedback = fbd_feedback_profile_get_feedback (profile, fbd_event_get_event (event)); if (feedback) { - feedbacks = g_slist_prepend (feedbacks, g_object_ref(feedback)); + g_object_set_data (G_OBJECT (feedback), "fbd-level", GUINT_TO_POINTER (i)); + feedbacks = g_slist_prepend (feedbacks, g_object_ref (feedback)); } }