Move initialization code closer to the appropriate structs. (#17)
Reviewed-on: #17 Co-authored-by: Anna Rose Wiggins <annabunches@gmail.com> Co-committed-by: Anna Rose Wiggins <annabunches@gmail.com>
This commit is contained in:
parent
d9babf5dc0
commit
8d2b15a7c8
40 changed files with 1087 additions and 1109 deletions
|
@ -1,35 +0,0 @@
|
|||
// Functions for cleaning up stale virtual devices
|
||||
|
||||
package virtualdevice
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/holoplot/go-evdev"
|
||||
)
|
||||
|
||||
func CleanupStaleVirtualDevices() {
|
||||
devices, err := evdev.ListDevicePaths()
|
||||
if err != nil {
|
||||
fmt.Printf("Couldn't list devices while running cleanup: %s\n", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
for _, devicePath := range devices {
|
||||
if strings.HasPrefix(devicePath.Name, "joyful-joystick") {
|
||||
device, err := evdev.Open(devicePath.Path)
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to open existing joyful device at '%s': %s\n", devicePath.Path, err.Error())
|
||||
continue
|
||||
}
|
||||
|
||||
err = evdev.DestroyDevice(device)
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to destroy existing joyful device '%s' at '%s': %s\n", devicePath.Name, devicePath.Path, err.Error())
|
||||
} else {
|
||||
fmt.Printf("Destroyed stale joyful device '%s'\n", devicePath.Path)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -11,13 +11,7 @@ import (
|
|||
type EventBuffer struct {
|
||||
events []*evdev.InputEvent
|
||||
Device VirtualDevice
|
||||
}
|
||||
|
||||
func NewEventBuffer(device VirtualDevice) *EventBuffer {
|
||||
return &EventBuffer{
|
||||
events: make([]*evdev.InputEvent, 0, 100),
|
||||
Device: device,
|
||||
}
|
||||
Name string
|
||||
}
|
||||
|
||||
func (buffer *EventBuffer) AddEvent(event *evdev.InputEvent) {
|
||||
|
|
|
@ -11,10 +11,11 @@ import (
|
|||
|
||||
type EventBufferTests struct {
|
||||
suite.Suite
|
||||
device *VirtualDeviceMock
|
||||
writeOneCall *mock.Call
|
||||
device *VirtualDeviceMock
|
||||
buffer *EventBuffer
|
||||
}
|
||||
|
||||
// Mocks
|
||||
type VirtualDeviceMock struct {
|
||||
mock.Mock
|
||||
}
|
||||
|
@ -24,65 +25,65 @@ func (m *VirtualDeviceMock) WriteOne(event *evdev.InputEvent) error {
|
|||
return args.Error(0)
|
||||
}
|
||||
|
||||
// Setup
|
||||
func TestRunnerEventBufferTests(t *testing.T) {
|
||||
suite.Run(t, new(EventBufferTests))
|
||||
}
|
||||
|
||||
func (t *EventBufferTests) SetupTest() {
|
||||
t.device = new(VirtualDeviceMock)
|
||||
}
|
||||
|
||||
func (t *EventBufferTests) SetupSubTest() {
|
||||
t.device = new(VirtualDeviceMock)
|
||||
t.writeOneCall = t.device.On("WriteOne").Return(nil)
|
||||
}
|
||||
|
||||
func (t *EventBufferTests) TearDownSubTest() {
|
||||
t.writeOneCall.Unset()
|
||||
t.buffer = &EventBuffer{Device: t.device}
|
||||
}
|
||||
|
||||
// Tests
|
||||
func (t *EventBufferTests) TestNewEventBuffer() {
|
||||
buffer := NewEventBuffer(t.device)
|
||||
t.Equal(t.device, buffer.Device)
|
||||
t.Len(buffer.events, 0)
|
||||
t.Equal(t.device, t.buffer.Device)
|
||||
t.Len(t.buffer.events, 0)
|
||||
}
|
||||
|
||||
func (t *EventBufferTests) TestEventBufferAddEvent() {
|
||||
buffer := NewEventBuffer(t.device)
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.Len(buffer.events, 3)
|
||||
}
|
||||
|
||||
func (t *EventBufferTests) TestEventBufferSendEvents() {
|
||||
t.Run("3 Events", func() {
|
||||
buffer := NewEventBuffer(t.device)
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
errs := buffer.SendEvents()
|
||||
|
||||
t.Len(errs, 0)
|
||||
t.device.AssertNumberOfCalls(t.T(), "WriteOne", 4)
|
||||
})
|
||||
|
||||
t.Run("No Events", func() {
|
||||
buffer := NewEventBuffer(t.device)
|
||||
errs := buffer.SendEvents()
|
||||
|
||||
t.Len(errs, 0)
|
||||
t.device.AssertNumberOfCalls(t.T(), "WriteOne", 0)
|
||||
})
|
||||
|
||||
t.Run("Bad Event", func() {
|
||||
t.writeOneCall.Unset()
|
||||
t.writeOneCall = t.device.On("WriteOne").Return(errors.New("Fail"))
|
||||
|
||||
buffer := NewEventBuffer(t.device)
|
||||
buffer.AddEvent(&evdev.InputEvent{})
|
||||
errs := buffer.SendEvents()
|
||||
t.Len(errs, 2)
|
||||
})
|
||||
|
||||
func (t *EventBufferTests) TestEventBuffer() {
|
||||
|
||||
t.Run("AddEvent", func() {
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.Len(t.buffer.events, 3)
|
||||
})
|
||||
|
||||
t.Run("SendEvents", func() {
|
||||
t.Run("3 Events", func() {
|
||||
writeOneCall := t.device.On("WriteOne").Return(nil)
|
||||
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
errs := t.buffer.SendEvents()
|
||||
|
||||
t.Len(errs, 0)
|
||||
t.device.AssertNumberOfCalls(t.T(), "WriteOne", 4)
|
||||
|
||||
writeOneCall.Unset()
|
||||
})
|
||||
|
||||
t.Run("No Events", func() {
|
||||
writeOneCall := t.device.On("WriteOne").Return(nil)
|
||||
|
||||
errs := t.buffer.SendEvents()
|
||||
|
||||
t.Len(errs, 0)
|
||||
t.device.AssertNumberOfCalls(t.T(), "WriteOne", 0)
|
||||
|
||||
writeOneCall.Unset()
|
||||
})
|
||||
|
||||
t.Run("Bad Event", func() {
|
||||
writeOneCall := t.device.On("WriteOne").Return(errors.New("Fail"))
|
||||
|
||||
t.buffer.AddEvent(&evdev.InputEvent{})
|
||||
errs := t.buffer.SendEvents()
|
||||
t.Len(errs, 2)
|
||||
|
||||
writeOneCall.Unset()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
165
internal/virtualdevice/init.go
Normal file
165
internal/virtualdevice/init.go
Normal file
|
@ -0,0 +1,165 @@
|
|||
package virtualdevice
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"git.annabunches.net/annabunches/joyful/internal/configparser"
|
||||
"git.annabunches.net/annabunches/joyful/internal/eventcodes"
|
||||
"git.annabunches.net/annabunches/joyful/internal/logger"
|
||||
"github.com/holoplot/go-evdev"
|
||||
)
|
||||
|
||||
// NewEventBuffer takes a virtual device config specification, creates the underlying
|
||||
// evdev.InputDevice, and wraps it in a buffered event emitter.
|
||||
func NewEventBuffer(config configparser.DeviceConfigVirtual) (*EventBuffer, error) {
|
||||
deviceMap := make(map[string]*evdev.InputDevice)
|
||||
|
||||
name := fmt.Sprintf("joyful-%s", config.Name)
|
||||
|
||||
var capabilities map[evdev.EvType][]evdev.EvCode
|
||||
|
||||
// todo: add tests for presets
|
||||
switch config.Preset {
|
||||
case DevicePresetGamepad:
|
||||
capabilities = CapabilitiesPresetGamepad
|
||||
case DevicePresetKeyboard:
|
||||
capabilities = CapabilitiesPresetKeyboard
|
||||
case DevicePresetJoystick:
|
||||
capabilities = CapabilitiesPresetJoystick
|
||||
case DevicePresetMouse:
|
||||
capabilities = CapabilitiesPresetMouse
|
||||
default:
|
||||
capabilities = map[evdev.EvType][]evdev.EvCode{
|
||||
evdev.EV_KEY: makeButtons(config.NumButtons, config.Buttons),
|
||||
evdev.EV_ABS: makeAxes(config.NumAxes, config.Axes),
|
||||
evdev.EV_REL: makeRelativeAxes(config.NumRelativeAxes, config.RelativeAxes),
|
||||
}
|
||||
}
|
||||
|
||||
device, err := evdev.CreateDevice(
|
||||
name,
|
||||
// TODO: placeholders. Who knows what these should actually be...
|
||||
evdev.InputID{
|
||||
BusType: 0x03,
|
||||
Vendor: 0x4711,
|
||||
Product: 0x0816,
|
||||
Version: 1,
|
||||
},
|
||||
capabilities,
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
deviceMap[config.Name] = device
|
||||
logger.Log(fmt.Sprintf(
|
||||
"Created virtual device '%s' with %d buttons, %d axes, and %d relative axes",
|
||||
name,
|
||||
len(capabilities[evdev.EV_KEY]),
|
||||
len(capabilities[evdev.EV_ABS]),
|
||||
len(capabilities[evdev.EV_REL]),
|
||||
))
|
||||
|
||||
return &EventBuffer{
|
||||
events: make([]*evdev.InputEvent, 0, 100),
|
||||
Device: device,
|
||||
Name: config.Name,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// TODO: these functions have a lot of duplication; we need to figure out how to refactor it cleanly
|
||||
// without losing logging context...
|
||||
func makeButtons(numButtons int, buttonList []string) []evdev.EvCode {
|
||||
if numButtons > 0 && len(buttonList) > 0 {
|
||||
logger.Log("'num_buttons' and 'buttons' both specified, ignoring 'num_buttons'")
|
||||
}
|
||||
|
||||
if numButtons > VirtualDeviceMaxButtons {
|
||||
numButtons = VirtualDeviceMaxButtons
|
||||
logger.Logf("Limiting virtual device buttons to %d", VirtualDeviceMaxButtons)
|
||||
}
|
||||
|
||||
if len(buttonList) > 0 {
|
||||
buttons := make([]evdev.EvCode, 0, len(buttonList))
|
||||
for _, codeStr := range buttonList {
|
||||
code, err := eventcodes.ParseCode(codeStr, "BTN")
|
||||
if err != nil {
|
||||
logger.LogError(err, "Failed to create button, skipping")
|
||||
continue
|
||||
}
|
||||
buttons = append(buttons, code)
|
||||
}
|
||||
return buttons
|
||||
}
|
||||
|
||||
buttons := make([]evdev.EvCode, numButtons)
|
||||
|
||||
for i := 0; i < numButtons; i++ {
|
||||
buttons[i] = eventcodes.ButtonFromIndex[i]
|
||||
}
|
||||
|
||||
return buttons
|
||||
}
|
||||
|
||||
func makeAxes(numAxes int, axisList []string) []evdev.EvCode {
|
||||
if numAxes > 0 && len(axisList) > 0 {
|
||||
logger.Log("'num_axes' and 'axes' both specified, ignoring 'num_axes'")
|
||||
}
|
||||
|
||||
if len(axisList) > 0 {
|
||||
axes := make([]evdev.EvCode, 0, len(axisList))
|
||||
for _, codeStr := range axisList {
|
||||
code, err := eventcodes.ParseCode(codeStr, "ABS")
|
||||
if err != nil {
|
||||
logger.LogError(err, "Failed to create axis, skipping")
|
||||
continue
|
||||
}
|
||||
axes = append(axes, code)
|
||||
}
|
||||
return axes
|
||||
}
|
||||
|
||||
if numAxes > 8 {
|
||||
numAxes = 8
|
||||
logger.Log("Limiting virtual device axes to 8")
|
||||
}
|
||||
|
||||
axes := make([]evdev.EvCode, numAxes)
|
||||
for i := 0; i < numAxes; i++ {
|
||||
axes[i] = evdev.EvCode(i)
|
||||
}
|
||||
|
||||
return axes
|
||||
}
|
||||
|
||||
func makeRelativeAxes(numAxes int, axisList []string) []evdev.EvCode {
|
||||
if numAxes > 0 && len(axisList) > 0 {
|
||||
logger.Log("'num_rel_axes' and 'rel_axes' both specified, ignoring 'num_rel_axes'")
|
||||
}
|
||||
|
||||
if len(axisList) > 0 {
|
||||
axes := make([]evdev.EvCode, 0, len(axisList))
|
||||
for _, codeStr := range axisList {
|
||||
code, err := eventcodes.ParseCode(codeStr, "REL")
|
||||
if err != nil {
|
||||
logger.LogError(err, "Failed to create axis, skipping")
|
||||
continue
|
||||
}
|
||||
axes = append(axes, code)
|
||||
}
|
||||
return axes
|
||||
}
|
||||
|
||||
if numAxes > 10 {
|
||||
numAxes = 10
|
||||
logger.Log("Limiting virtual device relative axes to 10")
|
||||
}
|
||||
|
||||
axes := make([]evdev.EvCode, numAxes)
|
||||
for i := 0; i < numAxes; i++ {
|
||||
axes[i] = evdev.EvCode(i)
|
||||
}
|
||||
|
||||
return axes
|
||||
}
|
119
internal/virtualdevice/init_test.go
Normal file
119
internal/virtualdevice/init_test.go
Normal file
|
@ -0,0 +1,119 @@
|
|||
package virtualdevice
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/holoplot/go-evdev"
|
||||
"github.com/stretchr/testify/suite"
|
||||
)
|
||||
|
||||
type InitTests struct {
|
||||
suite.Suite
|
||||
}
|
||||
|
||||
func TestRunnerInit(t *testing.T) {
|
||||
suite.Run(t, new(InitTests))
|
||||
}
|
||||
|
||||
func (t *InitTests) TestMakeButtons() {
|
||||
t.Run("Maximum buttons", func() {
|
||||
buttons := makeButtons(VirtualDeviceMaxButtons, []string{})
|
||||
t.Equal(VirtualDeviceMaxButtons, len(buttons))
|
||||
})
|
||||
|
||||
t.Run("Truncated buttons", func() {
|
||||
buttons := makeButtons(VirtualDeviceMaxButtons+1, []string{})
|
||||
t.Equal(VirtualDeviceMaxButtons, len(buttons))
|
||||
})
|
||||
|
||||
t.Run("16 buttons", func() {
|
||||
buttons := makeButtons(16, []string{})
|
||||
t.Equal(16, len(buttons))
|
||||
t.Contains(buttons, evdev.EvCode(evdev.BTN_DEAD))
|
||||
t.NotContains(buttons, evdev.EvCode(evdev.BTN_TRIGGER_HAPPY))
|
||||
})
|
||||
|
||||
t.Run("Explicit buttons", func() {
|
||||
buttonConfig := []string{"BTN_THUMB", "top", "btn_top2", "0x2fe", "0x300", "15"}
|
||||
buttons := makeButtons(0, buttonConfig)
|
||||
t.Equal(len(buttonConfig), len(buttons))
|
||||
t.Contains(buttons, evdev.EvCode(0x2fe))
|
||||
t.Contains(buttons, evdev.EvCode(0x300))
|
||||
t.Contains(buttons, evdev.EvCode(evdev.BTN_TOP))
|
||||
t.Contains(buttons, evdev.EvCode(evdev.BTN_DEAD))
|
||||
})
|
||||
}
|
||||
|
||||
func (t *InitTests) TestMakeAxes() {
|
||||
t.Run("8 axes", func() {
|
||||
axes := makeAxes(8, []string{})
|
||||
t.Equal(8, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_Y))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_Z))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_RX))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_RY))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_RZ))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_THROTTLE))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_RUDDER))
|
||||
})
|
||||
|
||||
t.Run("9 axes is truncated", func() {
|
||||
axes := makeAxes(9, []string{})
|
||||
t.Equal(8, len(axes))
|
||||
})
|
||||
|
||||
t.Run("3 axes", func() {
|
||||
axes := makeAxes(3, []string{})
|
||||
t.Equal(3, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_Y))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_Z))
|
||||
})
|
||||
|
||||
t.Run("4 explicit axis", func() {
|
||||
axes := makeAxes(0, []string{"x", "y", "throttle", "rudder"})
|
||||
t.Equal(4, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_Y))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_THROTTLE))
|
||||
t.Contains(axes, evdev.EvCode(evdev.ABS_RUDDER))
|
||||
})
|
||||
}
|
||||
|
||||
func (t *InitTests) TestMakeRelativeAxes() {
|
||||
t.Run("10 axes", func() {
|
||||
axes := makeRelativeAxes(10, []string{})
|
||||
t.Equal(10, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_MISC))
|
||||
})
|
||||
|
||||
t.Run("11 axes", func() {
|
||||
axes := makeRelativeAxes(11, []string{})
|
||||
t.Equal(10, len(axes))
|
||||
})
|
||||
|
||||
t.Run("3 axes", func() {
|
||||
axes := makeRelativeAxes(3, []string{})
|
||||
t.Equal(3, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_Y))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_Z))
|
||||
})
|
||||
|
||||
t.Run("1 explicit axis", func() {
|
||||
axes := makeRelativeAxes(0, []string{"wheel"})
|
||||
t.Equal(1, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_WHEEL))
|
||||
})
|
||||
|
||||
t.Run("4 explicit axis", func() {
|
||||
axes := makeRelativeAxes(0, []string{"x", "y", "wheel", "hwheel"})
|
||||
t.Equal(4, len(axes))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_X))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_Y))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_WHEEL))
|
||||
t.Contains(axes, evdev.EvCode(evdev.REL_HWHEEL))
|
||||
})
|
||||
}
|
290
internal/virtualdevice/variables.go
Normal file
290
internal/virtualdevice/variables.go
Normal file
|
@ -0,0 +1,290 @@
|
|||
package virtualdevice
|
||||
|
||||
import "github.com/holoplot/go-evdev"
|
||||
|
||||
const (
|
||||
DevicePresetKeyboard = "keyboard"
|
||||
DevicePresetGamepad = "gamepad"
|
||||
DevicePresetJoystick = "joystick"
|
||||
DevicePresetMouse = "mouse"
|
||||
|
||||
VirtualDeviceMaxButtons = 74
|
||||
)
|
||||
|
||||
// Device Presets
|
||||
var (
|
||||
CapabilitiesPresetGamepad = map[evdev.EvType][]evdev.EvCode{
|
||||
evdev.EV_ABS: {
|
||||
evdev.ABS_X,
|
||||
evdev.ABS_Y,
|
||||
evdev.ABS_Z,
|
||||
evdev.ABS_RX,
|
||||
evdev.ABS_RY,
|
||||
evdev.ABS_RZ,
|
||||
evdev.ABS_HAT0X,
|
||||
evdev.ABS_HAT0Y,
|
||||
},
|
||||
evdev.EV_KEY: {
|
||||
evdev.BTN_NORTH, // Xbox 'X', Playstation 'Square'
|
||||
evdev.BTN_SOUTH, // Xbox 'A', Plastation 'X'
|
||||
evdev.BTN_WEST, // Xbox 'Y', Playstation 'Triangle'
|
||||
evdev.BTN_EAST, // Xbox 'B', Playstation 'O'
|
||||
evdev.BTN_THUMBL,
|
||||
evdev.BTN_THUMBR,
|
||||
evdev.BTN_TL,
|
||||
evdev.BTN_TR,
|
||||
evdev.BTN_SELECT,
|
||||
evdev.BTN_START,
|
||||
evdev.BTN_MODE,
|
||||
},
|
||||
}
|
||||
|
||||
CapabilitiesPresetJoystick = map[evdev.EvType][]evdev.EvCode{
|
||||
evdev.EV_ABS: {
|
||||
evdev.ABS_X,
|
||||
evdev.ABS_Y,
|
||||
evdev.ABS_Z,
|
||||
evdev.ABS_RX,
|
||||
evdev.ABS_RY,
|
||||
evdev.ABS_RZ,
|
||||
evdev.ABS_THROTTLE, // Also called "Slider" or "Slider1"
|
||||
evdev.ABS_RUDDER, // Also called "Dial", "Slider2", or "RSlider"
|
||||
},
|
||||
evdev.EV_KEY: {
|
||||
evdev.BTN_TRIGGER,
|
||||
evdev.BTN_THUMB,
|
||||
evdev.BTN_THUMB2,
|
||||
evdev.BTN_TOP,
|
||||
evdev.BTN_TOP2,
|
||||
evdev.BTN_PINKIE,
|
||||
evdev.BTN_BASE,
|
||||
evdev.BTN_BASE2,
|
||||
evdev.BTN_BASE3,
|
||||
evdev.BTN_BASE4,
|
||||
evdev.BTN_BASE5,
|
||||
evdev.BTN_BASE6,
|
||||
evdev.EvCode(0x12c), // decimal 300
|
||||
evdev.EvCode(0x12d), // decimal 301
|
||||
evdev.EvCode(0x12e), // decimal 302
|
||||
evdev.BTN_DEAD,
|
||||
evdev.BTN_TRIGGER_HAPPY1,
|
||||
evdev.BTN_TRIGGER_HAPPY2,
|
||||
evdev.BTN_TRIGGER_HAPPY3,
|
||||
evdev.BTN_TRIGGER_HAPPY4,
|
||||
evdev.BTN_TRIGGER_HAPPY5,
|
||||
evdev.BTN_TRIGGER_HAPPY6,
|
||||
evdev.BTN_TRIGGER_HAPPY7,
|
||||
evdev.BTN_TRIGGER_HAPPY8,
|
||||
evdev.BTN_TRIGGER_HAPPY9,
|
||||
evdev.BTN_TRIGGER_HAPPY10,
|
||||
evdev.BTN_TRIGGER_HAPPY11,
|
||||
evdev.BTN_TRIGGER_HAPPY12,
|
||||
evdev.BTN_TRIGGER_HAPPY13,
|
||||
evdev.BTN_TRIGGER_HAPPY14,
|
||||
evdev.BTN_TRIGGER_HAPPY15,
|
||||
evdev.BTN_TRIGGER_HAPPY16,
|
||||
evdev.BTN_TRIGGER_HAPPY17,
|
||||
evdev.BTN_TRIGGER_HAPPY18,
|
||||
evdev.BTN_TRIGGER_HAPPY19,
|
||||
evdev.BTN_TRIGGER_HAPPY20,
|
||||
evdev.BTN_TRIGGER_HAPPY21,
|
||||
evdev.BTN_TRIGGER_HAPPY22,
|
||||
evdev.BTN_TRIGGER_HAPPY23,
|
||||
evdev.BTN_TRIGGER_HAPPY24,
|
||||
evdev.BTN_TRIGGER_HAPPY25,
|
||||
evdev.BTN_TRIGGER_HAPPY26,
|
||||
evdev.BTN_TRIGGER_HAPPY27,
|
||||
evdev.BTN_TRIGGER_HAPPY28,
|
||||
evdev.BTN_TRIGGER_HAPPY29,
|
||||
evdev.BTN_TRIGGER_HAPPY30,
|
||||
evdev.BTN_TRIGGER_HAPPY31,
|
||||
evdev.BTN_TRIGGER_HAPPY32,
|
||||
evdev.BTN_TRIGGER_HAPPY33,
|
||||
evdev.BTN_TRIGGER_HAPPY34,
|
||||
evdev.BTN_TRIGGER_HAPPY35,
|
||||
evdev.BTN_TRIGGER_HAPPY36,
|
||||
evdev.BTN_TRIGGER_HAPPY37,
|
||||
evdev.BTN_TRIGGER_HAPPY38,
|
||||
evdev.BTN_TRIGGER_HAPPY39,
|
||||
evdev.BTN_TRIGGER_HAPPY40,
|
||||
evdev.EvCode(0x2e8),
|
||||
evdev.EvCode(0x2e9),
|
||||
evdev.EvCode(0x2f0),
|
||||
evdev.EvCode(0x2f1),
|
||||
evdev.EvCode(0x2f2),
|
||||
evdev.EvCode(0x2f3),
|
||||
evdev.EvCode(0x2f4),
|
||||
evdev.EvCode(0x2f5),
|
||||
evdev.EvCode(0x2f6),
|
||||
evdev.EvCode(0x2f7),
|
||||
evdev.EvCode(0x2f8),
|
||||
evdev.EvCode(0x2f9),
|
||||
evdev.EvCode(0x2fa),
|
||||
evdev.EvCode(0x2fb),
|
||||
evdev.EvCode(0x2fc),
|
||||
evdev.EvCode(0x2fd),
|
||||
evdev.EvCode(0x2fe),
|
||||
evdev.EvCode(0x2ff),
|
||||
},
|
||||
}
|
||||
|
||||
CapabilitiesPresetKeyboard = map[evdev.EvType][]evdev.EvCode{
|
||||
evdev.EV_KEY: {
|
||||
evdev.KEY_ESC,
|
||||
evdev.KEY_1,
|
||||
evdev.KEY_2,
|
||||
evdev.KEY_3,
|
||||
evdev.KEY_4,
|
||||
evdev.KEY_5,
|
||||
evdev.KEY_6,
|
||||
evdev.KEY_7,
|
||||
evdev.KEY_8,
|
||||
evdev.KEY_9,
|
||||
evdev.KEY_0,
|
||||
evdev.KEY_MINUS,
|
||||
evdev.KEY_EQUAL,
|
||||
evdev.KEY_BACKSPACE,
|
||||
evdev.KEY_TAB,
|
||||
evdev.KEY_Q,
|
||||
evdev.KEY_W,
|
||||
evdev.KEY_E,
|
||||
evdev.KEY_R,
|
||||
evdev.KEY_T,
|
||||
evdev.KEY_Y,
|
||||
evdev.KEY_U,
|
||||
evdev.KEY_I,
|
||||
evdev.KEY_O,
|
||||
evdev.KEY_P,
|
||||
evdev.KEY_LEFTBRACE,
|
||||
evdev.KEY_RIGHTBRACE,
|
||||
evdev.KEY_ENTER,
|
||||
evdev.KEY_LEFTCTRL,
|
||||
evdev.KEY_A,
|
||||
evdev.KEY_S,
|
||||
evdev.KEY_D,
|
||||
evdev.KEY_F,
|
||||
evdev.KEY_G,
|
||||
evdev.KEY_H,
|
||||
evdev.KEY_J,
|
||||
evdev.KEY_K,
|
||||
evdev.KEY_L,
|
||||
evdev.KEY_SEMICOLON,
|
||||
evdev.KEY_APOSTROPHE,
|
||||
evdev.KEY_GRAVE,
|
||||
evdev.KEY_LEFTSHIFT,
|
||||
evdev.KEY_BACKSLASH,
|
||||
evdev.KEY_Z,
|
||||
evdev.KEY_X,
|
||||
evdev.KEY_C,
|
||||
evdev.KEY_V,
|
||||
evdev.KEY_B,
|
||||
evdev.KEY_N,
|
||||
evdev.KEY_M,
|
||||
evdev.KEY_COMMA,
|
||||
evdev.KEY_DOT,
|
||||
evdev.KEY_SLASH,
|
||||
evdev.KEY_RIGHTSHIFT,
|
||||
evdev.KEY_KPASTERISK,
|
||||
evdev.KEY_LEFTALT,
|
||||
evdev.KEY_SPACE,
|
||||
evdev.KEY_CAPSLOCK,
|
||||
evdev.KEY_F1,
|
||||
evdev.KEY_F2,
|
||||
evdev.KEY_F3,
|
||||
evdev.KEY_F4,
|
||||
evdev.KEY_F5,
|
||||
evdev.KEY_F6,
|
||||
evdev.KEY_F7,
|
||||
evdev.KEY_F8,
|
||||
evdev.KEY_F9,
|
||||
evdev.KEY_F10,
|
||||
evdev.KEY_NUMLOCK,
|
||||
evdev.KEY_SCROLLLOCK,
|
||||
evdev.KEY_KP7,
|
||||
evdev.KEY_KP8,
|
||||
evdev.KEY_KP9,
|
||||
evdev.KEY_KPMINUS,
|
||||
evdev.KEY_KP4,
|
||||
evdev.KEY_KP5,
|
||||
evdev.KEY_KP6,
|
||||
evdev.KEY_KPPLUS,
|
||||
evdev.KEY_KP1,
|
||||
evdev.KEY_KP2,
|
||||
evdev.KEY_KP3,
|
||||
evdev.KEY_KP0,
|
||||
evdev.KEY_KPDOT,
|
||||
evdev.KEY_ZENKAKUHANKAKU,
|
||||
evdev.KEY_102ND,
|
||||
evdev.KEY_F11,
|
||||
evdev.KEY_F12,
|
||||
evdev.KEY_RO,
|
||||
evdev.KEY_KATAKANA,
|
||||
evdev.KEY_HIRAGANA,
|
||||
evdev.KEY_HENKAN,
|
||||
evdev.KEY_KATAKANAHIRAGANA,
|
||||
evdev.KEY_MUHENKAN,
|
||||
evdev.KEY_KPJPCOMMA,
|
||||
evdev.KEY_KPENTER,
|
||||
evdev.KEY_RIGHTCTRL,
|
||||
evdev.KEY_KPSLASH,
|
||||
evdev.KEY_SYSRQ,
|
||||
evdev.KEY_RIGHTALT,
|
||||
evdev.KEY_LINEFEED,
|
||||
evdev.KEY_HOME,
|
||||
evdev.KEY_UP,
|
||||
evdev.KEY_PAGEUP,
|
||||
evdev.KEY_LEFT,
|
||||
evdev.KEY_RIGHT,
|
||||
evdev.KEY_END,
|
||||
evdev.KEY_DOWN,
|
||||
evdev.KEY_PAGEDOWN,
|
||||
evdev.KEY_INSERT,
|
||||
evdev.KEY_DELETE,
|
||||
evdev.KEY_MACRO,
|
||||
evdev.KEY_MUTE,
|
||||
evdev.KEY_VOLUMEDOWN,
|
||||
evdev.KEY_VOLUMEUP,
|
||||
evdev.KEY_KPEQUAL,
|
||||
evdev.KEY_KPPLUSMINUS,
|
||||
evdev.KEY_PAUSE,
|
||||
evdev.KEY_SCALE,
|
||||
evdev.KEY_KPCOMMA,
|
||||
evdev.KEY_HANGEUL,
|
||||
evdev.KEY_HANJA,
|
||||
evdev.KEY_YEN,
|
||||
evdev.KEY_LEFTMETA,
|
||||
evdev.KEY_RIGHTMETA,
|
||||
evdev.KEY_COMPOSE,
|
||||
evdev.KEY_F13,
|
||||
evdev.KEY_F14,
|
||||
evdev.KEY_F15,
|
||||
evdev.KEY_F16,
|
||||
evdev.KEY_F17,
|
||||
evdev.KEY_F18,
|
||||
evdev.KEY_F19,
|
||||
evdev.KEY_F20,
|
||||
evdev.KEY_F21,
|
||||
evdev.KEY_F22,
|
||||
evdev.KEY_F23,
|
||||
evdev.KEY_F24,
|
||||
},
|
||||
}
|
||||
|
||||
CapabilitiesPresetMouse = map[evdev.EvType][]evdev.EvCode{
|
||||
evdev.EV_REL: {
|
||||
evdev.REL_X,
|
||||
evdev.REL_Y,
|
||||
evdev.REL_WHEEL,
|
||||
evdev.REL_HWHEEL,
|
||||
},
|
||||
evdev.EV_KEY: {
|
||||
evdev.BTN_LEFT,
|
||||
evdev.BTN_MIDDLE,
|
||||
evdev.BTN_RIGHT,
|
||||
evdev.BTN_SIDE,
|
||||
evdev.BTN_EXTRA,
|
||||
evdev.BTN_FORWARD,
|
||||
evdev.BTN_BACK,
|
||||
},
|
||||
}
|
||||
)
|
Loading…
Add table
Add a link
Reference in a new issue