-
Notifications
You must be signed in to change notification settings - Fork 33
/
Keyboard.go
93 lines (80 loc) · 1.8 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
package input
type CharCallback func(char rune)
type ChatCallbackKey *CharCallback
var (
keyState = make(map[int]byte)
mouseState = make(map[int]byte)
charCallbacks = []*CharCallback{}
)
const (
idle = byte(0)
pressed = byte(1)
wasPressed = byte(2)
)
func OnKey(key, state int) {
switch state {
case key_Release:
keyState[key] = idle
case key_Press:
keyState[key] = pressed | wasPressed
}
}
func OnChar(key, state int) {
for i, callback := range charCallbacks {
if callback != nil && *callback != nil {
(*callback)(rune(key))
} else {
charCallbacks[len(charCallbacks)-1], charCallbacks[i], charCallbacks = nil, charCallbacks[len(charCallbacks)-1], charCallbacks[:len(charCallbacks)-1]
if callback != nil {
*callback = nil
}
}
}
}
func AddCharCallback(callback CharCallback) (key ChatCallbackKey) {
if callback == nil {
return
}
c := &callback
charCallbacks = append(charCallbacks, c)
return c
}
func RemoveCharCallback(key ChatCallbackKey) (deleted bool) {
if key == nil || *key == nil {
return false
}
for i, c := range charCallbacks {
if c == key {
charCallbacks[len(charCallbacks)-1], charCallbacks[i], charCallbacks = nil, charCallbacks[len(charCallbacks)-1], charCallbacks[:len(charCallbacks)-1]
*key = nil
return true
}
}
return false
}
func UpdateInput() {
for i, v := range keyState {
keyState[i] = v & ^wasPressed
}
for i, v := range mouseState {
mouseState[i] = v & ^wasPressed
}
MouseWheelDelta = 0
}
func ClearInput() {
for i, _ := range keyState {
keyState[i] = idle
}
for i, _ := range mouseState {
mouseState[i] = idle
}
}
func KeyDown(key int) bool {
return keyState[key]&pressed != 0
}
func KeyUp(key int) bool {
return keyState[key]&pressed == 0
}
func KeyPress(key int) bool {
return keyState[key]&wasPressed != 0
}