diff --git a/cmd/streamdeck/main.go b/cmd/streamdeck/main.go index 6f55637..f3b7184 100644 --- a/cmd/streamdeck/main.go +++ b/cmd/streamdeck/main.go @@ -235,12 +235,20 @@ func togglePage(page string) error { } go func(idx int) { - var kd = activePage.Keys[idx] - if err := callDisplayElement(activePageCtx, idx, kd); err != nil { - log.WithFields(log.Fields{ + var ( + kd = activePage.Keys[idx] + keyLogger = log.WithFields(log.Fields{ "key": idx, "page": activePageName, - }).WithError(err).Error("Unable to execute display element") + }) + ) + + if err := callDisplayElement(activePageCtx, idx, kd); err != nil { + keyLogger.WithError(err).Error("Unable to execute display element") + + if err := callErrorDisplayElement(activePageCtx, idx); err != nil { + keyLogger.WithError(err).Error("Unable to execute error display element") + } } }(idx) } diff --git a/cmd/streamdeck/registry.go b/cmd/streamdeck/registry.go index ecd9585..88a19f2 100644 --- a/cmd/streamdeck/registry.go +++ b/cmd/streamdeck/registry.go @@ -9,6 +9,12 @@ import ( log "github.com/sirupsen/logrus" ) +const errorDisplayElementType = "color" + +var errorDisplayElementAttributes = map[string]interface{}{ + "rgba": []interface{}{0xff, 0x0, 0x0, 0xff}, +} + type action interface { Execute(attributes map[string]interface{}) error } @@ -80,3 +86,19 @@ func callDisplayElement(ctx context.Context, idx int, kd keyDefinition) error { return inst.(displayElement).Display(ctx, idx, kd.Display.Attributes) } + +func callErrorDisplayElement(ctx context.Context, idx int) error { + t, ok := registeredDisplayElements[errorDisplayElementType] + if !ok { + return errors.Errorf("Unknown display type %q", errorDisplayElementType) + } + + var inst interface{} + if t.Kind() == reflect.Ptr { + inst = reflect.New(t.Elem()).Interface() + } else { + inst = reflect.New(t).Interface() + } + + return inst.(displayElement).Display(ctx, idx, errorDisplayElementAttributes) +}