From a150dcd0d06645113d790622f4bf30da57fdff59 Mon Sep 17 00:00:00 2001 From: Nikos Verschore Date: Tue, 5 Oct 2021 11:20:31 +0200 Subject: [PATCH 1/2] Add support for automatic reloading the config when it has been changed --- deck.go | 33 +++++++++++++++++++++++++++++++-- go.mod | 1 + go.sum | 1 + main.go | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/deck.go b/deck.go index ea04e63..f0d3c07 100644 --- a/deck.go +++ b/deck.go @@ -14,6 +14,7 @@ import ( "github.com/atotto/clipboard" "github.com/godbus/dbus" "github.com/muesli/streamdeck" + "github.com/fsnotify/fsnotify" ) // Deck is a set of widgets. @@ -24,11 +25,12 @@ type Deck struct { } // LoadDeck loads a deck configuration. -func LoadDeck(dev *streamdeck.Device, base string, deck string) (*Deck, error) { - path, err := expandPath(base, deck) +func LoadDeck(dev *streamdeck.Device, base string, deckName string) (*Deck, error) { + path, err := expandPath(base, deckName) if err != nil { return nil, err } + currentDeck = path fmt.Println("Loading deck:", path) dc, err := LoadConfig(path) @@ -70,6 +72,33 @@ func LoadDeck(dev *streamdeck.Device, base string, deck string) (*Deck, error) { d.Widgets = append(d.Widgets, w) } + watcher, err := fsnotify.NewWatcher() + err = watcher.Add(path) + + go func() { + for { + select { + case event := <-watcher.Events: + if currentDeck == path { + fmt.Println("Change: %s: %s", event.Op, event.Name) + d, err := LoadDeck(dev, base, deckName) + if err != nil { + fatal(err) + } + err = dev.Clear() + if err != nil { + fatal(err) + } + + deck = d + deck.updateWidgets() + return + } + } + } + }() + + return &d, nil } diff --git a/go.mod b/go.mod index f16fd49..019e535 100644 --- a/go.mod +++ b/go.mod @@ -10,6 +10,7 @@ require ( github.com/atotto/clipboard v0.1.4 github.com/bendahl/uinput v1.4.1 github.com/flopp/go-findfont v0.0.0-20201114153133-e7393a00c15b + github.com/fsnotify/fsnotify v1.4.7 github.com/go-ole/go-ole v1.2.4 // indirect github.com/godbus/dbus v4.1.0+incompatible github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 diff --git a/go.sum b/go.sum index 3f3578c..bbf994f 100644 --- a/go.sum +++ b/go.sum @@ -31,6 +31,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/flopp/go-findfont v0.0.0-20201114153133-e7393a00c15b h1:/wqXgpZNTP8qV1dPEApjJXlDQd5N/F9U/WEvy5SawUI= github.com/flopp/go-findfont v0.0.0-20201114153133-e7393a00c15b/go.mod h1:wKKxRDjD024Rh7VMwoU90i6ikQRCr+JTHB5n4Ejkqvw= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= diff --git a/main.go b/main.go index 0a1facf..9c03542 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ import ( var ( deck *Deck + currentDeck string dbusConn *dbus.Conn keyboard uinput.Keyboard From ff3bf580cdbb93b52476e01a94a15331912a155f Mon Sep 17 00:00:00 2001 From: Nikos Verschore Date: Tue, 5 Oct 2021 21:59:22 +0200 Subject: [PATCH 2/2] Fix formatting --- deck.go | 41 ++++++++++++++++++++--------------------- main.go | 4 ++-- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/deck.go b/deck.go index f0d3c07..c4a3f98 100644 --- a/deck.go +++ b/deck.go @@ -12,9 +12,9 @@ import ( "time" "github.com/atotto/clipboard" + "github.com/fsnotify/fsnotify" "github.com/godbus/dbus" "github.com/muesli/streamdeck" - "github.com/fsnotify/fsnotify" ) // Deck is a set of widgets. @@ -72,33 +72,32 @@ func LoadDeck(dev *streamdeck.Device, base string, deckName string) (*Deck, erro d.Widgets = append(d.Widgets, w) } - watcher, err := fsnotify.NewWatcher() - err = watcher.Add(path) + watcher, err := fsnotify.NewWatcher() + err = watcher.Add(path) - go func() { + go func() { for { select { - case event := <-watcher.Events: - if currentDeck == path { - fmt.Println("Change: %s: %s", event.Op, event.Name) - d, err := LoadDeck(dev, base, deckName) - if err != nil { - fatal(err) - } - err = dev.Clear() - if err != nil { - fatal(err) - } - - deck = d - deck.updateWidgets() - return + case event := <-watcher.Events: + if currentDeck == path { + fmt.Printf("Change: %s: %s\n", event.Op, event.Name) + d, err := LoadDeck(dev, base, deckName) + if err != nil { + fatal(err) + } + err = dev.Clear() + if err != nil { + fatal(err) } - } + + deck = d + deck.updateWidgets() + return + } + } } }() - return &d, nil } diff --git a/main.go b/main.go index 9c03542..597aabc 100644 --- a/main.go +++ b/main.go @@ -15,8 +15,8 @@ import ( ) var ( - deck *Deck - currentDeck string + deck *Deck + currentDeck string dbusConn *dbus.Conn keyboard uinput.Keyboard