This repository was archived by the owner on Jun 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathkeyboard.js
More file actions
91 lines (69 loc) · 2.06 KB
/
Copy pathkeyboard.js
File metadata and controls
91 lines (69 loc) · 2.06 KB
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
let shiftPressed = false;
let ctrlPressed = false;
let metaPressed = false;
let keyDownListeners = [];
let keyUpListeners = [];
const api = {
onKeyDown: function(listener){
keyDownListeners.push(listener);
},
onKeyUp: function(listener){
keyUpListeners.push(listener);
},
offKeyDown: function(listener){
keyDownListeners = keyDownListeners.filter(l => l !== listener);
},
offKeyUp: function(listener){
keyUpListeners = keyUpListeners.filter(l => l !== listener);
},
isShiftPressed: function(){
return shiftPressed;
},
isCtrlPressed: function(){
return ctrlPressed;
},
isMetaPressed: function(){
return metaPressed;
},
isModifierPressed: function(){
return shiftPressed || ctrlPressed || metaPressed;
},
resetModifiers: function(){
shiftPressed = ctrlPressed = metaPressed = false;
},
updateState: function(e){
shiftPressed = e.shiftKey;
ctrlPressed = e.ctrlKey;
metaPressed = e.metaKey;
}
};
window.addEventListener("keydown", e => {
const state = {
ctrlKey: e.ctrlKey,
metaKey: e.metaKey,
shiftKey: e.shiftKey
};
if (e.key === "Control") state.ctrlKey = true;
if (e.key === "Meta") state.metaKey = true;
if (e.key === "Shift") state.shiftKey = true;
api.updateState(state);
keyDownListeners.forEach(l => l(e));
});
window.addEventListener("keyup", e => {
const state = {
ctrlKey: e.ctrlKey,
metaKey: e.metaKey,
shiftKey: e.shiftKey
};
if (e.key === "Control") state.ctrlKey = false;
if (e.key === "Meta") state.metaKey = false;
if (e.key === "Shift") state.shiftKey = false;
api.updateState(state);
keyUpListeners.forEach(l => l(e));
});
window.addEventListener("contextmenuopened", api.resetModifiers, false);
// iOS fix, when keyboard is open it pushes the viewport out
document.addEventListener('focusout', function(e) {
if (window.scrollY > 0) window.scrollTo(0, 0);
});
export default api;