diff --git a/cmd/joyful/main.go b/cmd/joyful/main.go index 408fecd..271f922 100644 --- a/cmd/joyful/main.go +++ b/cmd/joyful/main.go @@ -2,9 +2,9 @@ package main import ( "fmt" - "os" "time" + "git.annabunches.net/annabunches/joyful/internal/logger" "git.annabunches.net/annabunches/joyful/internal/virtualdevice" "github.com/holoplot/go-evdev" ) @@ -38,7 +38,7 @@ func main() { }, }, ) - fatalIfError(err, "Failed to create virtual device") + logger.FatalIfError(err, "Failed to create virtual device") buffer := virtualdevice.NewEventBuffer(vDevice) @@ -49,7 +49,7 @@ func main() { fmt.Printf("Virtual device created as %s.\n", name) pDevice, err := evdev.Open("/dev/input/event12") - fatalIfError(err, "Couldn't open physical device") + logger.FatalIfError(err, "Couldn't open physical device") name, err = pDevice.Name() if err != nil { @@ -63,7 +63,7 @@ func main() { last := combo event, err := pDevice.ReadOne() - logIfError(err, "Error while reading event") + logger.LogIfError(err, "Error while reading event") // FIXME: test code for event.Code != evdev.SYN_REPORT { @@ -103,7 +103,7 @@ func main() { } event, err = pDevice.ReadOne() - logIfError(err, "Error while reading event") + logger.LogIfError(err, "Error while reading event") } if combo > last && combo == 3 { @@ -144,20 +144,3 @@ func jsButtons() []evdev.EvCode { return buttons } - -func logIfError(err error, msg string) { - if err == nil { - return - } - - fmt.Printf("%s: %s\n", msg, err.Error()) -} - -func fatalIfError(err error, msg string) { - if err == nil { - return - } - - logIfError(err, msg) - os.Exit(1) -} diff --git a/internal/logger/logger.go b/internal/logger/logger.go new file mode 100644 index 0000000..5b16c7b --- /dev/null +++ b/internal/logger/logger.go @@ -0,0 +1,27 @@ +package logger + +import ( + "fmt" + "os" +) + +func Log(msg string) { + fmt.Println(msg) +} + +func LogIfError(err error, msg string) { + if err == nil { + return + } + + fmt.Printf("%s: %s\n", msg, err.Error()) +} + +func FatalIfError(err error, msg string) { + if err == nil { + return + } + + LogIfError(err, msg) + os.Exit(1) +} diff --git a/internal/rules/keymapping.go b/internal/rules/keymapping.go new file mode 100644 index 0000000..a69b2fa --- /dev/null +++ b/internal/rules/keymapping.go @@ -0,0 +1,50 @@ +package rules + +import ( + "git.annabunches.net/annabunches/joyful/internal/logger" + "github.com/holoplot/go-evdev" +) + +type KeyMappingRule interface { + MatchEvent(*evdev.InputDevice, *evdev.InputEvent) +} + +type SimpleMappingRule struct { + Input RuleTarget + Output RuleTarget +} + +type ComboMappingRule struct { + Input []RuleTarget + Output RuleTarget +} + +func (rule *SimpleMappingRule) MatchEvent(device *evdev.InputDevice, event *evdev.InputEvent) *evdev.InputEvent { + if event.Type != evdev.EV_KEY || + device != rule.Input.Device || + event.Code != rule.Input.Code { + return nil + } + + // how we process inverted rules depends on the event type + value := event.Value + if rule.Input.Inverted { + switch rule.Input.Type { + case evdev.EV_KEY: + if value == 0 { + value = 1 + } else { + value = 0 + } + default: + logger.Log("Tried to handle inverted rule for unknown event type. Skipping rule.") + return nil + } + } + + return &evdev.InputEvent{ + Type: rule.Output.Type, + Code: rule.Output.Code, + Value: value, + } +} diff --git a/internal/rules/types.go b/internal/rules/types.go new file mode 100644 index 0000000..a72643e --- /dev/null +++ b/internal/rules/types.go @@ -0,0 +1,10 @@ +package rules + +import "github.com/holoplot/go-evdev" + +type RuleTarget struct { + Device *evdev.InputDevice + Type evdev.EvType + Code evdev.EvCode + Inverted bool +}