xyosc/config/config.go

190 lines
5.1 KiB
Go
Raw Permalink Normal View History

2024-10-20 22:58:09 +02:00
package config
import (
"bufio"
"fmt"
"image/color"
"os"
"path/filepath"
"xyosc/utils"
2024-11-02 17:50:15 +01:00
"github.com/fsnotify/fsnotify"
2024-10-20 22:58:09 +02:00
"github.com/kirsle/configdir"
"gopkg.in/yaml.v2"
)
type ConfigS struct {
2024-11-03 14:48:53 +01:00
FPSCounter bool
ShowMPRIS bool
MPRISTextOpacity uint8
TargetFPS int32
WindowWidth int32
WindowHeight int32
CaptureDeviceIndex int
SampleRate uint32
RingBufferSize uint32
ReadBufferSize uint32
Gain float32
LineOpacity uint8
LineBrightness float64
LineThickness float32
LineInvSqrtOpacityControl bool
Particles bool
ParticleGenPerFrameEveryXSamples int
ParticleMaxCount int
ParticleMinSize float32
ParticleMaxSize float32
ParticleAcceleration float32
2024-11-19 22:41:47 +01:00
ParticleDrag float32
2024-10-20 22:58:09 +02:00
}
var DefaultConfig = ConfigS{
2024-11-03 14:48:53 +01:00
FPSCounter: false,
ShowMPRIS: true,
MPRISTextOpacity: 255,
TargetFPS: 240,
WindowWidth: 1300,
WindowHeight: 1300,
CaptureDeviceIndex: 0,
SampleRate: 96000,
RingBufferSize: 9600,
ReadBufferSize: 9600,
Gain: 1,
LineOpacity: 200,
LineBrightness: 1,
LineThickness: 3,
LineInvSqrtOpacityControl: false,
Particles: true,
2024-11-19 22:41:47 +01:00
ParticleGenPerFrameEveryXSamples: 2000,
ParticleMaxCount: 600,
2024-11-03 14:48:53 +01:00
ParticleMinSize: 0.2,
ParticleMaxSize: 2.0,
2024-11-19 22:41:47 +01:00
ParticleAcceleration: 0.015,
ParticleDrag: 5.0,
2024-10-20 22:58:09 +02:00
}
var Config ConfigS
var AccentColor color.RGBA
2024-10-21 00:44:44 +02:00
var FirstColor color.RGBA
var ThirdColor color.RGBA
2024-11-02 23:58:30 +01:00
var ThirdColorAdj color.RGBA
2024-10-20 22:58:09 +02:00
2024-11-02 17:50:15 +01:00
var watcher *fsnotify.Watcher
2024-10-20 22:58:09 +02:00
func Init() {
configPath := configdir.LocalConfig("ontake", "xyosc")
err := configdir.MakePath(configPath) // Ensure it exists.
utils.CheckError(err)
configFile := filepath.Join(configPath, "config.yml")
// Does the file not exist?
if _, err = os.Stat(configFile); os.IsNotExist(err) {
// Create the new config file.
fh, err := os.Create(configFile)
utils.CheckError(err)
defer fh.Close()
encoder := yaml.NewEncoder(fh)
encoder.Encode(&DefaultConfig)
Config = DefaultConfig
} else {
// Load the existing file.
fh, err := os.Open(configFile)
utils.CheckError(err)
defer fh.Close()
decoder := yaml.NewDecoder(fh)
decoder.Decode(&Config)
}
// Get pywal accent color
2024-11-02 17:50:15 +01:00
watcher, err = fsnotify.NewWatcher()
utils.CheckError(err)
updatePywalColors()
walPath := configdir.LocalCache("wal")
walFile := filepath.Join(walPath, "colors")
// Start listening for events.
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
return
}
if event.Has(fsnotify.Write) {
updatePywalColors()
}
case err, ok := <-watcher.Errors:
if !ok {
return
}
utils.CheckError(err)
}
}
}()
if _, err := os.Stat(walFile); os.IsNotExist(err) {
} else {
err = watcher.Add(walFile)
utils.CheckError(err)
}
}
func updatePywalColors() {
2024-10-20 22:58:09 +02:00
walPath := configdir.LocalCache("wal")
walFile := filepath.Join(walPath, "colors")
2024-11-02 17:50:15 +01:00
if _, err := os.Stat(walFile); os.IsNotExist(err) {
2024-10-20 22:58:09 +02:00
AccentColor = color.RGBA{255, 0, 0, Config.LineOpacity}
2024-10-21 00:44:44 +02:00
FirstColor = color.RGBA{255, 120, 120, Config.LineOpacity}
ThirdColor = color.RGBA{255, 0, 0, Config.LineOpacity}
2024-11-02 23:58:30 +01:00
ThirdColorAdj = color.RGBA{uint8(255 * Config.LineBrightness), 0, 0, Config.LineOpacity}
2024-10-20 22:58:09 +02:00
} else {
fh, err := os.Open(walFile)
utils.CheckError(err)
defer fh.Close()
scanner := bufio.NewScanner(fh)
var line int
var rgbaColor color.RGBA
for scanner.Scan() {
2024-10-21 00:44:44 +02:00
if line == 0 {
rgbaColor, err = ParseHexColor(scanner.Text())
utils.CheckError(err)
FirstColor = color.RGBA{rgbaColor.R, rgbaColor.G, rgbaColor.B, Config.LineOpacity}
}
2024-10-20 22:58:09 +02:00
if line == 1 {
rgbaColor, err = ParseHexColor(scanner.Text())
utils.CheckError(err)
2024-10-21 00:44:44 +02:00
AccentColor = color.RGBA{rgbaColor.R, rgbaColor.G, rgbaColor.B, Config.LineOpacity}
}
if line == 2 {
rgbaColor, err = ParseHexColor(scanner.Text())
utils.CheckError(err)
ThirdColor = color.RGBA{rgbaColor.R, rgbaColor.G, rgbaColor.B, Config.LineOpacity}
2024-11-02 23:58:30 +01:00
ThirdColorAdj = color.RGBA{uint8(float64(rgbaColor.R) * Config.LineBrightness), uint8(float64(rgbaColor.G) * Config.LineBrightness), uint8(float64(rgbaColor.B) * Config.LineBrightness), Config.LineOpacity}
2024-10-20 22:58:09 +02:00
break
}
line++
}
}
}
func ParseHexColor(s string) (c color.RGBA, err error) {
c.A = 0xff
switch len(s) {
case 7:
_, err = fmt.Sscanf(s, "#%02x%02x%02x", &c.R, &c.G, &c.B)
case 4:
_, err = fmt.Sscanf(s, "#%1x%1x%1x", &c.R, &c.G, &c.B)
// Double the hex digits:
c.R *= 17
c.G *= 17
c.B *= 17
default:
err = fmt.Errorf("invalid length, must be 7 or 4")
}
return
}