11package main
22
33import (
4+ "flag"
45 "fmt"
5- "image "
6+ "log "
67 "os"
78 "time"
89
9- "image/draw"
10- _ "image/jpeg"
11- _ "image/png"
12-
1310 "github.com/davecgh/go-spew/spew"
1411 "github.com/muesli/streamdeck"
1512)
1613
1714var (
15+ dev streamdeck.Device
16+ deck * Deck
17+ x Xorg
1818 recentWindows []Window
19- )
2019
21- func updateRecentApps (dev streamdeck.Device ) {
22- for i := 0 ; i < int (dev .Columns )* int (dev .Rows ); i ++ {
23- img := image .NewRGBA (image .Rect (0 , 0 , 72 , 72 ))
24-
25- if i < len (recentWindows ) {
26- draw .Draw (img , image .Rect (4 , 4 , 68 , 68 ), recentWindows [i ].Icon , image.Point {0 , 0 }, draw .Src )
27- }
28-
29- err := dev .SetImage (uint8 (i ), img )
30- if err != nil {
31- panic (err )
32- }
33- }
34- }
20+ deckFile = flag .String ("deck" , "deckmaster.deck" , "path to deck config file" )
21+ )
3522
3623func handleActiveWindowChanged (dev streamdeck.Device , event ActiveWindowChangedEvent ) {
3724 fmt .Println (fmt .Sprintf ("Active window changed to %s (%d, %s)" ,
@@ -53,7 +40,7 @@ func handleActiveWindowChanged(dev streamdeck.Device, event ActiveWindowChangedE
5340 if len (recentWindows ) > 15 {
5441 recentWindows = recentWindows [0 :15 ]
5542 }
56- updateRecentApps ( dev )
43+ deck . updateWidgets ( )
5744}
5845
5946func handleWindowClosed (dev streamdeck.Device , event WindowClosedEvent ) {
@@ -67,65 +54,74 @@ func handleWindowClosed(dev streamdeck.Device, event WindowClosedEvent) {
6754 i ++
6855 }
6956 recentWindows = recentWindows [:i ]
70- updateRecentApps (dev )
71-
57+ deck .updateWidgets ()
7258}
7359
7460func main () {
75- x := Connect (os .Getenv ("DISPLAY" ))
61+ flag .Parse ()
62+
63+ var err error
64+ deck , err = LoadDeck (* deckFile )
65+ if err != nil {
66+ log .Fatal (err )
67+ }
68+
69+ x = Connect (os .Getenv ("DISPLAY" ))
7670 defer x .Close ()
7771
7872 tch := make (chan interface {})
7973 x .TrackWindows (tch , time .Second )
8074
8175 d , err := streamdeck .Devices ()
8276 if err != nil {
83- panic (err )
77+ log . Fatal (err )
8478 }
8579 if len (d ) == 0 {
8680 fmt .Println ("No Stream Deck devices found." )
8781 return
8882 }
89- dev : = d [0 ]
83+ dev = d [0 ]
9084
9185 err = dev .Open ()
9286 if err != nil {
93- panic (err )
87+ log . Fatal (err )
9488 }
9589 ver , err := dev .FirmwareVersion ()
9690 if err != nil {
97- panic (err )
91+ log . Fatal (err )
9892 }
9993 fmt .Printf ("Found device with serial %s (firmware %s)\n " ,
10094 dev .Serial , ver )
10195
10296 err = dev .Reset ()
10397 if err != nil {
104- panic (err )
98+ log . Fatal (err )
10599 }
106100 err = dev .SetBrightness (80 )
107101 if err != nil {
108- panic (err )
102+ log . Fatal (err )
109103 }
110104
111105 kch , err := dev .ReadKeys ()
112106 if err != nil {
113- panic (err )
107+ log . Fatal (err )
114108 }
115109 for {
116110 select {
111+ case <- time .After (500 * time .Millisecond ):
112+ deck .updateWidgets ()
117113 case k , ok := <- kch :
118114 if ! ok {
119115 err = dev .Open ()
120116 if err != nil {
121- panic (err )
117+ log . Fatal (err )
122118 }
123119 continue
124120 }
125121 spew .Dump (k )
126122
127- if k .Pressed && int ( k . Index ) < len ( recentWindows ) {
128- x . RequestActivation ( recentWindows [ k .Index ] )
123+ if k .Pressed {
124+ deck . triggerAction ( k .Index )
129125 }
130126 case e := <- tch :
131127 switch event := e .(type ) {
0 commit comments