2026-02-11 19:16:22 -08:00
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"image/color"
|
|
|
|
|
"os"
|
|
|
|
|
"os/signal"
|
|
|
|
|
"syscall"
|
|
|
|
|
|
2026-02-11 19:19:07 -08:00
|
|
|
"qrun/lib/streamdeck"
|
2026-02-11 19:16:22 -08:00
|
|
|
)
|
|
|
|
|
|
2026-02-11 19:38:18 -08:00
|
|
|
var keyLabels = []string{
|
|
|
|
|
"1", "2", "3", "4", "5", "6", "7", "8",
|
|
|
|
|
"A", "B", "C", "D", "E", "F", "G", "H",
|
|
|
|
|
"I", "J", "K", "L", "M", "N", "O", "P",
|
|
|
|
|
"Q", "R", "S", "T", "U", "V", "W", "X",
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-11 19:23:25 -08:00
|
|
|
var palette = []color.RGBA{
|
|
|
|
|
{220, 50, 50, 255},
|
|
|
|
|
{50, 180, 50, 255},
|
|
|
|
|
{50, 100, 220, 255},
|
|
|
|
|
{220, 160, 30, 255},
|
|
|
|
|
{180, 50, 180, 255},
|
|
|
|
|
{50, 180, 180, 255},
|
|
|
|
|
{220, 120, 50, 255},
|
|
|
|
|
{100, 100, 200, 255},
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-11 19:38:18 -08:00
|
|
|
func drawKey(dev *streamdeck.Device, key int, active bool) {
|
2026-02-11 19:23:25 -08:00
|
|
|
col := key % streamdeck.KeyCols()
|
2026-02-11 19:38:18 -08:00
|
|
|
bg := palette[col]
|
|
|
|
|
if !active {
|
|
|
|
|
bg = color.RGBA{bg.R / 3, bg.G / 3, bg.B / 3, 255}
|
2026-02-11 19:23:25 -08:00
|
|
|
}
|
2026-02-11 19:38:18 -08:00
|
|
|
dev.SetKeyText(key, bg, color.White, keyLabels[key])
|
2026-02-11 19:23:25 -08:00
|
|
|
}
|
|
|
|
|
|
2026-02-11 19:16:22 -08:00
|
|
|
func main() {
|
|
|
|
|
dev, err := streamdeck.Open()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
|
|
|
|
|
os.Exit(1)
|
|
|
|
|
}
|
|
|
|
|
defer dev.Close()
|
|
|
|
|
|
|
|
|
|
fmt.Printf("Connected to: %s (serial: %s)\n", dev.Product(), dev.SerialNumber())
|
|
|
|
|
|
|
|
|
|
dev.SetBrightness(80)
|
|
|
|
|
|
|
|
|
|
for i := 0; i < streamdeck.KeyCount(); i++ {
|
2026-02-11 19:38:18 -08:00
|
|
|
drawKey(dev, i, false)
|
2026-02-11 19:16:22 -08:00
|
|
|
}
|
|
|
|
|
|
2026-02-11 19:23:25 -08:00
|
|
|
active := make([]bool, streamdeck.KeyCount())
|
|
|
|
|
|
2026-02-11 19:16:22 -08:00
|
|
|
keys := make(chan streamdeck.KeyEvent, 64)
|
|
|
|
|
go func() {
|
|
|
|
|
if err := dev.ReadKeys(keys); err != nil {
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Read error: %v\n", err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
sig := make(chan os.Signal, 1)
|
|
|
|
|
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
|
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case ev := <-keys:
|
2026-02-11 19:23:25 -08:00
|
|
|
if !ev.Pressed {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
active[ev.Key] = !active[ev.Key]
|
2026-02-11 19:38:18 -08:00
|
|
|
drawKey(dev, ev.Key, active[ev.Key])
|
|
|
|
|
fmt.Printf("Key %s toggled %v\n", keyLabels[ev.Key], active[ev.Key])
|
2026-02-11 19:16:22 -08:00
|
|
|
case <-sig:
|
|
|
|
|
fmt.Println()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|