package configparser import ( "fmt" "strings" "git.annabunches.net/annabunches/joyful/internal/logger" "github.com/holoplot/go-evdev" ) // InitPhysicalDevices will create InputDevices corresponding to any registered // devices with type = physical. // // This function assumes Parse() has been called. // // This function should only be called once. func (parser *ConfigParser) InitPhysicalDevices() map[string]*evdev.InputDevice { deviceMap := make(map[string]*evdev.InputDevice) for _, deviceConfig := range parser.config.Devices { if strings.ToLower(deviceConfig.Type) != DeviceTypePhysical { continue } deviceConfig := deviceConfig.Config.(DeviceConfigPhysical) var infoName string var device *evdev.InputDevice var err error if deviceConfig.DevicePath != "" { infoName = deviceConfig.DevicePath device, err = evdev.Open(deviceConfig.DevicePath) } else { infoName = deviceConfig.DeviceName device, err = evdev.OpenByName(deviceConfig.DeviceName) } if err != nil { logger.LogError(err, "Failed to open physical device, skipping. Confirm the device name or path with 'evinfo'") continue } if deviceConfig.Lock { logger.LogDebugf("Locking device '%s'", infoName) err := device.Grab() if err != nil { logger.LogError(err, "Failed to grab device for exclusive access") } } logger.Log(fmt.Sprintf("Connected to '%s' as '%s'", infoName, deviceConfig.Name)) deviceMap[deviceConfig.Name] = device } return deviceMap }