kopia lustrzana https://github.com/abourget/shuttle-go
110 wiersze
2.3 KiB
Go
110 wiersze
2.3 KiB
Go
package evdev
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
type InputEvent struct {
|
|
Time syscall.Timeval // time in seconds since epoch at which event occurred
|
|
Type uint16 // event type - one of ecodes.EV_*
|
|
Code uint16 // event code related to the event type
|
|
Value int32 // event value related to the event type
|
|
}
|
|
|
|
// Get a useful description for an input event. Example:
|
|
// event at 1347905437.435795, code 01, type 02, val 02
|
|
func (ev *InputEvent) String() string {
|
|
return fmt.Sprintf("event at %d.%d, code %02d, type %02d, val %02d",
|
|
ev.Time.Sec, ev.Time.Usec, ev.Code, ev.Type, ev.Value)
|
|
}
|
|
|
|
var eventsize = int(unsafe.Sizeof(InputEvent{}))
|
|
|
|
type KeyEventState uint8
|
|
|
|
const (
|
|
KeyUp KeyEventState = 0x0
|
|
KeyDown KeyEventState = 0x1
|
|
KeyHold KeyEventState = 0x2
|
|
)
|
|
|
|
// KeyEvents are used to describe state changes of keyboards, buttons,
|
|
// or other key-like devices.
|
|
type KeyEvent struct {
|
|
Event *InputEvent
|
|
Scancode uint16
|
|
Keycode uint16
|
|
State KeyEventState
|
|
}
|
|
|
|
func (kev *KeyEvent) New(ev *InputEvent) {
|
|
kev.Event = ev
|
|
kev.Keycode = 0 // :todo
|
|
kev.Scancode = ev.Code
|
|
|
|
switch ev.Value {
|
|
case 0:
|
|
kev.State = KeyUp
|
|
case 2:
|
|
kev.State = KeyHold
|
|
case 1:
|
|
kev.State = KeyDown
|
|
}
|
|
}
|
|
|
|
func NewKeyEvent(ev *InputEvent) *KeyEvent {
|
|
kev := &KeyEvent{}
|
|
kev.New(ev)
|
|
return kev
|
|
}
|
|
|
|
func (ev *KeyEvent) String() string {
|
|
state := "unknown"
|
|
|
|
switch ev.State {
|
|
case KeyUp:
|
|
state = "up"
|
|
case KeyHold:
|
|
state = "hold"
|
|
case KeyDown:
|
|
state = "down"
|
|
}
|
|
|
|
return fmt.Sprintf("key event at %d.%d, %d (%d), (%s)",
|
|
ev.Event.Time.Sec, ev.Event.Time.Usec,
|
|
ev.Scancode, ev.Event.Code, state)
|
|
}
|
|
|
|
// RelEvents are used to describe relative axis value changes,
|
|
// e.g. moving the mouse 5 units to the left.
|
|
type RelEvent struct {
|
|
Event *InputEvent
|
|
}
|
|
|
|
func (rev *RelEvent) New(ev *InputEvent) {
|
|
rev.Event = ev
|
|
}
|
|
|
|
func NewRelEvent(ev *InputEvent) *RelEvent {
|
|
rev := &RelEvent{}
|
|
rev.New(ev)
|
|
return rev
|
|
}
|
|
|
|
func (ev *RelEvent) String() string {
|
|
return fmt.Sprintf("relative axis event at %d.%d, %s",
|
|
ev.Event.Time.Sec, ev.Event.Time.Usec,
|
|
REL[int(ev.Event.Code)])
|
|
}
|
|
|
|
// TODO: Make this work
|
|
|
|
var EventFactory map[uint16]interface{} = make(map[uint16]interface{})
|
|
|
|
func init() {
|
|
EventFactory[uint16(EV_KEY)] = NewKeyEvent
|
|
EventFactory[uint16(EV_REL)] = NewRelEvent
|
|
}
|