├── .gitignore ├── LICENSE ├── Makefile ├── README.rst ├── _ioctl.go ├── bin ├── evtest.go └── genecodes.py ├── cdefs.go ├── device.go ├── doc.go ├── ecodes.go ├── ecodes.go.template ├── evdev_test.go ├── events.go └── example_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | *.a 2 | *.6 3 | *.out 4 | *.py[co] 5 | getioctl 6 | _obj 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Georgi Valkov. All rights reserved. 2 | 3 | Redistribution and use in source and binary forms, with or without 4 | modification, are permitted provided that the following conditions are 5 | met: 6 | 7 | 1. Redistributions of source code must retain the above copyright 8 | notice, this list of conditions and the following disclaimer. 9 | 10 | 2. Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in 12 | the documentation and/or other materials provided with the 13 | distribution. 14 | 15 | 3. Neither the name of author nor the names of its contributors may 16 | be used to endorse or promote products derived from this software 17 | without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL GEORGI VALKOV BE LIABLE FOR ANY 23 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: ecodes.go 2 | 3 | HEADERS = /usr/include/linux/input.h 4 | HEADERS += /usr/include/linux/input-event-codes.h 5 | 6 | ecodes.go: ecodes.go.template 7 | ./bin/genecodes.py $(HEADERS) $< > $@ 8 | 9 | .PHONY: ecodes.go 10 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | *golang-evdev* 2 | -------------- 3 | 4 | **Maintainer needed** 5 | 6 | This project hasn't been maintained for some time. If anyone is interested in 7 | taking over please let me know. If a more up-to-date fork exists, I prefer 8 | archiving this repository and leaving a link to the new one. 9 | 10 | ------ 11 | 12 | 13 | This package provides Go language bindings to the generic input event 14 | interface in Linux. The *evdev* interface serves the purpose of 15 | passing events generated in the kernel directly to userspace through 16 | character devices that are typically located in `/dev/input/`. 17 | 18 | Documentation: 19 | http://godoc.org/github.com/gvalkov/golang-evdev 20 | 21 | Development: 22 | https://github.com/gvalkov/golang-evdev 23 | -------------------------------------------------------------------------------- /_ioctl.go: -------------------------------------------------------------------------------- 1 | package evdev 2 | 3 | // Bits and pieces from asm-generic/ioctl.h 4 | import ( 5 | "syscall" 6 | "unsafe" 7 | ) 8 | 9 | const ( 10 | _IOC_NONE = 0x0 11 | _IOC_WRITE = 0x1 12 | _IOC_READ = 0x2 13 | 14 | _IOC_NRBITS = 8 15 | _IOC_TYPEBITS = 8 16 | _IOC_SIZEBITS = 14 17 | _IOC_DIRBITS = 2 18 | _IOC_NRSHIFT = 0 19 | 20 | _IOC_TYPESHIFT = _IOC_NRSHIFT + _IOC_NRBITS 21 | _IOC_SIZESHIFT = _IOC_TYPESHIFT + _IOC_TYPEBITS 22 | _IOC_DIRSHIFT = _IOC_SIZESHIFT + _IOC_SIZEBITS 23 | ) 24 | 25 | func _IOC(dir int, t int, nr int, size int) int { 26 | return (dir << _IOC_DIRSHIFT) | (t << _IOC_TYPESHIFT) | 27 | (nr << _IOC_NRSHIFT) | (size << _IOC_SIZESHIFT) 28 | } 29 | 30 | func _IOR(t int, nr int, size int) int { 31 | return _IOC(_IOC_READ, t, nr, size) 32 | } 33 | 34 | func ioctl(fd uintptr, name int, data unsafe.Pointer) syscall.Errno { 35 | _, _, err := syscall.RawSyscall(syscall.SYS_IOCTL, fd, uintptr(name), uintptr(data)) 36 | return err 37 | } 38 | 39 | // input.h ioctls 40 | var _EVIOCGID = _IOR('E', 0x02, SizeofInputId) // 8 <- sizeof(struct input_id) 41 | var _EVIOCGNAME = _IOC(_IOC_READ, 'E', 0x06, _MAX_NAME_SIZE) 42 | var _EVIOCGPHYS = _IOC(_IOC_READ, 'E', 0x07, _MAX_NAME_SIZE) 43 | 44 | func _EVIOCGABS(ev int) int { 45 | return _IOR('E', 0x40+ev, 24) // 24 <= sizeof(struct input_absinfo) 46 | } 47 | 48 | func _EVIOCGBIT(ev, len int) int { 49 | return _IOC(_IOC_READ, 'E', 0x20+ev, len) 50 | } 51 | -------------------------------------------------------------------------------- /bin/evtest.go: -------------------------------------------------------------------------------- 1 | // +build linux 2 | // Input device event monitor. 3 | package main 4 | 5 | import ( 6 | "errors" 7 | "fmt" 8 | "os" 9 | "strings" 10 | 11 | evdev "github.com/gvalkov/golang-evdev" 12 | ) 13 | 14 | const ( 15 | usage = "usage: evtest [ ]" 16 | device_glob = "/dev/input/event*" 17 | ) 18 | 19 | // Select a device from a list of accessible input devices. 20 | func select_device() (*evdev.InputDevice, error) { 21 | devices, _ := evdev.ListInputDevices(device_glob) 22 | 23 | lines := make([]string, 0) 24 | max := 0 25 | if len(devices) > 0 { 26 | for i := range devices { 27 | dev := devices[i] 28 | str := fmt.Sprintf("%-3d %-20s %-35s %s", i, dev.Fn, dev.Name, dev.Phys) 29 | if len(str) > max { 30 | max = len(str) 31 | } 32 | lines = append(lines, str) 33 | } 34 | fmt.Printf("%-3s %-20s %-35s %s\n", "ID", "Device", "Name", "Phys") 35 | fmt.Printf(strings.Repeat("-", max) + "\n") 36 | fmt.Printf(strings.Join(lines, "\n") + "\n") 37 | 38 | var choice int 39 | choice_max := len(lines) - 1 40 | 41 | ReadChoice: 42 | fmt.Printf("Select device [0-%d]: ", choice_max) 43 | _, err := fmt.Scan(&choice) 44 | if err != nil || choice > choice_max || choice < 0 { 45 | goto ReadChoice 46 | } 47 | 48 | return devices[choice], nil 49 | } 50 | 51 | errmsg := fmt.Sprintf("no accessible input devices found by %s", device_glob) 52 | return nil, errors.New(errmsg) 53 | } 54 | 55 | func format_event(ev *evdev.InputEvent) string { 56 | var res, f, code_name string 57 | 58 | code := int(ev.Code) 59 | etype := int(ev.Type) 60 | 61 | switch ev.Type { 62 | case evdev.EV_SYN: 63 | if ev.Code == evdev.SYN_MT_REPORT { 64 | f = "time %d.%-8d +++++++++ %s ++++++++" 65 | } else { 66 | f = "time %d.%-8d --------- %s --------" 67 | } 68 | return fmt.Sprintf(f, ev.Time.Sec, ev.Time.Usec, evdev.SYN[code]) 69 | case evdev.EV_KEY: 70 | val, haskey := evdev.KEY[code] 71 | if haskey { 72 | code_name = val 73 | } else { 74 | val, haskey := evdev.BTN[code] 75 | if haskey { 76 | code_name = val 77 | } else { 78 | code_name = "?" 79 | } 80 | } 81 | default: 82 | m, haskey := evdev.ByEventType[etype] 83 | if haskey { 84 | code_name = m[code] 85 | } else { 86 | code_name = "?" 87 | } 88 | } 89 | 90 | evfmt := "time %d.%-8d type %d (%s), code %-3d (%s), value %d" 91 | res = fmt.Sprintf(evfmt, ev.Time.Sec, ev.Time.Usec, etype, 92 | evdev.EV[int(ev.Type)], ev.Code, code_name, ev.Value) 93 | 94 | return res 95 | } 96 | 97 | func main() { 98 | var dev *evdev.InputDevice 99 | var events []evdev.InputEvent 100 | var err error 101 | 102 | switch len(os.Args) { 103 | case 1: 104 | dev, err = select_device() 105 | if err != nil { 106 | fmt.Println(err) 107 | os.Exit(1) 108 | } 109 | case 2: 110 | dev, err = evdev.Open(os.Args[1]) 111 | if err != nil { 112 | fmt.Printf("unable to open input device: %s\n", os.Args[1]) 113 | os.Exit(1) 114 | } 115 | default: 116 | fmt.Printf(usage + "\n") 117 | os.Exit(1) 118 | } 119 | 120 | info := fmt.Sprintf("bus 0x%04x, vendor 0x%04x, product 0x%04x, version 0x%04x", 121 | dev.Bustype, dev.Vendor, dev.Product, dev.Version) 122 | 123 | repeat_info := dev.GetRepeatRate() 124 | 125 | fmt.Printf("Evdev protocol version: %d\n", dev.EvdevVersion) 126 | fmt.Printf("Device name: %s\n", dev.Name) 127 | fmt.Printf("Device info: %s\n", info) 128 | fmt.Printf("Repeat settings: repeat %d. delay %d\n", repeat_info[0], repeat_info[1]) 129 | fmt.Printf("Device capabilities:\n") 130 | 131 | // for ctype, codes := range dev.Capabilities { 132 | // fmt.Printf(" Type %s %d\n", ctype.Name, ctype.Type) 133 | // for i := range codes { 134 | // fmt.Printf(" Code %d %s\n", codes[i].Code, codes[i].Name) 135 | // } 136 | // } 137 | 138 | fmt.Printf("Listening for events ...\n") 139 | 140 | for { 141 | events, err = dev.Read() 142 | if err != nil { 143 | fmt.Println(err) 144 | os.Exit(1) 145 | } 146 | for i := range events { 147 | str := format_event(&events[i]) 148 | fmt.Println(str) 149 | } 150 | } 151 | } 152 | 153 | // print('Device capabilities:') 154 | // for type, codes in device.capabilities(verbose=True).items(): 155 | // print(' Type {} {}:'.format(*type)) 156 | // for i in codes: 157 | // if isinstance(i[1], AbsInfo): 158 | // print(' Code {:<4} {}:'.format(*i[0])) 159 | // print(' {}'.format(i[1])) 160 | // else: 161 | // print(' Code {:<4} {}'.format(*i)) 162 | // print('') 163 | // 164 | // 165 | -------------------------------------------------------------------------------- /bin/genecodes.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8; -*- 3 | 4 | ''' 5 | Generate a go source file that exports macros from evdev header files. 6 | ''' 7 | 8 | from __future__ import print_function 9 | 10 | import os, sys, re 11 | import string 12 | 13 | 14 | # The default header file locations to try. 15 | SOURCES = [ 16 | '/usr/include/linux/input.h', 17 | '/usr/include/linux/input-event-codes.h', 18 | ] 19 | 20 | if sys.argv[1:]: 21 | SOURCES = sys.argv[1:] 22 | 23 | # The golang template file in which we inject the macros. 24 | template_path = os.path.join(os.path.dirname(__file__), '../ecodes.go.template') 25 | TEMPLATE = string.Template(open(template_path).read()) 26 | 27 | 28 | #----------------------------------------------------------------------------- 29 | MACRO_REGEX = r'#define +((?:KEY|ABS|REL|SW|MSC|LED|BTN|REP|SND|ID|EV|BUS|SYN|FF)_\w+)\s+(\w+)' 30 | MACRO_REGEX = re.compile(MACRO_REGEX) 31 | 32 | def get_uname(): 33 | uname = list(os.uname()) 34 | del uname[1] 35 | return ' '.join(uname) 36 | 37 | def parse_header(fh): 38 | for line in fh: 39 | macro = MACRO_REGEX.search(line) 40 | if macro: 41 | yield macro.groups() 42 | 43 | def get_ecodes(headers): 44 | all_macros = [] 45 | for header in headers: 46 | try: 47 | fh = open(header) 48 | except (IOError, OSError): 49 | continue 50 | all_macros += parse_header(fh) 51 | 52 | if not all_macros: 53 | sys.exit('no input macros found in: %s' % ' '.join(SOURCES)) 54 | return all_macros 55 | 56 | ECODES = get_ecodes(SOURCES) 57 | 58 | context = { 59 | 'UNAME': get_uname(), 60 | 'CODES': os.linesep.join('\t%s = %s' % i for i in ECODES), 61 | 'CODEMAP': os.linesep.join('\t"%s": %s,' % (i, i) for i, _ in ECODES), 62 | } 63 | 64 | print(TEMPLATE.safe_substitute(context)) 65 | -------------------------------------------------------------------------------- /cdefs.go: -------------------------------------------------------------------------------- 1 | package evdev 2 | 3 | /* 4 | #include 5 | static int _EVIOCGNAME(int len) {return EVIOCGNAME(len);} 6 | static int _EVIOCGPHYS(int len) {return EVIOCGPHYS(len);} 7 | static int _EVIOCGUNIQ(int len) {return EVIOCGUNIQ(len);} 8 | static int _EVIOCGPROP(int len) {return EVIOCGPROP(len);} 9 | 10 | static int _EVIOCGKEY(int len) {return EVIOCGKEY(len);} 11 | static int _EVIOCGLED(int len) {return EVIOCGLED(len);} 12 | static int _EVIOCGSND(int len) {return EVIOCGSND(len);} 13 | static int _EVIOCGSW(int len) {return EVIOCGSW(len);} 14 | 15 | static int _EVIOCGBIT(int ev, int len) {return EVIOCGBIT(ev, len);} 16 | static int _EVIOCGABS(int abs) {return EVIOCGABS(abs);} 17 | static int _EVIOCSABS(int abs) {return EVIOCSABS(abs);} 18 | */ 19 | import "C" 20 | import "syscall" 21 | import "unsafe" 22 | 23 | type _InputEvent C.struct_input_event 24 | type _InputAbsinfo C.struct_input_absinfo 25 | type _InputId C.struct_input_id 26 | type _InputKeymapEntry C.struct_input_keymap_entry 27 | 28 | const ( 29 | sizeofInputAbsinfo = C.sizeof_struct_input_absinfo 30 | sizeofInputId = C.sizeof_struct_input_id 31 | sizeofInputKeymapEntry = C.sizeof_struct_input_keymap_entry 32 | ) 33 | 34 | const MAX_NAME_SIZE = 256 35 | 36 | const ( 37 | EVIOCGID = C.EVIOCGID // get device ID 38 | EVIOCGVERSION = C.EVIOCGVERSION // get driver version 39 | EVIOCGREP = C.EVIOCGREP // get repeat settings 40 | EVIOCSREP = C.EVIOCSREP // set repeat settings 41 | 42 | EVIOCGKEYCODE = C.EVIOCGKEYCODE // get keycode 43 | EVIOCGKEYCODE_V2 = C.EVIOCGKEYCODE_V2 // get keycode 44 | 45 | EVIOCSKEYCODE = C.EVIOCSKEYCODE // set keycode 46 | EVIOCSKEYCODE_V2 = C.EVIOCSKEYCODE_V2 // set keycode 47 | 48 | EVIOCSFF = C.EVIOCSFF // send a force effect to a force feedback device 49 | EVIOCRMFF = C.EVIOCRMFF // erase a force effect 50 | EVIOCGEFFECTS = C.EVIOCGEFFECTS // report number of effects playable at the same time 51 | 52 | EVIOCGRAB = C.EVIOCGRAB // grab/release device 53 | EVIOCSCLOCKID = C.EVIOCSCLOCKID // set clockid to be used for timestamps 54 | ) 55 | 56 | var EVIOCGNAME = C._EVIOCGNAME(MAX_NAME_SIZE) // get device name 57 | var EVIOCGPHYS = C._EVIOCGPHYS(MAX_NAME_SIZE) // get physical location 58 | var EVIOCGUNIQ = C._EVIOCGUNIQ(MAX_NAME_SIZE) // get unique identifier 59 | var EVIOCGPROP = C._EVIOCGPROP(MAX_NAME_SIZE) // get device properties 60 | 61 | var EVIOCGKEY = C._EVIOCGKEY(MAX_NAME_SIZE) // get global key state 62 | var EVIOCGLED = C._EVIOCGLED(MAX_NAME_SIZE) // get all LEDs 63 | var EVIOCGSND = C._EVIOCGSND(MAX_NAME_SIZE) // get all sounds status 64 | var EVIOCGSW = C._EVIOCGSW(MAX_NAME_SIZE) // get all switch states 65 | 66 | func EVIOCGBIT(ev, l int) int { return int(C._EVIOCGBIT(C.int(ev), C.int(l))) } // get event bits 67 | func EVIOCGABS(abs int) int { return int(C._EVIOCGABS(C.int(abs))) } // get abs bits 68 | func EVIOCSABS(abs int) int { return int(C._EVIOCSABS(C.int(abs))) } // set abs bits 69 | 70 | func ioctl(fd uintptr, name uintptr, data unsafe.Pointer) syscall.Errno { 71 | _, _, err := syscall.RawSyscall(syscall.SYS_IOCTL, fd, name, uintptr(data)) 72 | return err 73 | } 74 | -------------------------------------------------------------------------------- /device.go: -------------------------------------------------------------------------------- 1 | // +build linux 2 | 3 | package evdev 4 | 5 | import ( 6 | "bytes" 7 | "encoding/binary" 8 | "fmt" 9 | "os" 10 | "path/filepath" 11 | "strings" 12 | "syscall" 13 | "unsafe" 14 | ) 15 | 16 | // A Linux input device from which events can be read. 17 | type InputDevice struct { 18 | Fn string // path to input device (devnode) 19 | 20 | Name string // device name 21 | Phys string // physical topology of device 22 | File *os.File // an open file handle to the input device 23 | 24 | Bustype uint16 // bus type identifier 25 | Vendor uint16 // vendor identifier 26 | Product uint16 // product identifier 27 | Version uint16 // version identifier 28 | 29 | EvdevVersion int // evdev protocol version 30 | 31 | Capabilities map[CapabilityType][]CapabilityCode // supported event types and codes. 32 | CapabilitiesFlat map[int][]int 33 | } 34 | 35 | // Open an evdev input device. 36 | func Open(devnode string) (*InputDevice, error) { 37 | f, err := os.Open(devnode) 38 | if err != nil { 39 | return nil, err 40 | } 41 | 42 | dev := InputDevice{} 43 | dev.Fn = devnode 44 | dev.File = f 45 | 46 | err = dev.set_device_info() 47 | if err != nil { 48 | return nil, err 49 | } 50 | err = dev.set_device_capabilities() 51 | if err != nil { 52 | return nil, err 53 | } 54 | 55 | return &dev, nil 56 | } 57 | 58 | // Read and return a slice of input events from device. 59 | func (dev *InputDevice) Read() ([]InputEvent, error) { 60 | events := make([]InputEvent, 16) 61 | buffer := make([]byte, eventsize*16) 62 | 63 | _, err := dev.File.Read(buffer) 64 | if err != nil { 65 | return events, err 66 | } 67 | 68 | b := bytes.NewBuffer(buffer) 69 | err = binary.Read(b, binary.LittleEndian, &events) 70 | if err != nil { 71 | return events, err 72 | } 73 | 74 | // remove trailing structures 75 | for i := range events { 76 | if events[i].Time.Sec == 0 { 77 | events = append(events[:i]) 78 | break 79 | } 80 | } 81 | 82 | return events, err 83 | } 84 | 85 | // Read and return a single input event. 86 | func (dev *InputDevice) ReadOne() (*InputEvent, error) { 87 | event := InputEvent{} 88 | buffer := make([]byte, eventsize) 89 | 90 | _, err := dev.File.Read(buffer) 91 | if err != nil { 92 | return &event, err 93 | } 94 | 95 | b := bytes.NewBuffer(buffer) 96 | err = binary.Read(b, binary.LittleEndian, &event) 97 | if err != nil { 98 | return &event, err 99 | } 100 | 101 | return &event, err 102 | } 103 | 104 | // Get a useful description for an input device. Example: 105 | // InputDevice /dev/input/event3 (fd 3) 106 | // name Logitech USB Laser Mouse 107 | // phys usb-0000:00:12.0-2/input0 108 | // bus 0x3, vendor 0x46d, product 0xc069, version 0x110 109 | // events EV_KEY 1, EV_SYN 0, EV_REL 2, EV_MSC 4 110 | func (dev *InputDevice) String() string { 111 | evtypes := make([]string, 0) 112 | 113 | for ev := range dev.Capabilities { 114 | evtypes = append(evtypes, fmt.Sprintf("%s %d", ev.Name, ev.Type)) 115 | } 116 | evtypes_s := strings.Join(evtypes, ", ") 117 | 118 | return fmt.Sprintf( 119 | "InputDevice %s (fd %d)\n"+ 120 | " name %s\n"+ 121 | " phys %s\n"+ 122 | " bus 0x%04x, vendor 0x%04x, product 0x%04x, version 0x%04x\n"+ 123 | " events %s", 124 | dev.Fn, dev.File.Fd(), dev.Name, dev.Phys, dev.Bustype, 125 | dev.Vendor, dev.Product, dev.Version, evtypes_s) 126 | } 127 | 128 | // Gets the event types and event codes that the input device supports. 129 | func (dev *InputDevice) set_device_capabilities() error { 130 | // Capabilities is a map of supported event types to lists of 131 | // events e.g: {1: [272, 273, 274, 275], 2: [0, 1, 6, 8]} 132 | // capabilities := make(map[int][]int) 133 | capabilities := make(map[CapabilityType][]CapabilityCode) 134 | 135 | evbits := new([(EV_MAX + 1) / 8]byte) 136 | codebits := new([(KEY_MAX + 1) / 8]byte) 137 | // absbits := new([6]byte) 138 | 139 | err := ioctl(dev.File.Fd(), uintptr(EVIOCGBIT(0, EV_MAX)), unsafe.Pointer(evbits)) 140 | if err != 0 { 141 | return err 142 | } 143 | 144 | // Build a map of the device's capabilities 145 | for evtype := 0; evtype < EV_MAX; evtype++ { 146 | if evbits[evtype/8]&(1< 0 { 326 | device_glob = device_glob_arg[0] 327 | } 328 | 329 | fns, _ := ListInputDevicePaths(device_glob) 330 | devices := make([]*InputDevice, 0) 331 | 332 | for i := range fns { 333 | dev, err := Open(fns[i]) 334 | if err == nil { 335 | devices = append(devices, dev) 336 | } 337 | } 338 | 339 | return devices, nil 340 | } 341 | 342 | func bytes_to_string(b *[MAX_NAME_SIZE]byte) string { 343 | idx := bytes.IndexByte(b[:], 0) 344 | return string(b[:idx]) 345 | } 346 | -------------------------------------------------------------------------------- /doc.go: -------------------------------------------------------------------------------- 1 | /* 2 | This package provides bindings to the generic input event interface in 3 | Linux. The evdev interface serves the purpose of passing events 4 | generated in the kernel directly to userspace through character 5 | devices that are typically located in /dev/input/. 6 | 7 | Please refer to the godoc examples and the bin/evtest example program. 8 | 9 | */ 10 | package evdev 11 | -------------------------------------------------------------------------------- /ecodes.go: -------------------------------------------------------------------------------- 1 | // -*- mode: go; -*- 2 | 3 | // Integer constants defined in linux/input.h and linux/input-event-codes.h can be accessed 4 | // directly as constants or through the provided reverse and forward mappings: 5 | 6 | // 7 | // evdev.KEY_A // 30 8 | // evdev.ecodes["KEY_A"] // 30 9 | // evdev.KEY[30] // "KEY_A" 10 | // evdev.REL[0] // "REL_X" 11 | // evdev.EV[evdev.EV_KEY] // "EV_KEY" 12 | // evdev.ByEventType[EV_REL][0] // "REL_X" 13 | // 14 | // Generated on: Linux 4.7.4-200.fc24.x86_64 #1 SMP Thu Sep 15 18:42:09 UTC 2016 x86_64 15 | 16 | package evdev 17 | 18 | import "strings" 19 | 20 | const ( 21 | EV_VERSION = 0x010001 22 | ID_BUS = 0 23 | ID_VENDOR = 1 24 | ID_PRODUCT = 2 25 | ID_VERSION = 3 26 | BUS_PCI = 0x01 27 | BUS_ISAPNP = 0x02 28 | BUS_USB = 0x03 29 | BUS_HIL = 0x04 30 | BUS_BLUETOOTH = 0x05 31 | BUS_VIRTUAL = 0x06 32 | BUS_ISA = 0x10 33 | BUS_I8042 = 0x11 34 | BUS_XTKBD = 0x12 35 | BUS_RS232 = 0x13 36 | BUS_GAMEPORT = 0x14 37 | BUS_PARPORT = 0x15 38 | BUS_AMIGA = 0x16 39 | BUS_ADB = 0x17 40 | BUS_I2C = 0x18 41 | BUS_HOST = 0x19 42 | BUS_GSC = 0x1A 43 | BUS_ATARI = 0x1B 44 | BUS_SPI = 0x1C 45 | BUS_RMI = 0x1D 46 | BUS_CEC = 0x1E 47 | FF_STATUS_STOPPED = 0x00 48 | FF_STATUS_PLAYING = 0x01 49 | FF_STATUS_MAX = 0x01 50 | FF_RUMBLE = 0x50 51 | FF_PERIODIC = 0x51 52 | FF_CONSTANT = 0x52 53 | FF_SPRING = 0x53 54 | FF_FRICTION = 0x54 55 | FF_DAMPER = 0x55 56 | FF_INERTIA = 0x56 57 | FF_RAMP = 0x57 58 | FF_EFFECT_MIN = FF_RUMBLE 59 | FF_EFFECT_MAX = FF_RAMP 60 | FF_SQUARE = 0x58 61 | FF_TRIANGLE = 0x59 62 | FF_SINE = 0x5a 63 | FF_SAW_UP = 0x5b 64 | FF_SAW_DOWN = 0x5c 65 | FF_CUSTOM = 0x5d 66 | FF_WAVEFORM_MIN = FF_SQUARE 67 | FF_WAVEFORM_MAX = FF_CUSTOM 68 | FF_GAIN = 0x60 69 | FF_AUTOCENTER = 0x61 70 | FF_MAX_EFFECTS = FF_GAIN 71 | FF_MAX = 0x7f 72 | EV_SYN = 0x00 73 | EV_KEY = 0x01 74 | EV_REL = 0x02 75 | EV_ABS = 0x03 76 | EV_MSC = 0x04 77 | EV_SW = 0x05 78 | EV_LED = 0x11 79 | EV_SND = 0x12 80 | EV_REP = 0x14 81 | EV_FF = 0x15 82 | EV_PWR = 0x16 83 | EV_FF_STATUS = 0x17 84 | EV_MAX = 0x1f 85 | SYN_REPORT = 0 86 | SYN_CONFIG = 1 87 | SYN_MT_REPORT = 2 88 | SYN_DROPPED = 3 89 | SYN_MAX = 0xf 90 | KEY_RESERVED = 0 91 | KEY_ESC = 1 92 | KEY_1 = 2 93 | KEY_2 = 3 94 | KEY_3 = 4 95 | KEY_4 = 5 96 | KEY_5 = 6 97 | KEY_6 = 7 98 | KEY_7 = 8 99 | KEY_8 = 9 100 | KEY_9 = 10 101 | KEY_0 = 11 102 | KEY_MINUS = 12 103 | KEY_EQUAL = 13 104 | KEY_BACKSPACE = 14 105 | KEY_TAB = 15 106 | KEY_Q = 16 107 | KEY_W = 17 108 | KEY_E = 18 109 | KEY_R = 19 110 | KEY_T = 20 111 | KEY_Y = 21 112 | KEY_U = 22 113 | KEY_I = 23 114 | KEY_O = 24 115 | KEY_P = 25 116 | KEY_LEFTBRACE = 26 117 | KEY_RIGHTBRACE = 27 118 | KEY_ENTER = 28 119 | KEY_LEFTCTRL = 29 120 | KEY_A = 30 121 | KEY_S = 31 122 | KEY_D = 32 123 | KEY_F = 33 124 | KEY_G = 34 125 | KEY_H = 35 126 | KEY_J = 36 127 | KEY_K = 37 128 | KEY_L = 38 129 | KEY_SEMICOLON = 39 130 | KEY_APOSTROPHE = 40 131 | KEY_GRAVE = 41 132 | KEY_LEFTSHIFT = 42 133 | KEY_BACKSLASH = 43 134 | KEY_Z = 44 135 | KEY_X = 45 136 | KEY_C = 46 137 | KEY_V = 47 138 | KEY_B = 48 139 | KEY_N = 49 140 | KEY_M = 50 141 | KEY_COMMA = 51 142 | KEY_DOT = 52 143 | KEY_SLASH = 53 144 | KEY_RIGHTSHIFT = 54 145 | KEY_KPASTERISK = 55 146 | KEY_LEFTALT = 56 147 | KEY_SPACE = 57 148 | KEY_CAPSLOCK = 58 149 | KEY_F1 = 59 150 | KEY_F2 = 60 151 | KEY_F3 = 61 152 | KEY_F4 = 62 153 | KEY_F5 = 63 154 | KEY_F6 = 64 155 | KEY_F7 = 65 156 | KEY_F8 = 66 157 | KEY_F9 = 67 158 | KEY_F10 = 68 159 | KEY_NUMLOCK = 69 160 | KEY_SCROLLLOCK = 70 161 | KEY_KP7 = 71 162 | KEY_KP8 = 72 163 | KEY_KP9 = 73 164 | KEY_KPMINUS = 74 165 | KEY_KP4 = 75 166 | KEY_KP5 = 76 167 | KEY_KP6 = 77 168 | KEY_KPPLUS = 78 169 | KEY_KP1 = 79 170 | KEY_KP2 = 80 171 | KEY_KP3 = 81 172 | KEY_KP0 = 82 173 | KEY_KPDOT = 83 174 | KEY_ZENKAKUHANKAKU = 85 175 | KEY_102ND = 86 176 | KEY_F11 = 87 177 | KEY_F12 = 88 178 | KEY_RO = 89 179 | KEY_KATAKANA = 90 180 | KEY_HIRAGANA = 91 181 | KEY_HENKAN = 92 182 | KEY_KATAKANAHIRAGANA = 93 183 | KEY_MUHENKAN = 94 184 | KEY_KPJPCOMMA = 95 185 | KEY_KPENTER = 96 186 | KEY_RIGHTCTRL = 97 187 | KEY_KPSLASH = 98 188 | KEY_SYSRQ = 99 189 | KEY_RIGHTALT = 100 190 | KEY_LINEFEED = 101 191 | KEY_HOME = 102 192 | KEY_UP = 103 193 | KEY_PAGEUP = 104 194 | KEY_LEFT = 105 195 | KEY_RIGHT = 106 196 | KEY_END = 107 197 | KEY_DOWN = 108 198 | KEY_PAGEDOWN = 109 199 | KEY_INSERT = 110 200 | KEY_DELETE = 111 201 | KEY_MACRO = 112 202 | KEY_MUTE = 113 203 | KEY_VOLUMEDOWN = 114 204 | KEY_VOLUMEUP = 115 205 | KEY_POWER = 116 206 | KEY_KPEQUAL = 117 207 | KEY_KPPLUSMINUS = 118 208 | KEY_PAUSE = 119 209 | KEY_SCALE = 120 210 | KEY_KPCOMMA = 121 211 | KEY_HANGEUL = 122 212 | KEY_HANGUEL = KEY_HANGEUL 213 | KEY_HANJA = 123 214 | KEY_YEN = 124 215 | KEY_LEFTMETA = 125 216 | KEY_RIGHTMETA = 126 217 | KEY_COMPOSE = 127 218 | KEY_STOP = 128 219 | KEY_AGAIN = 129 220 | KEY_PROPS = 130 221 | KEY_UNDO = 131 222 | KEY_FRONT = 132 223 | KEY_COPY = 133 224 | KEY_OPEN = 134 225 | KEY_PASTE = 135 226 | KEY_FIND = 136 227 | KEY_CUT = 137 228 | KEY_HELP = 138 229 | KEY_MENU = 139 230 | KEY_CALC = 140 231 | KEY_SETUP = 141 232 | KEY_SLEEP = 142 233 | KEY_WAKEUP = 143 234 | KEY_FILE = 144 235 | KEY_SENDFILE = 145 236 | KEY_DELETEFILE = 146 237 | KEY_XFER = 147 238 | KEY_PROG1 = 148 239 | KEY_PROG2 = 149 240 | KEY_WWW = 150 241 | KEY_MSDOS = 151 242 | KEY_COFFEE = 152 243 | KEY_SCREENLOCK = KEY_COFFEE 244 | KEY_ROTATE_DISPLAY = 153 245 | KEY_DIRECTION = KEY_ROTATE_DISPLAY 246 | KEY_CYCLEWINDOWS = 154 247 | KEY_MAIL = 155 248 | KEY_BOOKMARKS = 156 249 | KEY_COMPUTER = 157 250 | KEY_BACK = 158 251 | KEY_FORWARD = 159 252 | KEY_CLOSECD = 160 253 | KEY_EJECTCD = 161 254 | KEY_EJECTCLOSECD = 162 255 | KEY_NEXTSONG = 163 256 | KEY_PLAYPAUSE = 164 257 | KEY_PREVIOUSSONG = 165 258 | KEY_STOPCD = 166 259 | KEY_RECORD = 167 260 | KEY_REWIND = 168 261 | KEY_PHONE = 169 262 | KEY_ISO = 170 263 | KEY_CONFIG = 171 264 | KEY_HOMEPAGE = 172 265 | KEY_REFRESH = 173 266 | KEY_EXIT = 174 267 | KEY_MOVE = 175 268 | KEY_EDIT = 176 269 | KEY_SCROLLUP = 177 270 | KEY_SCROLLDOWN = 178 271 | KEY_KPLEFTPAREN = 179 272 | KEY_KPRIGHTPAREN = 180 273 | KEY_NEW = 181 274 | KEY_REDO = 182 275 | KEY_F13 = 183 276 | KEY_F14 = 184 277 | KEY_F15 = 185 278 | KEY_F16 = 186 279 | KEY_F17 = 187 280 | KEY_F18 = 188 281 | KEY_F19 = 189 282 | KEY_F20 = 190 283 | KEY_F21 = 191 284 | KEY_F22 = 192 285 | KEY_F23 = 193 286 | KEY_F24 = 194 287 | KEY_PLAYCD = 200 288 | KEY_PAUSECD = 201 289 | KEY_PROG3 = 202 290 | KEY_PROG4 = 203 291 | KEY_DASHBOARD = 204 292 | KEY_SUSPEND = 205 293 | KEY_CLOSE = 206 294 | KEY_PLAY = 207 295 | KEY_FASTFORWARD = 208 296 | KEY_BASSBOOST = 209 297 | KEY_PRINT = 210 298 | KEY_HP = 211 299 | KEY_CAMERA = 212 300 | KEY_SOUND = 213 301 | KEY_QUESTION = 214 302 | KEY_EMAIL = 215 303 | KEY_CHAT = 216 304 | KEY_SEARCH = 217 305 | KEY_CONNECT = 218 306 | KEY_FINANCE = 219 307 | KEY_SPORT = 220 308 | KEY_SHOP = 221 309 | KEY_ALTERASE = 222 310 | KEY_CANCEL = 223 311 | KEY_BRIGHTNESSDOWN = 224 312 | KEY_BRIGHTNESSUP = 225 313 | KEY_MEDIA = 226 314 | KEY_SWITCHVIDEOMODE = 227 315 | KEY_KBDILLUMTOGGLE = 228 316 | KEY_KBDILLUMDOWN = 229 317 | KEY_KBDILLUMUP = 230 318 | KEY_SEND = 231 319 | KEY_REPLY = 232 320 | KEY_FORWARDMAIL = 233 321 | KEY_SAVE = 234 322 | KEY_DOCUMENTS = 235 323 | KEY_BATTERY = 236 324 | KEY_BLUETOOTH = 237 325 | KEY_WLAN = 238 326 | KEY_UWB = 239 327 | KEY_UNKNOWN = 240 328 | KEY_VIDEO_NEXT = 241 329 | KEY_VIDEO_PREV = 242 330 | KEY_BRIGHTNESS_CYCLE = 243 331 | KEY_BRIGHTNESS_AUTO = 244 332 | KEY_BRIGHTNESS_ZERO = KEY_BRIGHTNESS_AUTO 333 | KEY_DISPLAY_OFF = 245 334 | KEY_WWAN = 246 335 | KEY_WIMAX = KEY_WWAN 336 | KEY_RFKILL = 247 337 | KEY_MICMUTE = 248 338 | BTN_MISC = 0x100 339 | BTN_0 = 0x100 340 | BTN_1 = 0x101 341 | BTN_2 = 0x102 342 | BTN_3 = 0x103 343 | BTN_4 = 0x104 344 | BTN_5 = 0x105 345 | BTN_6 = 0x106 346 | BTN_7 = 0x107 347 | BTN_8 = 0x108 348 | BTN_9 = 0x109 349 | BTN_MOUSE = 0x110 350 | BTN_LEFT = 0x110 351 | BTN_RIGHT = 0x111 352 | BTN_MIDDLE = 0x112 353 | BTN_SIDE = 0x113 354 | BTN_EXTRA = 0x114 355 | BTN_FORWARD = 0x115 356 | BTN_BACK = 0x116 357 | BTN_TASK = 0x117 358 | BTN_JOYSTICK = 0x120 359 | BTN_TRIGGER = 0x120 360 | BTN_THUMB = 0x121 361 | BTN_THUMB2 = 0x122 362 | BTN_TOP = 0x123 363 | BTN_TOP2 = 0x124 364 | BTN_PINKIE = 0x125 365 | BTN_BASE = 0x126 366 | BTN_BASE2 = 0x127 367 | BTN_BASE3 = 0x128 368 | BTN_BASE4 = 0x129 369 | BTN_BASE5 = 0x12a 370 | BTN_BASE6 = 0x12b 371 | BTN_DEAD = 0x12f 372 | BTN_GAMEPAD = 0x130 373 | BTN_SOUTH = 0x130 374 | BTN_A = BTN_SOUTH 375 | BTN_EAST = 0x131 376 | BTN_B = BTN_EAST 377 | BTN_C = 0x132 378 | BTN_NORTH = 0x133 379 | BTN_X = BTN_NORTH 380 | BTN_WEST = 0x134 381 | BTN_Y = BTN_WEST 382 | BTN_Z = 0x135 383 | BTN_TL = 0x136 384 | BTN_TR = 0x137 385 | BTN_TL2 = 0x138 386 | BTN_TR2 = 0x139 387 | BTN_SELECT = 0x13a 388 | BTN_START = 0x13b 389 | BTN_MODE = 0x13c 390 | BTN_THUMBL = 0x13d 391 | BTN_THUMBR = 0x13e 392 | BTN_DIGI = 0x140 393 | BTN_TOOL_PEN = 0x140 394 | BTN_TOOL_RUBBER = 0x141 395 | BTN_TOOL_BRUSH = 0x142 396 | BTN_TOOL_PENCIL = 0x143 397 | BTN_TOOL_AIRBRUSH = 0x144 398 | BTN_TOOL_FINGER = 0x145 399 | BTN_TOOL_MOUSE = 0x146 400 | BTN_TOOL_LENS = 0x147 401 | BTN_TOOL_QUINTTAP = 0x148 402 | BTN_TOUCH = 0x14a 403 | BTN_STYLUS = 0x14b 404 | BTN_STYLUS2 = 0x14c 405 | BTN_TOOL_DOUBLETAP = 0x14d 406 | BTN_TOOL_TRIPLETAP = 0x14e 407 | BTN_TOOL_QUADTAP = 0x14f 408 | BTN_WHEEL = 0x150 409 | BTN_GEAR_DOWN = 0x150 410 | BTN_GEAR_UP = 0x151 411 | KEY_OK = 0x160 412 | KEY_SELECT = 0x161 413 | KEY_GOTO = 0x162 414 | KEY_CLEAR = 0x163 415 | KEY_POWER2 = 0x164 416 | KEY_OPTION = 0x165 417 | KEY_INFO = 0x166 418 | KEY_TIME = 0x167 419 | KEY_VENDOR = 0x168 420 | KEY_ARCHIVE = 0x169 421 | KEY_PROGRAM = 0x16a 422 | KEY_CHANNEL = 0x16b 423 | KEY_FAVORITES = 0x16c 424 | KEY_EPG = 0x16d 425 | KEY_PVR = 0x16e 426 | KEY_MHP = 0x16f 427 | KEY_LANGUAGE = 0x170 428 | KEY_TITLE = 0x171 429 | KEY_SUBTITLE = 0x172 430 | KEY_ANGLE = 0x173 431 | KEY_ZOOM = 0x174 432 | KEY_MODE = 0x175 433 | KEY_KEYBOARD = 0x176 434 | KEY_SCREEN = 0x177 435 | KEY_PC = 0x178 436 | KEY_TV = 0x179 437 | KEY_TV2 = 0x17a 438 | KEY_VCR = 0x17b 439 | KEY_VCR2 = 0x17c 440 | KEY_SAT = 0x17d 441 | KEY_SAT2 = 0x17e 442 | KEY_CD = 0x17f 443 | KEY_TAPE = 0x180 444 | KEY_RADIO = 0x181 445 | KEY_TUNER = 0x182 446 | KEY_PLAYER = 0x183 447 | KEY_TEXT = 0x184 448 | KEY_DVD = 0x185 449 | KEY_AUX = 0x186 450 | KEY_MP3 = 0x187 451 | KEY_AUDIO = 0x188 452 | KEY_VIDEO = 0x189 453 | KEY_DIRECTORY = 0x18a 454 | KEY_LIST = 0x18b 455 | KEY_MEMO = 0x18c 456 | KEY_CALENDAR = 0x18d 457 | KEY_RED = 0x18e 458 | KEY_GREEN = 0x18f 459 | KEY_YELLOW = 0x190 460 | KEY_BLUE = 0x191 461 | KEY_CHANNELUP = 0x192 462 | KEY_CHANNELDOWN = 0x193 463 | KEY_FIRST = 0x194 464 | KEY_LAST = 0x195 465 | KEY_AB = 0x196 466 | KEY_NEXT = 0x197 467 | KEY_RESTART = 0x198 468 | KEY_SLOW = 0x199 469 | KEY_SHUFFLE = 0x19a 470 | KEY_BREAK = 0x19b 471 | KEY_PREVIOUS = 0x19c 472 | KEY_DIGITS = 0x19d 473 | KEY_TEEN = 0x19e 474 | KEY_TWEN = 0x19f 475 | KEY_VIDEOPHONE = 0x1a0 476 | KEY_GAMES = 0x1a1 477 | KEY_ZOOMIN = 0x1a2 478 | KEY_ZOOMOUT = 0x1a3 479 | KEY_ZOOMRESET = 0x1a4 480 | KEY_WORDPROCESSOR = 0x1a5 481 | KEY_EDITOR = 0x1a6 482 | KEY_SPREADSHEET = 0x1a7 483 | KEY_GRAPHICSEDITOR = 0x1a8 484 | KEY_PRESENTATION = 0x1a9 485 | KEY_DATABASE = 0x1aa 486 | KEY_NEWS = 0x1ab 487 | KEY_VOICEMAIL = 0x1ac 488 | KEY_ADDRESSBOOK = 0x1ad 489 | KEY_MESSENGER = 0x1ae 490 | KEY_DISPLAYTOGGLE = 0x1af 491 | KEY_BRIGHTNESS_TOGGLE = KEY_DISPLAYTOGGLE 492 | KEY_SPELLCHECK = 0x1b0 493 | KEY_LOGOFF = 0x1b1 494 | KEY_DOLLAR = 0x1b2 495 | KEY_EURO = 0x1b3 496 | KEY_FRAMEBACK = 0x1b4 497 | KEY_FRAMEFORWARD = 0x1b5 498 | KEY_CONTEXT_MENU = 0x1b6 499 | KEY_MEDIA_REPEAT = 0x1b7 500 | KEY_10CHANNELSUP = 0x1b8 501 | KEY_10CHANNELSDOWN = 0x1b9 502 | KEY_IMAGES = 0x1ba 503 | KEY_DEL_EOL = 0x1c0 504 | KEY_DEL_EOS = 0x1c1 505 | KEY_INS_LINE = 0x1c2 506 | KEY_DEL_LINE = 0x1c3 507 | KEY_FN = 0x1d0 508 | KEY_FN_ESC = 0x1d1 509 | KEY_FN_F1 = 0x1d2 510 | KEY_FN_F2 = 0x1d3 511 | KEY_FN_F3 = 0x1d4 512 | KEY_FN_F4 = 0x1d5 513 | KEY_FN_F5 = 0x1d6 514 | KEY_FN_F6 = 0x1d7 515 | KEY_FN_F7 = 0x1d8 516 | KEY_FN_F8 = 0x1d9 517 | KEY_FN_F9 = 0x1da 518 | KEY_FN_F10 = 0x1db 519 | KEY_FN_F11 = 0x1dc 520 | KEY_FN_F12 = 0x1dd 521 | KEY_FN_1 = 0x1de 522 | KEY_FN_2 = 0x1df 523 | KEY_FN_D = 0x1e0 524 | KEY_FN_E = 0x1e1 525 | KEY_FN_F = 0x1e2 526 | KEY_FN_S = 0x1e3 527 | KEY_FN_B = 0x1e4 528 | KEY_BRL_DOT1 = 0x1f1 529 | KEY_BRL_DOT2 = 0x1f2 530 | KEY_BRL_DOT3 = 0x1f3 531 | KEY_BRL_DOT4 = 0x1f4 532 | KEY_BRL_DOT5 = 0x1f5 533 | KEY_BRL_DOT6 = 0x1f6 534 | KEY_BRL_DOT7 = 0x1f7 535 | KEY_BRL_DOT8 = 0x1f8 536 | KEY_BRL_DOT9 = 0x1f9 537 | KEY_BRL_DOT10 = 0x1fa 538 | KEY_NUMERIC_0 = 0x200 539 | KEY_NUMERIC_1 = 0x201 540 | KEY_NUMERIC_2 = 0x202 541 | KEY_NUMERIC_3 = 0x203 542 | KEY_NUMERIC_4 = 0x204 543 | KEY_NUMERIC_5 = 0x205 544 | KEY_NUMERIC_6 = 0x206 545 | KEY_NUMERIC_7 = 0x207 546 | KEY_NUMERIC_8 = 0x208 547 | KEY_NUMERIC_9 = 0x209 548 | KEY_NUMERIC_STAR = 0x20a 549 | KEY_NUMERIC_POUND = 0x20b 550 | KEY_NUMERIC_A = 0x20c 551 | KEY_NUMERIC_B = 0x20d 552 | KEY_NUMERIC_C = 0x20e 553 | KEY_NUMERIC_D = 0x20f 554 | KEY_CAMERA_FOCUS = 0x210 555 | KEY_WPS_BUTTON = 0x211 556 | KEY_TOUCHPAD_TOGGLE = 0x212 557 | KEY_TOUCHPAD_ON = 0x213 558 | KEY_TOUCHPAD_OFF = 0x214 559 | KEY_CAMERA_ZOOMIN = 0x215 560 | KEY_CAMERA_ZOOMOUT = 0x216 561 | KEY_CAMERA_UP = 0x217 562 | KEY_CAMERA_DOWN = 0x218 563 | KEY_CAMERA_LEFT = 0x219 564 | KEY_CAMERA_RIGHT = 0x21a 565 | KEY_ATTENDANT_ON = 0x21b 566 | KEY_ATTENDANT_OFF = 0x21c 567 | KEY_ATTENDANT_TOGGLE = 0x21d 568 | KEY_LIGHTS_TOGGLE = 0x21e 569 | BTN_DPAD_UP = 0x220 570 | BTN_DPAD_DOWN = 0x221 571 | BTN_DPAD_LEFT = 0x222 572 | BTN_DPAD_RIGHT = 0x223 573 | KEY_ALS_TOGGLE = 0x230 574 | KEY_BUTTONCONFIG = 0x240 575 | KEY_TASKMANAGER = 0x241 576 | KEY_JOURNAL = 0x242 577 | KEY_CONTROLPANEL = 0x243 578 | KEY_APPSELECT = 0x244 579 | KEY_SCREENSAVER = 0x245 580 | KEY_VOICECOMMAND = 0x246 581 | KEY_BRIGHTNESS_MIN = 0x250 582 | KEY_BRIGHTNESS_MAX = 0x251 583 | KEY_KBDINPUTASSIST_PREV = 0x260 584 | KEY_KBDINPUTASSIST_NEXT = 0x261 585 | KEY_KBDINPUTASSIST_PREVGROUP = 0x262 586 | KEY_KBDINPUTASSIST_NEXTGROUP = 0x263 587 | KEY_KBDINPUTASSIST_ACCEPT = 0x264 588 | KEY_KBDINPUTASSIST_CANCEL = 0x265 589 | KEY_RIGHT_UP = 0x266 590 | KEY_RIGHT_DOWN = 0x267 591 | KEY_LEFT_UP = 0x268 592 | KEY_LEFT_DOWN = 0x269 593 | KEY_ROOT_MENU = 0x26a 594 | KEY_MEDIA_TOP_MENU = 0x26b 595 | KEY_NUMERIC_11 = 0x26c 596 | KEY_NUMERIC_12 = 0x26d 597 | KEY_AUDIO_DESC = 0x26e 598 | KEY_3D_MODE = 0x26f 599 | KEY_NEXT_FAVORITE = 0x270 600 | KEY_STOP_RECORD = 0x271 601 | KEY_PAUSE_RECORD = 0x272 602 | KEY_VOD = 0x273 603 | KEY_UNMUTE = 0x274 604 | KEY_FASTREVERSE = 0x275 605 | KEY_SLOWREVERSE = 0x276 606 | KEY_DATA = 0x275 607 | BTN_TRIGGER_HAPPY = 0x2c0 608 | BTN_TRIGGER_HAPPY1 = 0x2c0 609 | BTN_TRIGGER_HAPPY2 = 0x2c1 610 | BTN_TRIGGER_HAPPY3 = 0x2c2 611 | BTN_TRIGGER_HAPPY4 = 0x2c3 612 | BTN_TRIGGER_HAPPY5 = 0x2c4 613 | BTN_TRIGGER_HAPPY6 = 0x2c5 614 | BTN_TRIGGER_HAPPY7 = 0x2c6 615 | BTN_TRIGGER_HAPPY8 = 0x2c7 616 | BTN_TRIGGER_HAPPY9 = 0x2c8 617 | BTN_TRIGGER_HAPPY10 = 0x2c9 618 | BTN_TRIGGER_HAPPY11 = 0x2ca 619 | BTN_TRIGGER_HAPPY12 = 0x2cb 620 | BTN_TRIGGER_HAPPY13 = 0x2cc 621 | BTN_TRIGGER_HAPPY14 = 0x2cd 622 | BTN_TRIGGER_HAPPY15 = 0x2ce 623 | BTN_TRIGGER_HAPPY16 = 0x2cf 624 | BTN_TRIGGER_HAPPY17 = 0x2d0 625 | BTN_TRIGGER_HAPPY18 = 0x2d1 626 | BTN_TRIGGER_HAPPY19 = 0x2d2 627 | BTN_TRIGGER_HAPPY20 = 0x2d3 628 | BTN_TRIGGER_HAPPY21 = 0x2d4 629 | BTN_TRIGGER_HAPPY22 = 0x2d5 630 | BTN_TRIGGER_HAPPY23 = 0x2d6 631 | BTN_TRIGGER_HAPPY24 = 0x2d7 632 | BTN_TRIGGER_HAPPY25 = 0x2d8 633 | BTN_TRIGGER_HAPPY26 = 0x2d9 634 | BTN_TRIGGER_HAPPY27 = 0x2da 635 | BTN_TRIGGER_HAPPY28 = 0x2db 636 | BTN_TRIGGER_HAPPY29 = 0x2dc 637 | BTN_TRIGGER_HAPPY30 = 0x2dd 638 | BTN_TRIGGER_HAPPY31 = 0x2de 639 | BTN_TRIGGER_HAPPY32 = 0x2df 640 | BTN_TRIGGER_HAPPY33 = 0x2e0 641 | BTN_TRIGGER_HAPPY34 = 0x2e1 642 | BTN_TRIGGER_HAPPY35 = 0x2e2 643 | BTN_TRIGGER_HAPPY36 = 0x2e3 644 | BTN_TRIGGER_HAPPY37 = 0x2e4 645 | BTN_TRIGGER_HAPPY38 = 0x2e5 646 | BTN_TRIGGER_HAPPY39 = 0x2e6 647 | BTN_TRIGGER_HAPPY40 = 0x2e7 648 | KEY_MIN_INTERESTING = KEY_MUTE 649 | KEY_MAX = 0x2ff 650 | REL_X = 0x00 651 | REL_Y = 0x01 652 | REL_Z = 0x02 653 | REL_RX = 0x03 654 | REL_RY = 0x04 655 | REL_RZ = 0x05 656 | REL_HWHEEL = 0x06 657 | REL_DIAL = 0x07 658 | REL_WHEEL = 0x08 659 | REL_MISC = 0x09 660 | REL_MAX = 0x0f 661 | ABS_X = 0x00 662 | ABS_Y = 0x01 663 | ABS_Z = 0x02 664 | ABS_RX = 0x03 665 | ABS_RY = 0x04 666 | ABS_RZ = 0x05 667 | ABS_THROTTLE = 0x06 668 | ABS_RUDDER = 0x07 669 | ABS_WHEEL = 0x08 670 | ABS_GAS = 0x09 671 | ABS_BRAKE = 0x0a 672 | ABS_HAT0X = 0x10 673 | ABS_HAT0Y = 0x11 674 | ABS_HAT1X = 0x12 675 | ABS_HAT1Y = 0x13 676 | ABS_HAT2X = 0x14 677 | ABS_HAT2Y = 0x15 678 | ABS_HAT3X = 0x16 679 | ABS_HAT3Y = 0x17 680 | ABS_PRESSURE = 0x18 681 | ABS_DISTANCE = 0x19 682 | ABS_TILT_X = 0x1a 683 | ABS_TILT_Y = 0x1b 684 | ABS_TOOL_WIDTH = 0x1c 685 | ABS_VOLUME = 0x20 686 | ABS_MISC = 0x28 687 | ABS_MT_SLOT = 0x2f 688 | ABS_MT_TOUCH_MAJOR = 0x30 689 | ABS_MT_TOUCH_MINOR = 0x31 690 | ABS_MT_WIDTH_MAJOR = 0x32 691 | ABS_MT_WIDTH_MINOR = 0x33 692 | ABS_MT_ORIENTATION = 0x34 693 | ABS_MT_POSITION_X = 0x35 694 | ABS_MT_POSITION_Y = 0x36 695 | ABS_MT_TOOL_TYPE = 0x37 696 | ABS_MT_BLOB_ID = 0x38 697 | ABS_MT_TRACKING_ID = 0x39 698 | ABS_MT_PRESSURE = 0x3a 699 | ABS_MT_DISTANCE = 0x3b 700 | ABS_MT_TOOL_X = 0x3c 701 | ABS_MT_TOOL_Y = 0x3d 702 | ABS_MAX = 0x3f 703 | SW_LID = 0x00 704 | SW_TABLET_MODE = 0x01 705 | SW_HEADPHONE_INSERT = 0x02 706 | SW_RFKILL_ALL = 0x03 707 | SW_RADIO = SW_RFKILL_ALL 708 | SW_MICROPHONE_INSERT = 0x04 709 | SW_DOCK = 0x05 710 | SW_LINEOUT_INSERT = 0x06 711 | SW_JACK_PHYSICAL_INSERT = 0x07 712 | SW_VIDEOOUT_INSERT = 0x08 713 | SW_CAMERA_LENS_COVER = 0x09 714 | SW_KEYPAD_SLIDE = 0x0a 715 | SW_FRONT_PROXIMITY = 0x0b 716 | SW_ROTATE_LOCK = 0x0c 717 | SW_LINEIN_INSERT = 0x0d 718 | SW_MUTE_DEVICE = 0x0e 719 | SW_PEN_INSERTED = 0x0f 720 | SW_MAX = 0x0f 721 | MSC_SERIAL = 0x00 722 | MSC_PULSELED = 0x01 723 | MSC_GESTURE = 0x02 724 | MSC_RAW = 0x03 725 | MSC_SCAN = 0x04 726 | MSC_TIMESTAMP = 0x05 727 | MSC_MAX = 0x07 728 | LED_NUML = 0x00 729 | LED_CAPSL = 0x01 730 | LED_SCROLLL = 0x02 731 | LED_COMPOSE = 0x03 732 | LED_KANA = 0x04 733 | LED_SLEEP = 0x05 734 | LED_SUSPEND = 0x06 735 | LED_MUTE = 0x07 736 | LED_MISC = 0x08 737 | LED_MAIL = 0x09 738 | LED_CHARGING = 0x0a 739 | LED_MAX = 0x0f 740 | REP_DELAY = 0x00 741 | REP_PERIOD = 0x01 742 | REP_MAX = 0x01 743 | SND_CLICK = 0x00 744 | SND_BELL = 0x01 745 | SND_TONE = 0x02 746 | SND_MAX = 0x07 747 | ) 748 | 749 | var ecodes = map[string]int{ 750 | "EV_VERSION": EV_VERSION, 751 | "ID_BUS": ID_BUS, 752 | "ID_VENDOR": ID_VENDOR, 753 | "ID_PRODUCT": ID_PRODUCT, 754 | "ID_VERSION": ID_VERSION, 755 | "BUS_PCI": BUS_PCI, 756 | "BUS_ISAPNP": BUS_ISAPNP, 757 | "BUS_USB": BUS_USB, 758 | "BUS_HIL": BUS_HIL, 759 | "BUS_BLUETOOTH": BUS_BLUETOOTH, 760 | "BUS_VIRTUAL": BUS_VIRTUAL, 761 | "BUS_ISA": BUS_ISA, 762 | "BUS_I8042": BUS_I8042, 763 | "BUS_XTKBD": BUS_XTKBD, 764 | "BUS_RS232": BUS_RS232, 765 | "BUS_GAMEPORT": BUS_GAMEPORT, 766 | "BUS_PARPORT": BUS_PARPORT, 767 | "BUS_AMIGA": BUS_AMIGA, 768 | "BUS_ADB": BUS_ADB, 769 | "BUS_I2C": BUS_I2C, 770 | "BUS_HOST": BUS_HOST, 771 | "BUS_GSC": BUS_GSC, 772 | "BUS_ATARI": BUS_ATARI, 773 | "BUS_SPI": BUS_SPI, 774 | "BUS_RMI": BUS_RMI, 775 | "BUS_CEC": BUS_CEC, 776 | "FF_STATUS_STOPPED": FF_STATUS_STOPPED, 777 | "FF_STATUS_PLAYING": FF_STATUS_PLAYING, 778 | "FF_STATUS_MAX": FF_STATUS_MAX, 779 | "FF_RUMBLE": FF_RUMBLE, 780 | "FF_PERIODIC": FF_PERIODIC, 781 | "FF_CONSTANT": FF_CONSTANT, 782 | "FF_SPRING": FF_SPRING, 783 | "FF_FRICTION": FF_FRICTION, 784 | "FF_DAMPER": FF_DAMPER, 785 | "FF_INERTIA": FF_INERTIA, 786 | "FF_RAMP": FF_RAMP, 787 | "FF_EFFECT_MIN": FF_EFFECT_MIN, 788 | "FF_EFFECT_MAX": FF_EFFECT_MAX, 789 | "FF_SQUARE": FF_SQUARE, 790 | "FF_TRIANGLE": FF_TRIANGLE, 791 | "FF_SINE": FF_SINE, 792 | "FF_SAW_UP": FF_SAW_UP, 793 | "FF_SAW_DOWN": FF_SAW_DOWN, 794 | "FF_CUSTOM": FF_CUSTOM, 795 | "FF_WAVEFORM_MIN": FF_WAVEFORM_MIN, 796 | "FF_WAVEFORM_MAX": FF_WAVEFORM_MAX, 797 | "FF_GAIN": FF_GAIN, 798 | "FF_AUTOCENTER": FF_AUTOCENTER, 799 | "FF_MAX_EFFECTS": FF_MAX_EFFECTS, 800 | "FF_MAX": FF_MAX, 801 | "EV_SYN": EV_SYN, 802 | "EV_KEY": EV_KEY, 803 | "EV_REL": EV_REL, 804 | "EV_ABS": EV_ABS, 805 | "EV_MSC": EV_MSC, 806 | "EV_SW": EV_SW, 807 | "EV_LED": EV_LED, 808 | "EV_SND": EV_SND, 809 | "EV_REP": EV_REP, 810 | "EV_FF": EV_FF, 811 | "EV_PWR": EV_PWR, 812 | "EV_FF_STATUS": EV_FF_STATUS, 813 | "EV_MAX": EV_MAX, 814 | "SYN_REPORT": SYN_REPORT, 815 | "SYN_CONFIG": SYN_CONFIG, 816 | "SYN_MT_REPORT": SYN_MT_REPORT, 817 | "SYN_DROPPED": SYN_DROPPED, 818 | "SYN_MAX": SYN_MAX, 819 | "KEY_RESERVED": KEY_RESERVED, 820 | "KEY_ESC": KEY_ESC, 821 | "KEY_1": KEY_1, 822 | "KEY_2": KEY_2, 823 | "KEY_3": KEY_3, 824 | "KEY_4": KEY_4, 825 | "KEY_5": KEY_5, 826 | "KEY_6": KEY_6, 827 | "KEY_7": KEY_7, 828 | "KEY_8": KEY_8, 829 | "KEY_9": KEY_9, 830 | "KEY_0": KEY_0, 831 | "KEY_MINUS": KEY_MINUS, 832 | "KEY_EQUAL": KEY_EQUAL, 833 | "KEY_BACKSPACE": KEY_BACKSPACE, 834 | "KEY_TAB": KEY_TAB, 835 | "KEY_Q": KEY_Q, 836 | "KEY_W": KEY_W, 837 | "KEY_E": KEY_E, 838 | "KEY_R": KEY_R, 839 | "KEY_T": KEY_T, 840 | "KEY_Y": KEY_Y, 841 | "KEY_U": KEY_U, 842 | "KEY_I": KEY_I, 843 | "KEY_O": KEY_O, 844 | "KEY_P": KEY_P, 845 | "KEY_LEFTBRACE": KEY_LEFTBRACE, 846 | "KEY_RIGHTBRACE": KEY_RIGHTBRACE, 847 | "KEY_ENTER": KEY_ENTER, 848 | "KEY_LEFTCTRL": KEY_LEFTCTRL, 849 | "KEY_A": KEY_A, 850 | "KEY_S": KEY_S, 851 | "KEY_D": KEY_D, 852 | "KEY_F": KEY_F, 853 | "KEY_G": KEY_G, 854 | "KEY_H": KEY_H, 855 | "KEY_J": KEY_J, 856 | "KEY_K": KEY_K, 857 | "KEY_L": KEY_L, 858 | "KEY_SEMICOLON": KEY_SEMICOLON, 859 | "KEY_APOSTROPHE": KEY_APOSTROPHE, 860 | "KEY_GRAVE": KEY_GRAVE, 861 | "KEY_LEFTSHIFT": KEY_LEFTSHIFT, 862 | "KEY_BACKSLASH": KEY_BACKSLASH, 863 | "KEY_Z": KEY_Z, 864 | "KEY_X": KEY_X, 865 | "KEY_C": KEY_C, 866 | "KEY_V": KEY_V, 867 | "KEY_B": KEY_B, 868 | "KEY_N": KEY_N, 869 | "KEY_M": KEY_M, 870 | "KEY_COMMA": KEY_COMMA, 871 | "KEY_DOT": KEY_DOT, 872 | "KEY_SLASH": KEY_SLASH, 873 | "KEY_RIGHTSHIFT": KEY_RIGHTSHIFT, 874 | "KEY_KPASTERISK": KEY_KPASTERISK, 875 | "KEY_LEFTALT": KEY_LEFTALT, 876 | "KEY_SPACE": KEY_SPACE, 877 | "KEY_CAPSLOCK": KEY_CAPSLOCK, 878 | "KEY_F1": KEY_F1, 879 | "KEY_F2": KEY_F2, 880 | "KEY_F3": KEY_F3, 881 | "KEY_F4": KEY_F4, 882 | "KEY_F5": KEY_F5, 883 | "KEY_F6": KEY_F6, 884 | "KEY_F7": KEY_F7, 885 | "KEY_F8": KEY_F8, 886 | "KEY_F9": KEY_F9, 887 | "KEY_F10": KEY_F10, 888 | "KEY_NUMLOCK": KEY_NUMLOCK, 889 | "KEY_SCROLLLOCK": KEY_SCROLLLOCK, 890 | "KEY_KP7": KEY_KP7, 891 | "KEY_KP8": KEY_KP8, 892 | "KEY_KP9": KEY_KP9, 893 | "KEY_KPMINUS": KEY_KPMINUS, 894 | "KEY_KP4": KEY_KP4, 895 | "KEY_KP5": KEY_KP5, 896 | "KEY_KP6": KEY_KP6, 897 | "KEY_KPPLUS": KEY_KPPLUS, 898 | "KEY_KP1": KEY_KP1, 899 | "KEY_KP2": KEY_KP2, 900 | "KEY_KP3": KEY_KP3, 901 | "KEY_KP0": KEY_KP0, 902 | "KEY_KPDOT": KEY_KPDOT, 903 | "KEY_ZENKAKUHANKAKU": KEY_ZENKAKUHANKAKU, 904 | "KEY_102ND": KEY_102ND, 905 | "KEY_F11": KEY_F11, 906 | "KEY_F12": KEY_F12, 907 | "KEY_RO": KEY_RO, 908 | "KEY_KATAKANA": KEY_KATAKANA, 909 | "KEY_HIRAGANA": KEY_HIRAGANA, 910 | "KEY_HENKAN": KEY_HENKAN, 911 | "KEY_KATAKANAHIRAGANA": KEY_KATAKANAHIRAGANA, 912 | "KEY_MUHENKAN": KEY_MUHENKAN, 913 | "KEY_KPJPCOMMA": KEY_KPJPCOMMA, 914 | "KEY_KPENTER": KEY_KPENTER, 915 | "KEY_RIGHTCTRL": KEY_RIGHTCTRL, 916 | "KEY_KPSLASH": KEY_KPSLASH, 917 | "KEY_SYSRQ": KEY_SYSRQ, 918 | "KEY_RIGHTALT": KEY_RIGHTALT, 919 | "KEY_LINEFEED": KEY_LINEFEED, 920 | "KEY_HOME": KEY_HOME, 921 | "KEY_UP": KEY_UP, 922 | "KEY_PAGEUP": KEY_PAGEUP, 923 | "KEY_LEFT": KEY_LEFT, 924 | "KEY_RIGHT": KEY_RIGHT, 925 | "KEY_END": KEY_END, 926 | "KEY_DOWN": KEY_DOWN, 927 | "KEY_PAGEDOWN": KEY_PAGEDOWN, 928 | "KEY_INSERT": KEY_INSERT, 929 | "KEY_DELETE": KEY_DELETE, 930 | "KEY_MACRO": KEY_MACRO, 931 | "KEY_MUTE": KEY_MUTE, 932 | "KEY_VOLUMEDOWN": KEY_VOLUMEDOWN, 933 | "KEY_VOLUMEUP": KEY_VOLUMEUP, 934 | "KEY_POWER": KEY_POWER, 935 | "KEY_KPEQUAL": KEY_KPEQUAL, 936 | "KEY_KPPLUSMINUS": KEY_KPPLUSMINUS, 937 | "KEY_PAUSE": KEY_PAUSE, 938 | "KEY_SCALE": KEY_SCALE, 939 | "KEY_KPCOMMA": KEY_KPCOMMA, 940 | "KEY_HANGEUL": KEY_HANGEUL, 941 | "KEY_HANGUEL": KEY_HANGUEL, 942 | "KEY_HANJA": KEY_HANJA, 943 | "KEY_YEN": KEY_YEN, 944 | "KEY_LEFTMETA": KEY_LEFTMETA, 945 | "KEY_RIGHTMETA": KEY_RIGHTMETA, 946 | "KEY_COMPOSE": KEY_COMPOSE, 947 | "KEY_STOP": KEY_STOP, 948 | "KEY_AGAIN": KEY_AGAIN, 949 | "KEY_PROPS": KEY_PROPS, 950 | "KEY_UNDO": KEY_UNDO, 951 | "KEY_FRONT": KEY_FRONT, 952 | "KEY_COPY": KEY_COPY, 953 | "KEY_OPEN": KEY_OPEN, 954 | "KEY_PASTE": KEY_PASTE, 955 | "KEY_FIND": KEY_FIND, 956 | "KEY_CUT": KEY_CUT, 957 | "KEY_HELP": KEY_HELP, 958 | "KEY_MENU": KEY_MENU, 959 | "KEY_CALC": KEY_CALC, 960 | "KEY_SETUP": KEY_SETUP, 961 | "KEY_SLEEP": KEY_SLEEP, 962 | "KEY_WAKEUP": KEY_WAKEUP, 963 | "KEY_FILE": KEY_FILE, 964 | "KEY_SENDFILE": KEY_SENDFILE, 965 | "KEY_DELETEFILE": KEY_DELETEFILE, 966 | "KEY_XFER": KEY_XFER, 967 | "KEY_PROG1": KEY_PROG1, 968 | "KEY_PROG2": KEY_PROG2, 969 | "KEY_WWW": KEY_WWW, 970 | "KEY_MSDOS": KEY_MSDOS, 971 | "KEY_COFFEE": KEY_COFFEE, 972 | "KEY_SCREENLOCK": KEY_SCREENLOCK, 973 | "KEY_ROTATE_DISPLAY": KEY_ROTATE_DISPLAY, 974 | "KEY_DIRECTION": KEY_DIRECTION, 975 | "KEY_CYCLEWINDOWS": KEY_CYCLEWINDOWS, 976 | "KEY_MAIL": KEY_MAIL, 977 | "KEY_BOOKMARKS": KEY_BOOKMARKS, 978 | "KEY_COMPUTER": KEY_COMPUTER, 979 | "KEY_BACK": KEY_BACK, 980 | "KEY_FORWARD": KEY_FORWARD, 981 | "KEY_CLOSECD": KEY_CLOSECD, 982 | "KEY_EJECTCD": KEY_EJECTCD, 983 | "KEY_EJECTCLOSECD": KEY_EJECTCLOSECD, 984 | "KEY_NEXTSONG": KEY_NEXTSONG, 985 | "KEY_PLAYPAUSE": KEY_PLAYPAUSE, 986 | "KEY_PREVIOUSSONG": KEY_PREVIOUSSONG, 987 | "KEY_STOPCD": KEY_STOPCD, 988 | "KEY_RECORD": KEY_RECORD, 989 | "KEY_REWIND": KEY_REWIND, 990 | "KEY_PHONE": KEY_PHONE, 991 | "KEY_ISO": KEY_ISO, 992 | "KEY_CONFIG": KEY_CONFIG, 993 | "KEY_HOMEPAGE": KEY_HOMEPAGE, 994 | "KEY_REFRESH": KEY_REFRESH, 995 | "KEY_EXIT": KEY_EXIT, 996 | "KEY_MOVE": KEY_MOVE, 997 | "KEY_EDIT": KEY_EDIT, 998 | "KEY_SCROLLUP": KEY_SCROLLUP, 999 | "KEY_SCROLLDOWN": KEY_SCROLLDOWN, 1000 | "KEY_KPLEFTPAREN": KEY_KPLEFTPAREN, 1001 | "KEY_KPRIGHTPAREN": KEY_KPRIGHTPAREN, 1002 | "KEY_NEW": KEY_NEW, 1003 | "KEY_REDO": KEY_REDO, 1004 | "KEY_F13": KEY_F13, 1005 | "KEY_F14": KEY_F14, 1006 | "KEY_F15": KEY_F15, 1007 | "KEY_F16": KEY_F16, 1008 | "KEY_F17": KEY_F17, 1009 | "KEY_F18": KEY_F18, 1010 | "KEY_F19": KEY_F19, 1011 | "KEY_F20": KEY_F20, 1012 | "KEY_F21": KEY_F21, 1013 | "KEY_F22": KEY_F22, 1014 | "KEY_F23": KEY_F23, 1015 | "KEY_F24": KEY_F24, 1016 | "KEY_PLAYCD": KEY_PLAYCD, 1017 | "KEY_PAUSECD": KEY_PAUSECD, 1018 | "KEY_PROG3": KEY_PROG3, 1019 | "KEY_PROG4": KEY_PROG4, 1020 | "KEY_DASHBOARD": KEY_DASHBOARD, 1021 | "KEY_SUSPEND": KEY_SUSPEND, 1022 | "KEY_CLOSE": KEY_CLOSE, 1023 | "KEY_PLAY": KEY_PLAY, 1024 | "KEY_FASTFORWARD": KEY_FASTFORWARD, 1025 | "KEY_BASSBOOST": KEY_BASSBOOST, 1026 | "KEY_PRINT": KEY_PRINT, 1027 | "KEY_HP": KEY_HP, 1028 | "KEY_CAMERA": KEY_CAMERA, 1029 | "KEY_SOUND": KEY_SOUND, 1030 | "KEY_QUESTION": KEY_QUESTION, 1031 | "KEY_EMAIL": KEY_EMAIL, 1032 | "KEY_CHAT": KEY_CHAT, 1033 | "KEY_SEARCH": KEY_SEARCH, 1034 | "KEY_CONNECT": KEY_CONNECT, 1035 | "KEY_FINANCE": KEY_FINANCE, 1036 | "KEY_SPORT": KEY_SPORT, 1037 | "KEY_SHOP": KEY_SHOP, 1038 | "KEY_ALTERASE": KEY_ALTERASE, 1039 | "KEY_CANCEL": KEY_CANCEL, 1040 | "KEY_BRIGHTNESSDOWN": KEY_BRIGHTNESSDOWN, 1041 | "KEY_BRIGHTNESSUP": KEY_BRIGHTNESSUP, 1042 | "KEY_MEDIA": KEY_MEDIA, 1043 | "KEY_SWITCHVIDEOMODE": KEY_SWITCHVIDEOMODE, 1044 | "KEY_KBDILLUMTOGGLE": KEY_KBDILLUMTOGGLE, 1045 | "KEY_KBDILLUMDOWN": KEY_KBDILLUMDOWN, 1046 | "KEY_KBDILLUMUP": KEY_KBDILLUMUP, 1047 | "KEY_SEND": KEY_SEND, 1048 | "KEY_REPLY": KEY_REPLY, 1049 | "KEY_FORWARDMAIL": KEY_FORWARDMAIL, 1050 | "KEY_SAVE": KEY_SAVE, 1051 | "KEY_DOCUMENTS": KEY_DOCUMENTS, 1052 | "KEY_BATTERY": KEY_BATTERY, 1053 | "KEY_BLUETOOTH": KEY_BLUETOOTH, 1054 | "KEY_WLAN": KEY_WLAN, 1055 | "KEY_UWB": KEY_UWB, 1056 | "KEY_UNKNOWN": KEY_UNKNOWN, 1057 | "KEY_VIDEO_NEXT": KEY_VIDEO_NEXT, 1058 | "KEY_VIDEO_PREV": KEY_VIDEO_PREV, 1059 | "KEY_BRIGHTNESS_CYCLE": KEY_BRIGHTNESS_CYCLE, 1060 | "KEY_BRIGHTNESS_AUTO": KEY_BRIGHTNESS_AUTO, 1061 | "KEY_BRIGHTNESS_ZERO": KEY_BRIGHTNESS_ZERO, 1062 | "KEY_DISPLAY_OFF": KEY_DISPLAY_OFF, 1063 | "KEY_WWAN": KEY_WWAN, 1064 | "KEY_WIMAX": KEY_WIMAX, 1065 | "KEY_RFKILL": KEY_RFKILL, 1066 | "KEY_MICMUTE": KEY_MICMUTE, 1067 | "BTN_MISC": BTN_MISC, 1068 | "BTN_0": BTN_0, 1069 | "BTN_1": BTN_1, 1070 | "BTN_2": BTN_2, 1071 | "BTN_3": BTN_3, 1072 | "BTN_4": BTN_4, 1073 | "BTN_5": BTN_5, 1074 | "BTN_6": BTN_6, 1075 | "BTN_7": BTN_7, 1076 | "BTN_8": BTN_8, 1077 | "BTN_9": BTN_9, 1078 | "BTN_MOUSE": BTN_MOUSE, 1079 | "BTN_LEFT": BTN_LEFT, 1080 | "BTN_RIGHT": BTN_RIGHT, 1081 | "BTN_MIDDLE": BTN_MIDDLE, 1082 | "BTN_SIDE": BTN_SIDE, 1083 | "BTN_EXTRA": BTN_EXTRA, 1084 | "BTN_FORWARD": BTN_FORWARD, 1085 | "BTN_BACK": BTN_BACK, 1086 | "BTN_TASK": BTN_TASK, 1087 | "BTN_JOYSTICK": BTN_JOYSTICK, 1088 | "BTN_TRIGGER": BTN_TRIGGER, 1089 | "BTN_THUMB": BTN_THUMB, 1090 | "BTN_THUMB2": BTN_THUMB2, 1091 | "BTN_TOP": BTN_TOP, 1092 | "BTN_TOP2": BTN_TOP2, 1093 | "BTN_PINKIE": BTN_PINKIE, 1094 | "BTN_BASE": BTN_BASE, 1095 | "BTN_BASE2": BTN_BASE2, 1096 | "BTN_BASE3": BTN_BASE3, 1097 | "BTN_BASE4": BTN_BASE4, 1098 | "BTN_BASE5": BTN_BASE5, 1099 | "BTN_BASE6": BTN_BASE6, 1100 | "BTN_DEAD": BTN_DEAD, 1101 | "BTN_GAMEPAD": BTN_GAMEPAD, 1102 | "BTN_SOUTH": BTN_SOUTH, 1103 | "BTN_A": BTN_A, 1104 | "BTN_EAST": BTN_EAST, 1105 | "BTN_B": BTN_B, 1106 | "BTN_C": BTN_C, 1107 | "BTN_NORTH": BTN_NORTH, 1108 | "BTN_X": BTN_X, 1109 | "BTN_WEST": BTN_WEST, 1110 | "BTN_Y": BTN_Y, 1111 | "BTN_Z": BTN_Z, 1112 | "BTN_TL": BTN_TL, 1113 | "BTN_TR": BTN_TR, 1114 | "BTN_TL2": BTN_TL2, 1115 | "BTN_TR2": BTN_TR2, 1116 | "BTN_SELECT": BTN_SELECT, 1117 | "BTN_START": BTN_START, 1118 | "BTN_MODE": BTN_MODE, 1119 | "BTN_THUMBL": BTN_THUMBL, 1120 | "BTN_THUMBR": BTN_THUMBR, 1121 | "BTN_DIGI": BTN_DIGI, 1122 | "BTN_TOOL_PEN": BTN_TOOL_PEN, 1123 | "BTN_TOOL_RUBBER": BTN_TOOL_RUBBER, 1124 | "BTN_TOOL_BRUSH": BTN_TOOL_BRUSH, 1125 | "BTN_TOOL_PENCIL": BTN_TOOL_PENCIL, 1126 | "BTN_TOOL_AIRBRUSH": BTN_TOOL_AIRBRUSH, 1127 | "BTN_TOOL_FINGER": BTN_TOOL_FINGER, 1128 | "BTN_TOOL_MOUSE": BTN_TOOL_MOUSE, 1129 | "BTN_TOOL_LENS": BTN_TOOL_LENS, 1130 | "BTN_TOOL_QUINTTAP": BTN_TOOL_QUINTTAP, 1131 | "BTN_TOUCH": BTN_TOUCH, 1132 | "BTN_STYLUS": BTN_STYLUS, 1133 | "BTN_STYLUS2": BTN_STYLUS2, 1134 | "BTN_TOOL_DOUBLETAP": BTN_TOOL_DOUBLETAP, 1135 | "BTN_TOOL_TRIPLETAP": BTN_TOOL_TRIPLETAP, 1136 | "BTN_TOOL_QUADTAP": BTN_TOOL_QUADTAP, 1137 | "BTN_WHEEL": BTN_WHEEL, 1138 | "BTN_GEAR_DOWN": BTN_GEAR_DOWN, 1139 | "BTN_GEAR_UP": BTN_GEAR_UP, 1140 | "KEY_OK": KEY_OK, 1141 | "KEY_SELECT": KEY_SELECT, 1142 | "KEY_GOTO": KEY_GOTO, 1143 | "KEY_CLEAR": KEY_CLEAR, 1144 | "KEY_POWER2": KEY_POWER2, 1145 | "KEY_OPTION": KEY_OPTION, 1146 | "KEY_INFO": KEY_INFO, 1147 | "KEY_TIME": KEY_TIME, 1148 | "KEY_VENDOR": KEY_VENDOR, 1149 | "KEY_ARCHIVE": KEY_ARCHIVE, 1150 | "KEY_PROGRAM": KEY_PROGRAM, 1151 | "KEY_CHANNEL": KEY_CHANNEL, 1152 | "KEY_FAVORITES": KEY_FAVORITES, 1153 | "KEY_EPG": KEY_EPG, 1154 | "KEY_PVR": KEY_PVR, 1155 | "KEY_MHP": KEY_MHP, 1156 | "KEY_LANGUAGE": KEY_LANGUAGE, 1157 | "KEY_TITLE": KEY_TITLE, 1158 | "KEY_SUBTITLE": KEY_SUBTITLE, 1159 | "KEY_ANGLE": KEY_ANGLE, 1160 | "KEY_ZOOM": KEY_ZOOM, 1161 | "KEY_MODE": KEY_MODE, 1162 | "KEY_KEYBOARD": KEY_KEYBOARD, 1163 | "KEY_SCREEN": KEY_SCREEN, 1164 | "KEY_PC": KEY_PC, 1165 | "KEY_TV": KEY_TV, 1166 | "KEY_TV2": KEY_TV2, 1167 | "KEY_VCR": KEY_VCR, 1168 | "KEY_VCR2": KEY_VCR2, 1169 | "KEY_SAT": KEY_SAT, 1170 | "KEY_SAT2": KEY_SAT2, 1171 | "KEY_CD": KEY_CD, 1172 | "KEY_TAPE": KEY_TAPE, 1173 | "KEY_RADIO": KEY_RADIO, 1174 | "KEY_TUNER": KEY_TUNER, 1175 | "KEY_PLAYER": KEY_PLAYER, 1176 | "KEY_TEXT": KEY_TEXT, 1177 | "KEY_DVD": KEY_DVD, 1178 | "KEY_AUX": KEY_AUX, 1179 | "KEY_MP3": KEY_MP3, 1180 | "KEY_AUDIO": KEY_AUDIO, 1181 | "KEY_VIDEO": KEY_VIDEO, 1182 | "KEY_DIRECTORY": KEY_DIRECTORY, 1183 | "KEY_LIST": KEY_LIST, 1184 | "KEY_MEMO": KEY_MEMO, 1185 | "KEY_CALENDAR": KEY_CALENDAR, 1186 | "KEY_RED": KEY_RED, 1187 | "KEY_GREEN": KEY_GREEN, 1188 | "KEY_YELLOW": KEY_YELLOW, 1189 | "KEY_BLUE": KEY_BLUE, 1190 | "KEY_CHANNELUP": KEY_CHANNELUP, 1191 | "KEY_CHANNELDOWN": KEY_CHANNELDOWN, 1192 | "KEY_FIRST": KEY_FIRST, 1193 | "KEY_LAST": KEY_LAST, 1194 | "KEY_AB": KEY_AB, 1195 | "KEY_NEXT": KEY_NEXT, 1196 | "KEY_RESTART": KEY_RESTART, 1197 | "KEY_SLOW": KEY_SLOW, 1198 | "KEY_SHUFFLE": KEY_SHUFFLE, 1199 | "KEY_BREAK": KEY_BREAK, 1200 | "KEY_PREVIOUS": KEY_PREVIOUS, 1201 | "KEY_DIGITS": KEY_DIGITS, 1202 | "KEY_TEEN": KEY_TEEN, 1203 | "KEY_TWEN": KEY_TWEN, 1204 | "KEY_VIDEOPHONE": KEY_VIDEOPHONE, 1205 | "KEY_GAMES": KEY_GAMES, 1206 | "KEY_ZOOMIN": KEY_ZOOMIN, 1207 | "KEY_ZOOMOUT": KEY_ZOOMOUT, 1208 | "KEY_ZOOMRESET": KEY_ZOOMRESET, 1209 | "KEY_WORDPROCESSOR": KEY_WORDPROCESSOR, 1210 | "KEY_EDITOR": KEY_EDITOR, 1211 | "KEY_SPREADSHEET": KEY_SPREADSHEET, 1212 | "KEY_GRAPHICSEDITOR": KEY_GRAPHICSEDITOR, 1213 | "KEY_PRESENTATION": KEY_PRESENTATION, 1214 | "KEY_DATABASE": KEY_DATABASE, 1215 | "KEY_NEWS": KEY_NEWS, 1216 | "KEY_VOICEMAIL": KEY_VOICEMAIL, 1217 | "KEY_ADDRESSBOOK": KEY_ADDRESSBOOK, 1218 | "KEY_MESSENGER": KEY_MESSENGER, 1219 | "KEY_DISPLAYTOGGLE": KEY_DISPLAYTOGGLE, 1220 | "KEY_BRIGHTNESS_TOGGLE": KEY_BRIGHTNESS_TOGGLE, 1221 | "KEY_SPELLCHECK": KEY_SPELLCHECK, 1222 | "KEY_LOGOFF": KEY_LOGOFF, 1223 | "KEY_DOLLAR": KEY_DOLLAR, 1224 | "KEY_EURO": KEY_EURO, 1225 | "KEY_FRAMEBACK": KEY_FRAMEBACK, 1226 | "KEY_FRAMEFORWARD": KEY_FRAMEFORWARD, 1227 | "KEY_CONTEXT_MENU": KEY_CONTEXT_MENU, 1228 | "KEY_MEDIA_REPEAT": KEY_MEDIA_REPEAT, 1229 | "KEY_10CHANNELSUP": KEY_10CHANNELSUP, 1230 | "KEY_10CHANNELSDOWN": KEY_10CHANNELSDOWN, 1231 | "KEY_IMAGES": KEY_IMAGES, 1232 | "KEY_DEL_EOL": KEY_DEL_EOL, 1233 | "KEY_DEL_EOS": KEY_DEL_EOS, 1234 | "KEY_INS_LINE": KEY_INS_LINE, 1235 | "KEY_DEL_LINE": KEY_DEL_LINE, 1236 | "KEY_FN": KEY_FN, 1237 | "KEY_FN_ESC": KEY_FN_ESC, 1238 | "KEY_FN_F1": KEY_FN_F1, 1239 | "KEY_FN_F2": KEY_FN_F2, 1240 | "KEY_FN_F3": KEY_FN_F3, 1241 | "KEY_FN_F4": KEY_FN_F4, 1242 | "KEY_FN_F5": KEY_FN_F5, 1243 | "KEY_FN_F6": KEY_FN_F6, 1244 | "KEY_FN_F7": KEY_FN_F7, 1245 | "KEY_FN_F8": KEY_FN_F8, 1246 | "KEY_FN_F9": KEY_FN_F9, 1247 | "KEY_FN_F10": KEY_FN_F10, 1248 | "KEY_FN_F11": KEY_FN_F11, 1249 | "KEY_FN_F12": KEY_FN_F12, 1250 | "KEY_FN_1": KEY_FN_1, 1251 | "KEY_FN_2": KEY_FN_2, 1252 | "KEY_FN_D": KEY_FN_D, 1253 | "KEY_FN_E": KEY_FN_E, 1254 | "KEY_FN_F": KEY_FN_F, 1255 | "KEY_FN_S": KEY_FN_S, 1256 | "KEY_FN_B": KEY_FN_B, 1257 | "KEY_BRL_DOT1": KEY_BRL_DOT1, 1258 | "KEY_BRL_DOT2": KEY_BRL_DOT2, 1259 | "KEY_BRL_DOT3": KEY_BRL_DOT3, 1260 | "KEY_BRL_DOT4": KEY_BRL_DOT4, 1261 | "KEY_BRL_DOT5": KEY_BRL_DOT5, 1262 | "KEY_BRL_DOT6": KEY_BRL_DOT6, 1263 | "KEY_BRL_DOT7": KEY_BRL_DOT7, 1264 | "KEY_BRL_DOT8": KEY_BRL_DOT8, 1265 | "KEY_BRL_DOT9": KEY_BRL_DOT9, 1266 | "KEY_BRL_DOT10": KEY_BRL_DOT10, 1267 | "KEY_NUMERIC_0": KEY_NUMERIC_0, 1268 | "KEY_NUMERIC_1": KEY_NUMERIC_1, 1269 | "KEY_NUMERIC_2": KEY_NUMERIC_2, 1270 | "KEY_NUMERIC_3": KEY_NUMERIC_3, 1271 | "KEY_NUMERIC_4": KEY_NUMERIC_4, 1272 | "KEY_NUMERIC_5": KEY_NUMERIC_5, 1273 | "KEY_NUMERIC_6": KEY_NUMERIC_6, 1274 | "KEY_NUMERIC_7": KEY_NUMERIC_7, 1275 | "KEY_NUMERIC_8": KEY_NUMERIC_8, 1276 | "KEY_NUMERIC_9": KEY_NUMERIC_9, 1277 | "KEY_NUMERIC_STAR": KEY_NUMERIC_STAR, 1278 | "KEY_NUMERIC_POUND": KEY_NUMERIC_POUND, 1279 | "KEY_NUMERIC_A": KEY_NUMERIC_A, 1280 | "KEY_NUMERIC_B": KEY_NUMERIC_B, 1281 | "KEY_NUMERIC_C": KEY_NUMERIC_C, 1282 | "KEY_NUMERIC_D": KEY_NUMERIC_D, 1283 | "KEY_CAMERA_FOCUS": KEY_CAMERA_FOCUS, 1284 | "KEY_WPS_BUTTON": KEY_WPS_BUTTON, 1285 | "KEY_TOUCHPAD_TOGGLE": KEY_TOUCHPAD_TOGGLE, 1286 | "KEY_TOUCHPAD_ON": KEY_TOUCHPAD_ON, 1287 | "KEY_TOUCHPAD_OFF": KEY_TOUCHPAD_OFF, 1288 | "KEY_CAMERA_ZOOMIN": KEY_CAMERA_ZOOMIN, 1289 | "KEY_CAMERA_ZOOMOUT": KEY_CAMERA_ZOOMOUT, 1290 | "KEY_CAMERA_UP": KEY_CAMERA_UP, 1291 | "KEY_CAMERA_DOWN": KEY_CAMERA_DOWN, 1292 | "KEY_CAMERA_LEFT": KEY_CAMERA_LEFT, 1293 | "KEY_CAMERA_RIGHT": KEY_CAMERA_RIGHT, 1294 | "KEY_ATTENDANT_ON": KEY_ATTENDANT_ON, 1295 | "KEY_ATTENDANT_OFF": KEY_ATTENDANT_OFF, 1296 | "KEY_ATTENDANT_TOGGLE": KEY_ATTENDANT_TOGGLE, 1297 | "KEY_LIGHTS_TOGGLE": KEY_LIGHTS_TOGGLE, 1298 | "BTN_DPAD_UP": BTN_DPAD_UP, 1299 | "BTN_DPAD_DOWN": BTN_DPAD_DOWN, 1300 | "BTN_DPAD_LEFT": BTN_DPAD_LEFT, 1301 | "BTN_DPAD_RIGHT": BTN_DPAD_RIGHT, 1302 | "KEY_ALS_TOGGLE": KEY_ALS_TOGGLE, 1303 | "KEY_BUTTONCONFIG": KEY_BUTTONCONFIG, 1304 | "KEY_TASKMANAGER": KEY_TASKMANAGER, 1305 | "KEY_JOURNAL": KEY_JOURNAL, 1306 | "KEY_CONTROLPANEL": KEY_CONTROLPANEL, 1307 | "KEY_APPSELECT": KEY_APPSELECT, 1308 | "KEY_SCREENSAVER": KEY_SCREENSAVER, 1309 | "KEY_VOICECOMMAND": KEY_VOICECOMMAND, 1310 | "KEY_BRIGHTNESS_MIN": KEY_BRIGHTNESS_MIN, 1311 | "KEY_BRIGHTNESS_MAX": KEY_BRIGHTNESS_MAX, 1312 | "KEY_KBDINPUTASSIST_PREV": KEY_KBDINPUTASSIST_PREV, 1313 | "KEY_KBDINPUTASSIST_NEXT": KEY_KBDINPUTASSIST_NEXT, 1314 | "KEY_KBDINPUTASSIST_PREVGROUP": KEY_KBDINPUTASSIST_PREVGROUP, 1315 | "KEY_KBDINPUTASSIST_NEXTGROUP": KEY_KBDINPUTASSIST_NEXTGROUP, 1316 | "KEY_KBDINPUTASSIST_ACCEPT": KEY_KBDINPUTASSIST_ACCEPT, 1317 | "KEY_KBDINPUTASSIST_CANCEL": KEY_KBDINPUTASSIST_CANCEL, 1318 | "KEY_RIGHT_UP": KEY_RIGHT_UP, 1319 | "KEY_RIGHT_DOWN": KEY_RIGHT_DOWN, 1320 | "KEY_LEFT_UP": KEY_LEFT_UP, 1321 | "KEY_LEFT_DOWN": KEY_LEFT_DOWN, 1322 | "KEY_ROOT_MENU": KEY_ROOT_MENU, 1323 | "KEY_MEDIA_TOP_MENU": KEY_MEDIA_TOP_MENU, 1324 | "KEY_NUMERIC_11": KEY_NUMERIC_11, 1325 | "KEY_NUMERIC_12": KEY_NUMERIC_12, 1326 | "KEY_AUDIO_DESC": KEY_AUDIO_DESC, 1327 | "KEY_3D_MODE": KEY_3D_MODE, 1328 | "KEY_NEXT_FAVORITE": KEY_NEXT_FAVORITE, 1329 | "KEY_STOP_RECORD": KEY_STOP_RECORD, 1330 | "KEY_PAUSE_RECORD": KEY_PAUSE_RECORD, 1331 | "KEY_VOD": KEY_VOD, 1332 | "KEY_UNMUTE": KEY_UNMUTE, 1333 | "KEY_FASTREVERSE": KEY_FASTREVERSE, 1334 | "KEY_SLOWREVERSE": KEY_SLOWREVERSE, 1335 | "KEY_DATA": KEY_DATA, 1336 | "BTN_TRIGGER_HAPPY": BTN_TRIGGER_HAPPY, 1337 | "BTN_TRIGGER_HAPPY1": BTN_TRIGGER_HAPPY1, 1338 | "BTN_TRIGGER_HAPPY2": BTN_TRIGGER_HAPPY2, 1339 | "BTN_TRIGGER_HAPPY3": BTN_TRIGGER_HAPPY3, 1340 | "BTN_TRIGGER_HAPPY4": BTN_TRIGGER_HAPPY4, 1341 | "BTN_TRIGGER_HAPPY5": BTN_TRIGGER_HAPPY5, 1342 | "BTN_TRIGGER_HAPPY6": BTN_TRIGGER_HAPPY6, 1343 | "BTN_TRIGGER_HAPPY7": BTN_TRIGGER_HAPPY7, 1344 | "BTN_TRIGGER_HAPPY8": BTN_TRIGGER_HAPPY8, 1345 | "BTN_TRIGGER_HAPPY9": BTN_TRIGGER_HAPPY9, 1346 | "BTN_TRIGGER_HAPPY10": BTN_TRIGGER_HAPPY10, 1347 | "BTN_TRIGGER_HAPPY11": BTN_TRIGGER_HAPPY11, 1348 | "BTN_TRIGGER_HAPPY12": BTN_TRIGGER_HAPPY12, 1349 | "BTN_TRIGGER_HAPPY13": BTN_TRIGGER_HAPPY13, 1350 | "BTN_TRIGGER_HAPPY14": BTN_TRIGGER_HAPPY14, 1351 | "BTN_TRIGGER_HAPPY15": BTN_TRIGGER_HAPPY15, 1352 | "BTN_TRIGGER_HAPPY16": BTN_TRIGGER_HAPPY16, 1353 | "BTN_TRIGGER_HAPPY17": BTN_TRIGGER_HAPPY17, 1354 | "BTN_TRIGGER_HAPPY18": BTN_TRIGGER_HAPPY18, 1355 | "BTN_TRIGGER_HAPPY19": BTN_TRIGGER_HAPPY19, 1356 | "BTN_TRIGGER_HAPPY20": BTN_TRIGGER_HAPPY20, 1357 | "BTN_TRIGGER_HAPPY21": BTN_TRIGGER_HAPPY21, 1358 | "BTN_TRIGGER_HAPPY22": BTN_TRIGGER_HAPPY22, 1359 | "BTN_TRIGGER_HAPPY23": BTN_TRIGGER_HAPPY23, 1360 | "BTN_TRIGGER_HAPPY24": BTN_TRIGGER_HAPPY24, 1361 | "BTN_TRIGGER_HAPPY25": BTN_TRIGGER_HAPPY25, 1362 | "BTN_TRIGGER_HAPPY26": BTN_TRIGGER_HAPPY26, 1363 | "BTN_TRIGGER_HAPPY27": BTN_TRIGGER_HAPPY27, 1364 | "BTN_TRIGGER_HAPPY28": BTN_TRIGGER_HAPPY28, 1365 | "BTN_TRIGGER_HAPPY29": BTN_TRIGGER_HAPPY29, 1366 | "BTN_TRIGGER_HAPPY30": BTN_TRIGGER_HAPPY30, 1367 | "BTN_TRIGGER_HAPPY31": BTN_TRIGGER_HAPPY31, 1368 | "BTN_TRIGGER_HAPPY32": BTN_TRIGGER_HAPPY32, 1369 | "BTN_TRIGGER_HAPPY33": BTN_TRIGGER_HAPPY33, 1370 | "BTN_TRIGGER_HAPPY34": BTN_TRIGGER_HAPPY34, 1371 | "BTN_TRIGGER_HAPPY35": BTN_TRIGGER_HAPPY35, 1372 | "BTN_TRIGGER_HAPPY36": BTN_TRIGGER_HAPPY36, 1373 | "BTN_TRIGGER_HAPPY37": BTN_TRIGGER_HAPPY37, 1374 | "BTN_TRIGGER_HAPPY38": BTN_TRIGGER_HAPPY38, 1375 | "BTN_TRIGGER_HAPPY39": BTN_TRIGGER_HAPPY39, 1376 | "BTN_TRIGGER_HAPPY40": BTN_TRIGGER_HAPPY40, 1377 | "KEY_MIN_INTERESTING": KEY_MIN_INTERESTING, 1378 | "KEY_MAX": KEY_MAX, 1379 | "REL_X": REL_X, 1380 | "REL_Y": REL_Y, 1381 | "REL_Z": REL_Z, 1382 | "REL_RX": REL_RX, 1383 | "REL_RY": REL_RY, 1384 | "REL_RZ": REL_RZ, 1385 | "REL_HWHEEL": REL_HWHEEL, 1386 | "REL_DIAL": REL_DIAL, 1387 | "REL_WHEEL": REL_WHEEL, 1388 | "REL_MISC": REL_MISC, 1389 | "REL_MAX": REL_MAX, 1390 | "ABS_X": ABS_X, 1391 | "ABS_Y": ABS_Y, 1392 | "ABS_Z": ABS_Z, 1393 | "ABS_RX": ABS_RX, 1394 | "ABS_RY": ABS_RY, 1395 | "ABS_RZ": ABS_RZ, 1396 | "ABS_THROTTLE": ABS_THROTTLE, 1397 | "ABS_RUDDER": ABS_RUDDER, 1398 | "ABS_WHEEL": ABS_WHEEL, 1399 | "ABS_GAS": ABS_GAS, 1400 | "ABS_BRAKE": ABS_BRAKE, 1401 | "ABS_HAT0X": ABS_HAT0X, 1402 | "ABS_HAT0Y": ABS_HAT0Y, 1403 | "ABS_HAT1X": ABS_HAT1X, 1404 | "ABS_HAT1Y": ABS_HAT1Y, 1405 | "ABS_HAT2X": ABS_HAT2X, 1406 | "ABS_HAT2Y": ABS_HAT2Y, 1407 | "ABS_HAT3X": ABS_HAT3X, 1408 | "ABS_HAT3Y": ABS_HAT3Y, 1409 | "ABS_PRESSURE": ABS_PRESSURE, 1410 | "ABS_DISTANCE": ABS_DISTANCE, 1411 | "ABS_TILT_X": ABS_TILT_X, 1412 | "ABS_TILT_Y": ABS_TILT_Y, 1413 | "ABS_TOOL_WIDTH": ABS_TOOL_WIDTH, 1414 | "ABS_VOLUME": ABS_VOLUME, 1415 | "ABS_MISC": ABS_MISC, 1416 | "ABS_MT_SLOT": ABS_MT_SLOT, 1417 | "ABS_MT_TOUCH_MAJOR": ABS_MT_TOUCH_MAJOR, 1418 | "ABS_MT_TOUCH_MINOR": ABS_MT_TOUCH_MINOR, 1419 | "ABS_MT_WIDTH_MAJOR": ABS_MT_WIDTH_MAJOR, 1420 | "ABS_MT_WIDTH_MINOR": ABS_MT_WIDTH_MINOR, 1421 | "ABS_MT_ORIENTATION": ABS_MT_ORIENTATION, 1422 | "ABS_MT_POSITION_X": ABS_MT_POSITION_X, 1423 | "ABS_MT_POSITION_Y": ABS_MT_POSITION_Y, 1424 | "ABS_MT_TOOL_TYPE": ABS_MT_TOOL_TYPE, 1425 | "ABS_MT_BLOB_ID": ABS_MT_BLOB_ID, 1426 | "ABS_MT_TRACKING_ID": ABS_MT_TRACKING_ID, 1427 | "ABS_MT_PRESSURE": ABS_MT_PRESSURE, 1428 | "ABS_MT_DISTANCE": ABS_MT_DISTANCE, 1429 | "ABS_MT_TOOL_X": ABS_MT_TOOL_X, 1430 | "ABS_MT_TOOL_Y": ABS_MT_TOOL_Y, 1431 | "ABS_MAX": ABS_MAX, 1432 | "SW_LID": SW_LID, 1433 | "SW_TABLET_MODE": SW_TABLET_MODE, 1434 | "SW_HEADPHONE_INSERT": SW_HEADPHONE_INSERT, 1435 | "SW_RFKILL_ALL": SW_RFKILL_ALL, 1436 | "SW_RADIO": SW_RADIO, 1437 | "SW_MICROPHONE_INSERT": SW_MICROPHONE_INSERT, 1438 | "SW_DOCK": SW_DOCK, 1439 | "SW_LINEOUT_INSERT": SW_LINEOUT_INSERT, 1440 | "SW_JACK_PHYSICAL_INSERT": SW_JACK_PHYSICAL_INSERT, 1441 | "SW_VIDEOOUT_INSERT": SW_VIDEOOUT_INSERT, 1442 | "SW_CAMERA_LENS_COVER": SW_CAMERA_LENS_COVER, 1443 | "SW_KEYPAD_SLIDE": SW_KEYPAD_SLIDE, 1444 | "SW_FRONT_PROXIMITY": SW_FRONT_PROXIMITY, 1445 | "SW_ROTATE_LOCK": SW_ROTATE_LOCK, 1446 | "SW_LINEIN_INSERT": SW_LINEIN_INSERT, 1447 | "SW_MUTE_DEVICE": SW_MUTE_DEVICE, 1448 | "SW_PEN_INSERTED": SW_PEN_INSERTED, 1449 | "SW_MAX": SW_MAX, 1450 | "MSC_SERIAL": MSC_SERIAL, 1451 | "MSC_PULSELED": MSC_PULSELED, 1452 | "MSC_GESTURE": MSC_GESTURE, 1453 | "MSC_RAW": MSC_RAW, 1454 | "MSC_SCAN": MSC_SCAN, 1455 | "MSC_TIMESTAMP": MSC_TIMESTAMP, 1456 | "MSC_MAX": MSC_MAX, 1457 | "LED_NUML": LED_NUML, 1458 | "LED_CAPSL": LED_CAPSL, 1459 | "LED_SCROLLL": LED_SCROLLL, 1460 | "LED_COMPOSE": LED_COMPOSE, 1461 | "LED_KANA": LED_KANA, 1462 | "LED_SLEEP": LED_SLEEP, 1463 | "LED_SUSPEND": LED_SUSPEND, 1464 | "LED_MUTE": LED_MUTE, 1465 | "LED_MISC": LED_MISC, 1466 | "LED_MAIL": LED_MAIL, 1467 | "LED_CHARGING": LED_CHARGING, 1468 | "LED_MAX": LED_MAX, 1469 | "REP_DELAY": REP_DELAY, 1470 | "REP_PERIOD": REP_PERIOD, 1471 | "REP_MAX": REP_MAX, 1472 | "SND_CLICK": SND_CLICK, 1473 | "SND_BELL": SND_BELL, 1474 | "SND_TONE": SND_TONE, 1475 | "SND_MAX": SND_MAX, 1476 | } 1477 | 1478 | var KEY = map[int]string{} 1479 | var ABS = map[int]string{} 1480 | var REL = map[int]string{} 1481 | var SW = map[int]string{} 1482 | var MSC = map[int]string{} 1483 | var LED = map[int]string{} 1484 | var BTN = map[int]string{} 1485 | var REP = map[int]string{} 1486 | var SND = map[int]string{} 1487 | var ID = map[int]string{} 1488 | var EV = map[int]string{} 1489 | var BUS = map[int]string{} 1490 | var SYN = map[int]string{} 1491 | var FF = map[int]string{} 1492 | 1493 | var ByEventType = map[int]map[int]string{ 1494 | EV_KEY: KEY, 1495 | EV_ABS: ABS, 1496 | EV_REL: REL, 1497 | EV_SW: SW, 1498 | EV_MSC: MSC, 1499 | EV_LED: LED, 1500 | EV_REP: REP, 1501 | EV_SND: SND, 1502 | EV_SYN: SYN, 1503 | EV_FF: FF, 1504 | } 1505 | 1506 | func init() { 1507 | for code, value := range ecodes { 1508 | switch { 1509 | case strings.HasPrefix(code, "KEY"): 1510 | KEY[value] = code 1511 | case strings.HasPrefix(code, "ABS"): 1512 | ABS[value] = code 1513 | case strings.HasPrefix(code, "REL"): 1514 | REL[value] = code 1515 | case strings.HasPrefix(code, "SW"): 1516 | SW[value] = code 1517 | case strings.HasPrefix(code, "MSC"): 1518 | MSC[value] = code 1519 | case strings.HasPrefix(code, "LED"): 1520 | LED[value] = code 1521 | case strings.HasPrefix(code, "BTN"): 1522 | BTN[value] = code 1523 | case strings.HasPrefix(code, "SND"): 1524 | SND[value] = code 1525 | case strings.HasPrefix(code, "ID"): 1526 | ID[value] = code 1527 | case strings.HasPrefix(code, "EV"): 1528 | EV[value] = code 1529 | case strings.HasPrefix(code, "BUS"): 1530 | BUS[value] = code 1531 | case strings.HasPrefix(code, "SYN"): 1532 | SYN[value] = code 1533 | case strings.HasPrefix(code, "FF"): 1534 | FF[value] = code 1535 | } 1536 | } 1537 | } 1538 | -------------------------------------------------------------------------------- /ecodes.go.template: -------------------------------------------------------------------------------- 1 | // -*- mode: go; -*- 2 | 3 | // Integer constants defined in linux/input.h and linux/input-event-codes.h can be accessed 4 | // directly as constants or through the provided reverse and forward mappings: 5 | 6 | // 7 | // evdev.KEY_A // 30 8 | // evdev.ecodes["KEY_A"] // 30 9 | // evdev.KEY[30] // "KEY_A" 10 | // evdev.REL[0] // "REL_X" 11 | // evdev.EV[evdev.EV_KEY] // "EV_KEY" 12 | // evdev.ByEventType[EV_REL][0] // "REL_X" 13 | // 14 | // Generated on: ${UNAME} 15 | 16 | package evdev 17 | 18 | import "strings" 19 | 20 | const ( 21 | ${CODES} 22 | ) 23 | 24 | var ecodes = map[string] int { 25 | ${CODEMAP} 26 | } 27 | 28 | 29 | var KEY = map[int]string {} 30 | var ABS = map[int]string {} 31 | var REL = map[int]string {} 32 | var SW = map[int]string {} 33 | var MSC = map[int]string {} 34 | var LED = map[int]string {} 35 | var BTN = map[int]string {} 36 | var REP = map[int]string {} 37 | var SND = map[int]string {} 38 | var ID = map[int]string {} 39 | var EV = map[int]string {} 40 | var BUS = map[int]string {} 41 | var SYN = map[int]string {} 42 | var FF = map[int]string {} 43 | 44 | var ByEventType = map[int] map[int]string { 45 | EV_KEY: KEY, 46 | EV_ABS: ABS, 47 | EV_REL: REL, 48 | EV_SW: SW, 49 | EV_MSC: MSC, 50 | EV_LED: LED, 51 | EV_REP: REP, 52 | EV_SND: SND, 53 | EV_SYN: SYN, 54 | EV_FF: FF, 55 | } 56 | 57 | func init() { 58 | for code, value := range ecodes { 59 | switch { 60 | case strings.HasPrefix(code, "KEY"): 61 | KEY[value] = code 62 | case strings.HasPrefix(code, "ABS"): 63 | ABS[value] = code 64 | case strings.HasPrefix(code, "REL"): 65 | REL[value] = code 66 | case strings.HasPrefix(code, "SW"): 67 | SW[value] = code 68 | case strings.HasPrefix(code, "MSC"): 69 | MSC[value] = code 70 | case strings.HasPrefix(code, "LED"): 71 | LED[value] = code 72 | case strings.HasPrefix(code, "BTN"): 73 | BTN[value] = code 74 | case strings.HasPrefix(code, "SND"): 75 | SND[value] = code 76 | case strings.HasPrefix(code, "ID"): 77 | ID[value] = code 78 | case strings.HasPrefix(code, "EV"): 79 | EV[value] = code 80 | case strings.HasPrefix(code, "BUS"): 81 | BUS[value] = code 82 | case strings.HasPrefix(code, "SYN"): 83 | SYN[value] = code 84 | case strings.HasPrefix(code, "FF"): 85 | FF[value] = code 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /evdev_test.go: -------------------------------------------------------------------------------- 1 | package evdev 2 | 3 | import "testing" 4 | 5 | func TestAccess(t *testing.T) { 6 | if KEY_A != ecodes["KEY_A"] { 7 | t.Error() 8 | } 9 | 10 | if KEY[ecodes["KEY_A"]] != "KEY_A" { 11 | t.Error() 12 | } 13 | 14 | if REL[0] != "REL_X" { 15 | t.Error() 16 | } 17 | 18 | if ByEventType[EV_KEY][ecodes["KEY_A"]] != "KEY_A" { 19 | t.Error() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /events.go: -------------------------------------------------------------------------------- 1 | package evdev 2 | 3 | import ( 4 | "fmt" 5 | "syscall" 6 | "unsafe" 7 | ) 8 | 9 | type InputEvent struct { 10 | Time syscall.Timeval // time in seconds since epoch at which event occurred 11 | Type uint16 // event type - one of ecodes.EV_* 12 | Code uint16 // event code related to the event type 13 | Value int32 // event value related to the event type 14 | } 15 | 16 | // Get a useful description for an input event. Example: 17 | // event at 1347905437.435795, code 01, type 02, val 02 18 | func (ev *InputEvent) String() string { 19 | return fmt.Sprintf("event at %d.%d, code %02d, type %02d, val %02d", 20 | ev.Time.Sec, ev.Time.Usec, ev.Code, ev.Type, ev.Value) 21 | } 22 | 23 | var eventsize = int(unsafe.Sizeof(InputEvent{})) 24 | 25 | type KeyEventState uint8 26 | 27 | const ( 28 | KeyUp KeyEventState = 0x0 29 | KeyDown KeyEventState = 0x1 30 | KeyHold KeyEventState = 0x2 31 | ) 32 | 33 | // KeyEvents are used to describe state changes of keyboards, buttons, 34 | // or other key-like devices. 35 | type KeyEvent struct { 36 | Event *InputEvent 37 | Scancode uint16 38 | Keycode uint16 39 | State KeyEventState 40 | } 41 | 42 | func (kev *KeyEvent) New(ev *InputEvent) { 43 | kev.Event = ev 44 | kev.Keycode = 0 // :todo 45 | kev.Scancode = ev.Code 46 | 47 | switch ev.Value { 48 | case 0: 49 | kev.State = KeyUp 50 | case 2: 51 | kev.State = KeyHold 52 | case 1: 53 | kev.State = KeyDown 54 | } 55 | } 56 | 57 | func NewKeyEvent(ev *InputEvent) *KeyEvent { 58 | kev := &KeyEvent{} 59 | kev.New(ev) 60 | return kev 61 | } 62 | 63 | func (ev *KeyEvent) String() string { 64 | state := "unknown" 65 | 66 | switch ev.State { 67 | case KeyUp: 68 | state = "up" 69 | case KeyHold: 70 | state = "hold" 71 | case KeyDown: 72 | state = "down" 73 | } 74 | 75 | return fmt.Sprintf("key event at %d.%d, %d (%d), (%s)", 76 | ev.Event.Time.Sec, ev.Event.Time.Usec, 77 | ev.Scancode, ev.Event.Code, state) 78 | } 79 | 80 | // RelEvents are used to describe relative axis value changes, 81 | // e.g. moving the mouse 5 units to the left. 82 | type RelEvent struct { 83 | Event *InputEvent 84 | } 85 | 86 | func (rev *RelEvent) New(ev *InputEvent) { 87 | rev.Event = ev 88 | } 89 | 90 | func NewRelEvent(ev *InputEvent) *RelEvent { 91 | rev := &RelEvent{} 92 | rev.New(ev) 93 | return rev 94 | } 95 | 96 | func (ev *RelEvent) String() string { 97 | return fmt.Sprintf("relative axis event at %d.%d, %s", 98 | ev.Event.Time.Sec, ev.Event.Time.Usec, 99 | REL[int(ev.Event.Code)]) 100 | } 101 | 102 | // TODO: Make this work 103 | 104 | var EventFactory map[uint16]interface{} = make(map[uint16]interface{}) 105 | 106 | func init() { 107 | EventFactory[uint16(EV_KEY)] = NewKeyEvent 108 | EventFactory[uint16(EV_REL)] = NewRelEvent 109 | } 110 | -------------------------------------------------------------------------------- /example_test.go: -------------------------------------------------------------------------------- 1 | package evdev_test 2 | 3 | import ( 4 | . "evdev" 5 | "fmt" 6 | ) 7 | 8 | func ExampleOpen() { 9 | device, _ := Open("/dev/input/event3") 10 | fmt.Println(device) 11 | } 12 | 13 | // Listing accessible input devices. 14 | func ExampleListInputDevices() { 15 | devices, _ := evdev.ListInputDevices() 16 | 17 | for _, dev := range devices { 18 | fmt.Printf("%s %s %s", dev.Fn, dev.Name, dev.Phys) 19 | } 20 | } 21 | 22 | func Example() { 23 | device, _ := Open("/dev/input/event3") 24 | 25 | fmt.Println(device) 26 | // InputDevice /dev/input/event3 (fd 3) 27 | // name Logitech USB Laser Mouse 28 | // phys usb-0000:00:12.0-2/input0 29 | // bus 0x0003, vendor 0x046d, product 0xc069, version 0x110 30 | // events EV_KEY 1, EV_SYN 0, EV_REL 2, EV_MSC 4 31 | 32 | fmt.Println(device.Capabilities) 33 | // map[ 4:[4 272 273 274 275 276 277 278 279] 34 | // 0:[0 1 2 4] 35 | // 2:[0 1 6 8 272 273 274 275 276 277 278 279] 36 | // 1:[272 273 274 275 276 277 278 279] ] 37 | 38 | fmt.Println(device.ResolveCapabilities()) 39 | // map[ 4:[4 272 273 274 275 276 277 278 279] 40 | // 0:[0 1 2 4] 41 | // 2:[0 1 6 8 272 273 274 275 276 277 278 279] 42 | // 1:[272 273 274 275 276 277 278 279] ] 43 | } 44 | --------------------------------------------------------------------------------