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:
committed by
Guido Günther
parent
f575d32651
commit
2d1d72c746
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user