From e16dc3cdab4db194e895534313b86eca21baab67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Thu, 13 Jun 2024 15:29:11 +0200 Subject: [PATCH] feedback-led: Check if at least one LED is available So far we didn't create any FbdDevLeds if there wasn't at least one usable LED. Once we introduce flash LEDs we might probe the LED but the LED might not be usable as the user hasn't enabled using it. Prepare for that scenario. --- src/fbd-dev-leds.c | 29 ++++++++++++++++++++++++++--- src/fbd-dev-leds.h | 4 ++-- src/fbd-feedback-led.c | 5 ++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/fbd-dev-leds.c b/src/fbd-dev-leds.c index f0eb1df..ae9c278 100644 --- a/src/fbd-dev-leds.c +++ b/src/fbd-dev-leds.c @@ -48,7 +48,7 @@ find_led_by_color (FbdDevLeds *self, FbdFeedbackLedColor color) g_return_val_if_fail (self->leds, NULL); for (GSList *l = self->leds; l != NULL; l = l->next) { - FbdDevLed *led = l->data; + FbdDevLed *led = FBD_DEV_LED (l->data); if (fbd_dev_led_supports_color (led, color)) return led; } @@ -199,7 +199,10 @@ fbd_dev_leds_start_periodic (FbdDevLeds *self, g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE); g_return_val_if_fail (max_brightness_percentage <= 100.0, FALSE); led = find_led_by_color (self, color); - g_return_val_if_fail (led, FALSE); + if (!led) { + g_warning_once ("No usable led found"); + return FALSE; + } fbd_dev_led_set_color (led, color, rgb); @@ -214,7 +217,27 @@ fbd_dev_leds_stop (FbdDevLeds *self, FbdFeedbackLedColor color) g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE); led = find_led_by_color (self, color); - g_return_val_if_fail (led, FALSE); + if (!led) { + g_warning_once ("No usable led found"); + return FALSE; + } return fbd_dev_led_set_brightness (led, 0); } + +/** + * fbd_dev_leds_has_led: + * @self: The FbdDevLeds + * @color: The color type to check + * + * Whether there's a usable LED of the given type + * + * Returns: `TRUE` if there's a at least one usable LED, otherwise `FALSE` + */ +gboolean +fbd_dev_leds_has_led (FbdDevLeds *self, FbdFeedbackLedColor color) +{ + g_return_val_if_fail (FBD_IS_DEV_LEDS (self), FALSE); + + return !!find_led_by_color (self, color); +} diff --git a/src/fbd-dev-leds.h b/src/fbd-dev-leds.h index 6387882..368ec2c 100644 --- a/src/fbd-dev-leds.h +++ b/src/fbd-dev-leds.h @@ -22,7 +22,7 @@ gboolean fbd_dev_leds_start_periodic (FbdDevLeds *self, FbdLedRgbColor *rgb, guint max_brighness, guint freq); -gboolean fbd_dev_leds_stop (FbdDevLeds *self, - FbdFeedbackLedColor color); +gboolean fbd_dev_leds_stop (FbdDevLeds *self, FbdFeedbackLedColor color); +gboolean fbd_dev_leds_has_led (FbdDevLeds *self, FbdFeedbackLedColor color); G_END_DECLS diff --git a/src/fbd-feedback-led.c b/src/fbd-feedback-led.c index dc297b7..f9fd408 100644 --- a/src/fbd-feedback-led.c +++ b/src/fbd-feedback-led.c @@ -250,7 +250,10 @@ fbd_feedback_led_is_available (FbdFeedbackBase *base) FbdFeedbackManager *manager = fbd_feedback_manager_get_default (); FbdDevLeds *dev = fbd_feedback_manager_get_dev_leds (manager); - return FBD_IS_DEV_LEDS (dev); + if (!FBD_IS_DEV_LEDS (dev)) + return FALSE; + + return fbd_dev_leds_has_led (dev, FBD_FEEDBACK_LED_COLOR_WHITE); }