diff --git a/README.md b/README.md index 6c8b9e8..15f480a 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,15 @@ Run feedbacks for event `message-new-instant` for 10 seconds: _build/cli/fbcli -t 10 -E alarm-clock-elapsed ``` +## Per app profiles +One can lower the feedback level of an individual application +via `GSettings`. E.g. for an app with app id `sm.puri.Phosh` +to set the profile to `quiet` do: + +``` +GSETTINGS_SCHEMA_DIR=_build/data/ gsettings set org.sigxcpu.feedbackd.application:/org/sigxcpu/feedbackd/application/sm-puri-phosh/ profile quiet +``` + # Documentation - [Libfeedback API](https://honk.sigxcpu.org/projects/feedbackd/doc/) diff --git a/data/org.sigxcpu.feedbackd.gschema.xml b/data/org.sigxcpu.feedbackd.gschema.xml index 8c452bf..eba31ba 100644 --- a/data/org.sigxcpu.feedbackd.gschema.xml +++ b/data/org.sigxcpu.feedbackd.gschema.xml @@ -17,14 +17,6 @@ - - '' - Application ID - - The application that this policy is for. - - - diff --git a/src/fbd-feedback-manager.c b/src/fbd-feedback-manager.c index b01dd8b..2a83936 100644 --- a/src/fbd-feedback-manager.c +++ b/src/fbd-feedback-manager.c @@ -21,6 +21,10 @@ #define FEEDBACKD_SCHEMA_ID "org.sigxcpu.feedbackd" #define FEEDBACKD_KEY_PROFILE "profile" +#define APP_SCHEMA FEEDBACKD_SCHEMA_ID ".application" +#define APP_PREFIX "/org/sigxcpu/feedbackd/application/" + + /** * SECTION:fbd-feedback-manager * @short_description: The manager processing incoming events @@ -84,6 +88,37 @@ device_changes (FbdFeedbackManager *self, gchar *action, GUdevDevice *device, } } +static gchar * +munge_app_id (const gchar *app_id) +{ + gchar *id = g_strdup (app_id); + gint i; + + g_strcanon (id, + "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "-", + '-'); + for (i = 0; id[i] != '\0'; i++) + id[i] = g_ascii_tolower (id[i]); + + return id; +} + +static FbdFeedbackProfileLevel +app_get_feedback_level (const gchar *app_id) +{ + g_autofree gchar *profile = NULL; + g_autofree gchar *munged_app_id = munge_app_id (app_id); + g_autofree gchar *path = g_strconcat (APP_PREFIX, munged_app_id, "/", NULL); + g_autoptr (GSettings) setting = g_settings_new_with_path (APP_SCHEMA, path); + + profile = g_settings_get_string (setting, FEEDBACKD_KEY_PROFILE); + g_debug ("%s uses app profile %s", app_id, profile); + return fbd_feedback_profile_level (profile); +} + static void init_devices (FbdFeedbackManager *self) { @@ -181,6 +216,7 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, FbdEvent *event; GSList *feedbacks, *l; gint event_id; + FbdFeedbackProfileLevel app_level, level; g_debug ("Event '%s' for '%s'", arg_event, arg_app_id); @@ -211,7 +247,10 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object, event = fbd_event_new (event_id, arg_app_id, arg_event, arg_timeout); g_hash_table_insert (self->events, GUINT_TO_POINTER (event_id), event); - feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, self->level, event); + /* If user configured a lower feedback level for this app honor that */ + app_level = app_get_feedback_level (arg_app_id); + level = self->level > app_level ? app_level : self->level; + feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event); if (feedbacks) { for (l = feedbacks; l; l = l->next) {