-
Notifications
You must be signed in to change notification settings - Fork 0
/
keyboard.go
138 lines (115 loc) · 2.72 KB
/
keyboard.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// Package input ...
package input
import (
"github.com/moredure/xrod/lib/proto"
"github.com/ysmood/gson"
)
// Modifier values
const (
ModifierAlt = 1
ModifierControl = 2
ModifierMeta = 4
ModifierShift = 8
)
// Key symbol
type Key rune
// keyMap for key description
var keyMap = map[Key]KeyInfo{}
// keyMapShifted for shifted key description
var keyMapShifted = map[Key]KeyInfo{}
var keyShiftedMap = map[Key]Key{}
// AddKey to KeyMap
func AddKey(key string, shiftedKey string, code string, keyCode int, location int) Key {
if len(key) == 1 {
r := Key(key[0])
if _, has := keyMap[r]; !has {
keyMap[r] = KeyInfo{key, code, keyCode, location}
if len(shiftedKey) == 1 {
rs := Key(shiftedKey[0])
keyMapShifted[rs] = KeyInfo{shiftedKey, code, keyCode, location}
keyShiftedMap[r] = rs
}
return r
}
}
k := Key(keyCode + (location+1)*256)
keyMap[k] = KeyInfo{key, code, keyCode, location}
return k
}
// Info of the key
func (k Key) Info() KeyInfo {
if k, has := keyMap[k]; has {
return k
}
if k, has := keyMapShifted[k]; has {
return k
}
panic("key not defined")
}
// KeyInfo of a key
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
type KeyInfo struct {
// Here's the value for Shift key on the keyboard
Key string // Shift
Code string // ShiftLeft
KeyCode int // 16
Location int // 1
}
// Shift returns the shifted key, such as shifted "1" is "!".
func (k Key) Shift() (Key, bool) {
s, has := keyShiftedMap[k]
return s, has
}
// Printable returns true if the key is printable
func (k Key) Printable() bool {
return len(k.Info().Key) == 1
}
// Modifier returns the modifier value of the key
func (k Key) Modifier() int {
switch k.Info().KeyCode {
case 18:
return ModifierAlt
case 17:
return ModifierControl
case 91, 92:
return ModifierMeta
case 16:
return ModifierShift
}
return 0
}
// Encode general key event
func (k Key) Encode(t proto.InputDispatchKeyEventType, modifiers int) *proto.InputDispatchKeyEvent {
tp := t
if t == proto.InputDispatchKeyEventTypeKeyDown && !k.Printable() {
tp = proto.InputDispatchKeyEventTypeRawKeyDown
}
info := k.Info()
l := gson.Int(info.Location)
keypad := false
if info.Location == 3 {
l = nil
keypad = true
}
txt := ""
if k.Printable() {
txt = info.Key
}
var cmd []string
if IsMac {
cmd = macCommands[info.Key]
}
e := &proto.InputDispatchKeyEvent{
Type: tp,
WindowsVirtualKeyCode: info.KeyCode,
Code: info.Code,
Key: info.Key,
Text: txt,
UnmodifiedText: txt,
Location: l,
IsKeypad: keypad,
Modifiers: modifiers,
Commands: cmd,
}
return e
}