Allow to lower the feedback level per application

We munge the application id the same way as it's done
for notifications so these can eventually move into
the same schema.
This commit is contained in:
Guido Günther
2020-04-20 07:23:44 +00:00
committed by Guido Gunther
parent eec1556d87
commit 9cb62dee1d
3 changed files with 49 additions and 9 deletions
+9
View File
@@ -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/)
-8
View File
@@ -17,14 +17,6 @@
</schema>
<schema id="org.sigxcpu.feedbackd.application">
<key name="application-id" type="s">
<default>''</default>
<summary>Application ID</summary>
<description>
The application that this policy is for.
</description>
</key>
<key name="profile" type="s">
<choices>
<choice value='full'/>
+40 -1
View File
@@ -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) {