From c37bfecbe0f825059c5e4ba9dbfb2b3fbddc15db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Sun, 9 Mar 2025 14:55:40 +0100 Subject: [PATCH] vibra-periodic: Add a fallback for the previous [0, 0xFFFF] range MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This keeps old themes working Signed-off-by: Guido Günther --- src/fbd-feedback-vibra-periodic.c | 14 ++++++++++ tests/test-fbd-feedback-vibra.c | 46 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/src/fbd-feedback-vibra-periodic.c b/src/fbd-feedback-vibra-periodic.c index 3e0b15b..f1b81ff 100644 --- a/src/fbd-feedback-vibra-periodic.c +++ b/src/fbd-feedback-vibra-periodic.c @@ -58,6 +58,13 @@ fbd_feedback_vibra_periodic_serializable_deserialize_property (JsonSerializable if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { double magnitude = json_node_get_double (property_node); + /* Backward compat handling: Initially magnitude was given as [0, 0xFFFF] */ + if (magnitude > 1.0) { + g_warning_once ("Too large magnitude %.2f detected, please update the theme", magnitude); + magnitude = magnitude / 0xFFFF; + } + + g_value_set_double (value, magnitude); return TRUE; } @@ -65,6 +72,13 @@ fbd_feedback_vibra_periodic_serializable_deserialize_property (JsonSerializable if (JSON_NODE_TYPE (property_node) == JSON_NODE_VALUE) { double fade_in_level = json_node_get_double (property_node); + /* Backward compat handling: Initially duration was given as [0, 0xFFFF] */ + if (fade_in_level > 1.0) { + g_warning_once ("Too large fade-in-level %.2f detected, please update the theme", + fade_in_level); + fade_in_level = fade_in_level / 0xFFFF; + } + g_value_set_double (value, fade_in_level); return TRUE; } diff --git a/tests/test-fbd-feedback-vibra.c b/tests/test-fbd-feedback-vibra.c index af13a43..d0c14b8 100644 --- a/tests/test-fbd-feedback-vibra.c +++ b/tests/test-fbd-feedback-vibra.c @@ -132,6 +132,50 @@ test_fbd_feedback_vibra_periodic (void) } +static void +test_fbd_feedback_vibra_periodic_fallback (void) +{ + /* Create manager upfront so we can dispose it, otherwise creating + * any feedback would create it implicitly */ + FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); + g_autoptr (GError) err = NULL; + g_autoptr (JsonNode) node = NULL; + GObject *object; + double magnitude, fade_in_level; + guint fade_in_time; + + node = json_from_string("{" + " \"event-name\" : \"button-pressed\"," + " \"type\" : \"VibraPeriodic\"," + " \"magnitude\" : 65535," + " \"fade-in-level\" : 13107" + "}", &err); + g_assert_no_error (err); + + g_test_expect_message ("fbd-feedback-vibra-periodic", + G_LOG_LEVEL_WARNING, + "Too large magnitude 65535.00 detected*"); + g_test_expect_message ("fbd-feedback-vibra-periodic", + G_LOG_LEVEL_WARNING, + "Too large fade-in-level 13107.00 detected*"); + object = json_gobject_deserialize (FBD_TYPE_FEEDBACK_VIBRA_PERIODIC, node); + g_test_assert_expected_messages (); + + g_object_get (object, + "magnitude", &magnitude, + "fade-in-level", &fade_in_level, + "fade-in-time", &fade_in_time, + NULL); + + g_assert_cmpfloat_with_epsilon (magnitude, 1.0, FLT_EPSILON); + g_assert_cmpfloat_with_epsilon (fade_in_level, 0.2, FLT_EPSILON); + g_assert_cmpint (fade_in_time, ==, 500); + + g_assert_finalize_object (object); + g_assert_finalize_object (manager); +} + + gint main (gint argc, gchar *argv[]) { @@ -140,6 +184,8 @@ main (gint argc, gchar *argv[]) g_test_add_func("/feedbackd/fbd/feedback-vibra/rumble", test_fbd_feedback_vibra_rumble); g_test_add_func("/feedbackd/fbd/feedback-vibra/pattern", test_fbd_feedback_vibra_pattern); g_test_add_func("/feedbackd/fbd/feedback-vibra/periodic", test_fbd_feedback_vibra_periodic); + g_test_add_func("/feedbackd/fbd/feedback-vibra/periodic/fallback", + test_fbd_feedback_vibra_periodic_fallback); return g_test_run(); }