diff --git a/data/org.sigxcpu.feedbackd.gschema.xml b/data/org.sigxcpu.feedbackd.gschema.xml index 732726b..6f6cf16 100644 --- a/data/org.sigxcpu.feedbackd.gschema.xml +++ b/data/org.sigxcpu.feedbackd.gschema.xml @@ -41,6 +41,16 @@ setting the 'important' hint on the submitted event. + + + + 1.0 + Maximum haptic strength + + The maximum haptic strength to use when providing feedback. + + + diff --git a/doc/feedbackd.rst b/doc/feedbackd.rst index 56ed589..d7713d1 100644 --- a/doc/feedbackd.rst +++ b/doc/feedbackd.rst @@ -54,6 +54,8 @@ These gsettings are used by ``feedbackd``: - `prefer-flash`: Prefer camera flash over status LED - `theme`: The feedback theme to use. This can be used to override the feedback theme picked by feedbackd based on device information. + - `max-haptic-strength`: Limits th maximum strenght used for the + haptic motor `[0.0, 1.0]`. - `org.sigxcpu.feedbackd.application` diff --git a/src/fbd-feedback-vibra-priv.h b/src/fbd-feedback-vibra-priv.h index 445bf3d..2d71036 100644 --- a/src/fbd-feedback-vibra-priv.h +++ b/src/fbd-feedback-vibra-priv.h @@ -9,6 +9,7 @@ G_BEGIN_DECLS -void fbd_feedback_vibra_set_duration (FbdFeedbackVibra *self, guint duration); +void fbd_feedback_vibra_set_duration (FbdFeedbackVibra *self, guint duration); +double fbd_feedback_vibra_get_max_strength (FbdFeedbackVibra *self); G_END_DECLS diff --git a/src/fbd-feedback-vibra.c b/src/fbd-feedback-vibra.c index a04a902..c2dc9d2 100644 --- a/src/fbd-feedback-vibra.c +++ b/src/fbd-feedback-vibra.c @@ -6,6 +6,7 @@ #define G_LOG_DOMAIN "fbd-feedback-vibra" +#include "fbd.h" #include "fbd-enums.h" #include "fbd-feedback-vibra.h" #include "fbd-feedback-vibra-priv.h" @@ -29,13 +30,26 @@ enum { static GParamSpec *props[PROP_LAST_PROP]; typedef struct _FbdFeedbackVibraPrivate { - guint duration; - guint timer_id; + guint duration; + guint timer_id; + double max_strength; + + GSettings *settings; } FbdFeedbackVibraPrivate; G_DEFINE_TYPE_WITH_PRIVATE (FbdFeedbackVibra, fbd_feedback_vibra, FBD_TYPE_FEEDBACK_BASE); +static void +on_max_haptic_strength_changed (FbdFeedbackVibra *self) +{ + FbdFeedbackVibraPrivate *priv = fbd_feedback_vibra_get_instance_private (self); + + priv->max_strength = g_settings_get_double (priv->settings, "max-haptic-strength"); + g_debug ("Max haptic strength: %f", priv->max_strength); +} + + static void on_timeout_expired (FbdFeedbackVibra *self) { @@ -122,12 +136,26 @@ fbd_feedback_vibra_get_property (GObject *object, } } + +static void +fbd_feedback_vibra_finalize (GObject *object) +{ + FbdFeedbackVibra *self = FBD_FEEDBACK_VIBRA (object); + FbdFeedbackVibraPrivate *priv = fbd_feedback_vibra_get_instance_private (self); + + g_clear_object (&priv->settings); + + G_OBJECT_CLASS (fbd_feedback_vibra_parent_class)->finalize (object); +} + + static void fbd_feedback_vibra_class_init (FbdFeedbackVibraClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); FbdFeedbackBaseClass *base_class = FBD_FEEDBACK_BASE_CLASS (klass); + object_class->finalize = fbd_feedback_vibra_finalize; object_class->set_property = fbd_feedback_vibra_set_property; object_class->get_property = fbd_feedback_vibra_get_property; @@ -151,6 +179,15 @@ fbd_feedback_vibra_class_init (FbdFeedbackVibraClass *klass) static void fbd_feedback_vibra_init (FbdFeedbackVibra *self) { + FbdFeedbackVibraPrivate *priv = fbd_feedback_vibra_get_instance_private (self); + + priv->settings = g_settings_new (FEEDBACKD_SCHEMA_ID); + g_signal_connect_object (priv->settings, + "changed::max-haptic-strength", + G_CALLBACK (on_max_haptic_strength_changed), + self, + G_CONNECT_SWAPPED); + on_max_haptic_strength_changed (self); } guint @@ -179,3 +216,16 @@ fbd_feedback_vibra_set_duration (FbdFeedbackVibra *self, guint duration) priv->duration = duration; g_object_notify_by_pspec (G_OBJECT (self), props[PROP_DURATION]); } + + +double +fbd_feedback_vibra_get_max_strength (FbdFeedbackVibra *self) +{ + FbdFeedbackVibraPrivate *priv; + + g_return_val_if_fail (FBD_IS_FEEDBACK_VIBRA (self), 1.0); + + priv = fbd_feedback_vibra_get_instance_private (self); + + return priv->max_strength; +}