feedback-manager: Handle important hint

This allows blessed apps to override the per-app as well as the global
feedback level. This can e.g. be useful for alarm clocks.
This commit is contained in:
Guido Günther
2024-04-20 13:21:56 +00:00
committed by Guido Günther
parent f575d32651
commit 2d1d72c746
+43 -2
View File
@@ -26,6 +26,7 @@
#define FEEDBACKD_SCHEMA_ID "org.sigxcpu.feedbackd"
#define FEEDBACKD_KEY_PROFILE "profile"
#define FEEDBACKD_KEY_THEME "theme"
#define FEEDBACKD_KEY_ALLOW_IMPORTANT "allow-important"
#define APP_SCHEMA FEEDBACKD_SCHEMA_ID ".application"
#define APP_PREFIX "/org/sigxcpu/feedbackd/application/"
@@ -48,6 +49,7 @@ typedef struct _FbdFeedbackManager {
FbdFeedbackProfileLevel level;
FbdFeedbackTheme *theme;
guint next_id;
GStrv allow_important;
/* Key: event id, value: event */
GHashTable *events;
@@ -225,6 +227,33 @@ on_feedbackd_setting_changed (FbdFeedbackManager *self,
}
}
static gboolean
app_is_important (FbdFeedbackManager *self, const char *app_id)
{
if (!self->allow_important)
return FALSE;
if (g_strv_contains ((const char *const *)self->allow_important, app_id))
return TRUE;
return FALSE;
}
static void
on_feedbackd_allow_important_changed (FbdFeedbackManager *self,
const gchar *key,
GSettings *settings)
{
g_return_if_fail (FBD_IS_FEEDBACK_MANAGER (self));
g_return_if_fail (G_IS_SETTINGS (settings));
g_strfreev (self->allow_important);
self->allow_important = g_settings_get_strv(self->settings, FEEDBACKD_KEY_ALLOW_IMPORTANT);
}
static void
on_client_vanished (GDBusConnection *connection,
const gchar *name,
@@ -341,7 +370,7 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
const gchar *sender;
FbdFeedbackProfileLevel app_level, level, hint_level = FBD_FEEDBACK_PROFILE_LEVEL_FULL;
gboolean found_fb = FALSE;
gboolean hint_important = FALSE;
gboolean hint_important = FALSE, can_important;
sender = g_dbus_method_invocation_get_sender (invocation);
g_debug ("Event '%s' for '%s' from %s", arg_event, arg_app_id, sender);
@@ -381,7 +410,12 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
g_hash_table_insert (self->events, GUINT_TO_POINTER (event_id), event);
app_level = app_get_feedback_level (arg_app_id);
level = get_max_level (self->level, app_level, hint_level);
can_important = app_is_important (self, arg_app_id);
if (hint_important && can_important)
level = hint_level;
else
level = get_max_level (self->level, app_level, hint_level);
feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event);
if (feedbacks) {
@@ -461,8 +495,13 @@ fbd_feedback_manager_constructed (GObject *object)
g_signal_connect_swapped (self->settings, "changed::" FEEDBACKD_KEY_PROFILE,
G_CALLBACK (on_feedbackd_setting_changed), self);
on_feedbackd_setting_changed (self, FEEDBACKD_KEY_PROFILE, self->settings);
g_signal_connect_swapped (self->settings, "changed::" FEEDBACKD_KEY_ALLOW_IMPORTANT,
G_CALLBACK (on_feedbackd_allow_important_changed), self);
on_feedbackd_allow_important_changed (self, FEEDBACKD_KEY_ALLOW_IMPORTANT, self->settings);
}
static void
fbd_feedback_manager_dispose (GObject *object)
{
@@ -474,6 +513,8 @@ fbd_feedback_manager_dispose (GObject *object)
g_clear_object (&self->vibra);
g_clear_object (&self->leds);
g_clear_object (&self->client);
g_clear_pointer (&self->allow_important, g_strfreev);
g_clear_pointer (&self->events, g_hash_table_destroy);
g_clear_pointer (&self->clients, g_hash_table_destroy);