Support multiple configuration profiles. #8

Merged
anna merged 2 commits from select-directory into main 2025-07-18 18:28:11 +00:00
Showing only changes of commit 26eede4f75 - Show all commits

View file

@ -1,9 +1,10 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"os" "os"
"path/filepath" "strings"
"sync" "sync"
"git.annabunches.net/annabunches/joyful/internal/config" "git.annabunches.net/annabunches/joyful/internal/config"
@ -13,12 +14,17 @@ import (
"github.com/holoplot/go-evdev" "github.com/holoplot/go-evdev"
) )
func readConfig() *config.ConfigParser { func getConfigDir() string {
configFlag := flag.String("config", "~/.config/joyful", "Directory to read configuration from.")
flag.Parse()
configDir := strings.ReplaceAll(*configFlag, "~", "${HOME}")
return os.ExpandEnv(configDir)
}
func readConfig(configDir string) *config.ConfigParser {
parser := &config.ConfigParser{} parser := &config.ConfigParser{}
homeDir, err := os.UserHomeDir() err := parser.Parse(configDir)
logger.FatalIfError(err, "Can't get user home directory, so can't find configuration.") logger.FatalIfError(err, "Failed to parse config")
err = parser.Parse(filepath.Join(homeDir, ".config/joyful"))
logger.FatalIfError(err, "")
return parser return parser
} }
@ -56,7 +62,8 @@ func initPhysicalDevices(config *config.ConfigParser) map[string]*evdev.InputDev
func main() { func main() {
// parse configs // parse configs
config := readConfig() configDir := getConfigDir()
config := readConfig(configDir)
// Initialize virtual devices with event buffers // Initialize virtual devices with event buffers
vBuffersByName, vBuffersByDevice := initVirtualBuffers(config) vBuffersByName, vBuffersByDevice := initVirtualBuffers(config)
@ -112,8 +119,9 @@ func main() {
fmt.Println("Waiting for existing listeners to exit. Provide input from each of your devices.") fmt.Println("Waiting for existing listeners to exit. Provide input from each of your devices.")
wg.Wait() wg.Wait()
fmt.Println("Listeners exited. Parsing config.") fmt.Println("Listeners exited. Parsing config.")
config := readConfig() // reload the config config := readConfig(configDir) // reload the config
rules, eventChannel, doneChannel, wg = loadRules(config, pDevices, getVirtualDevices(vBuffersByName)) rules, eventChannel, doneChannel, wg = loadRules(config, pDevices, getVirtualDevices(vBuffersByName))
fmt.Println("Config re-loaded. Only rule changes applied. Device and Mode changes require restart.")
} }
} }
} }