@@ -12,6 +12,7 @@ import (
1212 "time"
1313
1414 "github.com/atotto/clipboard"
15+ "github.com/fsnotify/fsnotify"
1516 "github.com/godbus/dbus"
1617 "github.com/muesli/streamdeck"
1718)
@@ -24,11 +25,12 @@ type Deck struct {
2425}
2526
2627// LoadDeck loads a deck configuration.
27- func LoadDeck (dev * streamdeck.Device , base string , deck string ) (* Deck , error ) {
28- path , err := expandPath (base , deck )
28+ func LoadDeck (dev * streamdeck.Device , base string , deckName string ) (* Deck , error ) {
29+ path , err := expandPath (base , deckName )
2930 if err != nil {
3031 return nil , err
3132 }
33+ currentDeck = path
3234 fmt .Println ("Loading deck:" , path )
3335
3436 dc , err := LoadConfig (path )
@@ -70,6 +72,42 @@ func LoadDeck(dev *streamdeck.Device, base string, deck string) (*Deck, error) {
7072 d .Widgets = append (d .Widgets , w )
7173 }
7274
75+ watcher , err := fsnotify .NewWatcher ()
76+ if err == nil {
77+ err = watcher .Add (path )
78+ if err == nil {
79+
80+ go func () {
81+ for {
82+ select {
83+ case event := <- watcher .Events :
84+ if currentDeck == path {
85+ fmt .Printf ("Change: %s: %s\n " , event .Op , event .Name )
86+ d , err := LoadDeck (dev , base , deckName )
87+ if err != nil {
88+ fatal (err )
89+ }
90+ err = dev .Clear ()
91+ if err != nil {
92+ fatal (err )
93+ }
94+
95+ deck = d
96+ deck .updateWidgets ()
97+ return
98+ }
99+ case error := <- watcher .Errors :
100+ fmt .Printf ("Watcher had an error: %s\n " , error )
101+ }
102+ }
103+ }()
104+ } else {
105+ fmt .Printf ("Failed to watch deck, automatic reloading diabled: %s\n " , err )
106+ }
107+ } else {
108+ fmt .Printf ("Failed to initialize fsnotify, automatic reloading diabled: %s\n " , err )
109+ }
110+
73111 return & d , nil
74112}
75113
0 commit comments