joyful/internal/mappingrules/rule_target_modeselect.go

52 lines
1.4 KiB
Go

package mappingrules
import (
"errors"
"slices"
"git.annabunches.net/annabunches/joyful/internal/configparser"
"git.annabunches.net/annabunches/joyful/internal/logger"
"github.com/holoplot/go-evdev"
)
type RuleTargetModeSelect struct {
Modes []string
}
func NewRuleTargetModeSelectFromConfig(targetConfig configparser.RuleTargetConfigModeSelect, allModes []string) (*RuleTargetModeSelect, error) {
if ok := validateModes(targetConfig.Modes, allModes); !ok {
return nil, errors.New("undefined mode in mode select list")
}
return NewRuleTargetModeSelect(targetConfig.Modes)
}
func NewRuleTargetModeSelect(modes []string) (*RuleTargetModeSelect, error) {
if len(modes) == 0 {
return nil, errors.New("cannot create RuleTargetModeSelect: mode list is empty")
}
return &RuleTargetModeSelect{
Modes: modes,
}, nil
}
// RuleTargetModeSelect doesn't make sense as an input type
func (target *RuleTargetModeSelect) NormalizeValue(_ int32) int32 {
return -1
}
func (target *RuleTargetModeSelect) CreateEvent(_ int32, mode *string) *evdev.InputEvent {
index := 0
if currentMode := slices.Index(target.Modes, *mode); currentMode != -1 {
// find the next mode
index = (currentMode + 1) % len(target.Modes)
}
*mode = target.Modes[index]
logger.Logf("Mode changed to '%s'", *mode)
return nil
}
func (target *RuleTargetModeSelect) MatchEvent(_ *evdev.InputDevice, _ *evdev.InputEvent) bool {
return false
}