From cf8b7c80693b94516ef8ab01321f5e791ef47223 Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 1 Apr 2023 23:16:17 +0200 Subject: Fixture display: Retrieve combined state only once Note that this use of state-find doesn't look up the home value if there's no value in the combined state. We assume that no intensity means zero intensity, i.e. that the home value for intensity is always zero. --- src/starlet-fixture-display.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/starlet-fixture-display.c b/src/starlet-fixture-display.c index 5775741..5ff3356 100644 --- a/src/starlet-fixture-display.c +++ b/src/starlet-fixture-display.c @@ -340,13 +340,14 @@ static void request_intensities(struct fixture_display *fixd) { int i; + repl_send(fixd->repl, "(define all-vals (current-value-state))\n"); for ( i=0; in_fixtures; i++ ) { char tmp[256]; snprintf(tmp, 256, "(list" " 'fixture-parameters" " (list \"%s\" " - " (current-value %s intensity) " - " (let ((col (current-value %s colour)))" + " (state-find %s intensity all-vals) " + " (let ((col (state-find %s colour all-vals)))" " (if (colour? col)" " (colour-as-rgb col)" " #f))))", @@ -585,7 +586,12 @@ static void handle_fixture_parameters(struct fixture_display *fixd, SCM list) fix = find_fixture(fixd, fixture_name); if ( fix != NULL ) { - fix->intensity = scm_to_double(scm_list_ref(list, scm_from_int(1))); + SCM i = scm_list_ref(list, scm_from_int(1)); + if ( symbol_eq(i, "no-value") ) { + fix->intensity = 0.0; + } else { + fix->intensity = scm_to_double(i); + } read_rgb(fix->rgb, scm_list_ref(list, scm_from_int(2))); } else { fprintf(stderr, "Unrecognised fixture '%s' (parameters)\n", -- cgit v1.2.3