feedback-manager: Split out feedback level calculation

This allows to use it from other places too and while at that
documents it.

Signed-off-by: Guido Günther <agx@sigxcpu.org>
This commit is contained in:
Guido Günther
2024-12-15 18:34:35 +01:00
parent 8a11565cc1
commit cdf5fb2b2d
2 changed files with 42 additions and 10 deletions
+37 -10
View File
@@ -351,6 +351,7 @@ parse_hints (GVariant *hints, FbdFeedbackProfileLevel *level, gboolean *hint_imp
return TRUE;
}
static gboolean
fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
GDBusMethodInvocation *invocation,
@@ -364,9 +365,9 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
GSList *feedbacks, *l;
guint event_id;
const gchar *sender;
FbdFeedbackProfileLevel app_level, level, hint_level = FBD_FEEDBACK_PROFILE_LEVEL_FULL;
FbdFeedbackProfileLevel level, hint_level = FBD_FEEDBACK_PROFILE_LEVEL_FULL;
gboolean found_fb = FALSE;
gboolean hint_important = FALSE, can_important;
gboolean hint_important = FALSE;
sender = g_dbus_method_invocation_get_sender (invocation);
g_debug ("Event '%s' for '%s' from %s", arg_event, arg_app_id, sender);
@@ -405,15 +406,9 @@ fbd_feedback_manager_handle_trigger_feedback (LfbGdbusFeedback *object,
event = fbd_event_new (event_id, arg_app_id, arg_event, arg_timeout, sender);
g_hash_table_insert (self->events, GUINT_TO_POINTER (event_id), event);
app_level = app_get_feedback_level (arg_app_id);
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);
level = fbd_feedback_manager_get_effective_level (self, arg_app_id, hint_level, hint_important);
feedbacks = fbd_feedback_theme_lookup_feedback (self->theme, level, event);
if (feedbacks) {
for (l = feedbacks; l; l = l->next) {
FbdFeedbackBase *fb = FBD_FEEDBACK_BASE (l->data);
@@ -662,3 +657,35 @@ fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile
return TRUE;
}
/**
* fbd_feedback_manager_get_effective_level:
* @self: The feedback manager
* @app_id: The app-id of the app that triggered the feedback
* @want_level: The wanted level
* @important: Whether the important hint is set
*
* Calculates the effective feedback level taking the hints sent for the event
* and the system configuration into account
*
* Returns: The effective feedback level
*/
FbdFeedbackProfileLevel
fbd_feedback_manager_get_effective_level (FbdFeedbackManager *self,
const char *app_id,
FbdFeedbackProfileLevel want_level,
gboolean important)
{
gboolean can_important;
FbdFeedbackProfileLevel app_level, level;
app_level = app_get_feedback_level (app_id);
can_important = app_is_important (self, app_id);
if (important && can_important)
level = want_level;
else
level = get_max_level (self->level, app_level, want_level);
return level;
}
+5
View File
@@ -8,6 +8,7 @@
#include "fbd-dev-vibra.h"
#include "fbd-dev-leds.h"
#include "fbd-dev-sound.h"
#include "fbd-feedback-profile.h"
#include "lfb-gdbus.h"
#include <glib-object.h>
@@ -24,5 +25,9 @@ FbdDevSound *fbd_feedback_manager_get_dev_sound (FbdFeedbackManager *self);
FbdDevLeds *fbd_feedback_manager_get_dev_leds (FbdFeedbackManager *self);
void fbd_feedback_manager_load_theme (FbdFeedbackManager *self);
gboolean fbd_feedback_manager_set_profile (FbdFeedbackManager *self, const gchar *profile);
FbdFeedbackProfileLevel fbd_feedback_manager_get_effective_level (FbdFeedbackManager *self,
const char *app_id,
FbdFeedbackProfileLevel want_level,
gboolean important);
G_END_DECLS