From eb65da6377af7e1dab05621ff46987a7386eea00 Mon Sep 17 00:00:00 2001 From: Knut Ahlers Date: Sun, 20 Sep 2020 02:41:09 +0200 Subject: [PATCH] Add support for over/underlays Signed-off-by: Knut Ahlers --- cmd/streamdeck/config.go | 4 +++- cmd/streamdeck/main.go | 23 ++++++++++------------- cmd/streamdeck/page.go | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 cmd/streamdeck/page.go diff --git a/cmd/streamdeck/config.go b/cmd/streamdeck/config.go index e149f0b..7810c9d 100644 --- a/cmd/streamdeck/config.go +++ b/cmd/streamdeck/config.go @@ -19,7 +19,9 @@ type config struct { } type page struct { - Keys map[int]keyDefinition `yaml:"keys"` + Keys map[int]keyDefinition `yaml:"keys"` + Overlay string `yaml:"overlay"` + Underlay string `yaml:"underlay"` } type keyDefinition struct { diff --git a/cmd/streamdeck/main.go b/cmd/streamdeck/main.go index f3b7184..a737620 100644 --- a/cmd/streamdeck/main.go +++ b/cmd/streamdeck/main.go @@ -167,7 +167,7 @@ func main() { offTimer.Reset(userConfig.DisplayOffTime) } - kd, ok := activePage.Keys[evt.Key] + kd, ok := activePage.GetKeyDefinitions(userConfig)[evt.Key] if !ok { continue } @@ -192,7 +192,7 @@ func main() { continue } - var nextPage = userConfig.DefaultPage + nextPage := userConfig.DefaultPage if _, ok := userConfig.Pages[activePageName]; ok { nextPage = activePageName } @@ -229,19 +229,16 @@ func togglePage(page string) error { activePageCtx, activePageCtxCancel = context.WithCancel(context.Background()) sd.ClearAllKeys() - for idx := range activePage.Keys { - if activePage.Keys[idx].Display.Type == "" { + for idx, kd := range activePage.GetKeyDefinitions(userConfig) { + if kd.Display.Type == "" { continue } - go func(idx int) { - var ( - kd = activePage.Keys[idx] - keyLogger = log.WithFields(log.Fields{ - "key": idx, - "page": activePageName, - }) - ) + go func(idx int, kd keyDefinition) { + keyLogger := log.WithFields(log.Fields{ + "key": idx, + "page": activePageName, + }) if err := callDisplayElement(activePageCtx, idx, kd); err != nil { keyLogger.WithError(err).Error("Unable to execute display element") @@ -250,7 +247,7 @@ func togglePage(page string) error { keyLogger.WithError(err).Error("Unable to execute error display element") } } - }(idx) + }(idx, kd) } return nil diff --git a/cmd/streamdeck/page.go b/cmd/streamdeck/page.go new file mode 100644 index 0000000..d9e6509 --- /dev/null +++ b/cmd/streamdeck/page.go @@ -0,0 +1,34 @@ +package main + +func (p page) GetKeyDefinitions(cfg config) map[int]keyDefinition { + var ( + defMaps []map[int]keyDefinition + result = make(map[int]keyDefinition) + ) + + // First process underlay if defined + if p.Underlay != "" { + defMaps = append(defMaps, cfg.Pages[p.Underlay].Keys) + } + + // Process current definition + defMaps = append(defMaps, p.Keys) + + // Last process overlay if defined + if p.Overlay != "" { + defMaps = append(defMaps, cfg.Pages[p.Overlay].Keys) + } + + // Assemble combination of keys + for _, pageDef := range defMaps { + for idx, kd := range pageDef { + if kd.Display.Type == "" { + continue + } + + result[idx] = kd + } + } + + return result +}