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
|
'use strict'
function Keyboard (terminal) {
this.locks = []
this.history = ''
this.onKeyDown = function (event) {
// Reset
if ((event.metaKey || event.ctrlKey) && event.key === 'Backspace') {
terminal.reset()
event.preventDefault()
return
}
if (event.key === 'c' && (event.metaKey || event.ctrlKey)) { terminal.cursor.copy(); event.preventDefault(); return }
if (event.key === 'x' && (event.metaKey || event.ctrlKey)) { terminal.cursor.cut(); event.preventDefault(); return }
if (event.key === 'v' && (event.metaKey || event.ctrlKey)) { terminal.cursor.paste(); event.preventDefault(); return }
if (event.key === 'a' && (event.metaKey || event.ctrlKey)) { terminal.cursor.selectAll(); event.preventDefault(); return }
// Undo/Redo
if (event.key === 'z' && (event.metaKey || event.ctrlKey) && event.shiftKey) { terminal.history.redo(); event.preventDefault(); return }
if (event.key === 'z' && (event.metaKey || event.ctrlKey)) { terminal.history.undo(); event.preventDefault(); return }
if (event.keyCode === 38) { terminal.keyboard.onArrowUp(event.shiftKey, (event.metaKey || event.ctrlKey), event.altKey); return }
if (event.keyCode === 40) { terminal.keyboard.onArrowDown(event.shiftKey, (event.metaKey || event.ctrlKey), event.altKey); return }
if (event.keyCode === 37) { terminal.keyboard.onArrowLeft(event.shiftKey, (event.metaKey || event.ctrlKey), event.altKey); return }
if (event.keyCode === 39) { terminal.keyboard.onArrowRight(event.shiftKey, (event.metaKey || event.ctrlKey), event.altKey); return }
if (event.metaKey) { return }
if (event.ctrlKey) { return }
if (event.key === 'Backspace' || event.key === '.') { terminal.cursor.erase(true); return }
if (event.key === ' ' && terminal.cursor.mode === 0) { terminal.clock.togglePlay(); event.preventDefault(); return }
if (event.key === 'Escape') { terminal.clear(); terminal.isPaused = false; terminal.cursor.reset(); return }
if (event.key === ']') { terminal.modGrid(1, 0); event.preventDefault(); return }
if (event.key === '[') { terminal.modGrid(-1, 0); event.preventDefault(); return }
if (event.key === '}') { terminal.modGrid(0, 1); event.preventDefault(); return }
if (event.key === '{') { terminal.modGrid(0, -1); event.preventDefault(); return }
if (event.key === '>') { terminal.clock.mod(1); event.preventDefault(); return }
if (event.key === '<') { terminal.clock.mod(-1); event.preventDefault(); return }
if (event.key.length === 1) {
terminal.cursor.write(event.key)
terminal.update()
}
}
this.onKeyUp = function (event) {
terminal.update()
}
this.onArrowUp = function (mod = false, skip = false, drag = false) {
const leap = skip ? terminal.grid.h : 1
if (drag) {
terminal.cursor.drag(0, leap)
} else if (mod) {
terminal.cursor.scale(0, leap)
} else {
terminal.cursor.move(0, leap)
}
}
this.onArrowDown = function (mod = false, skip = false, drag = false) {
const leap = skip ? terminal.grid.h : 1
if (drag) {
terminal.cursor.drag(0, -leap)
} else if (mod) {
terminal.cursor.scale(0, -leap)
} else {
terminal.cursor.move(0, -leap)
}
}
this.onArrowLeft = function (mod = false, skip = false, drag = false) {
const leap = skip ? terminal.grid.w : 1
if (drag) {
terminal.cursor.drag(-leap, 0)
} else if (mod) {
terminal.cursor.scale(-leap, 0)
} else {
terminal.cursor.move(-leap, 0)
}
}
this.onArrowRight = function (mod = false, skip = false, drag = false) {
const leap = skip ? terminal.grid.w : 1
if (drag) {
terminal.cursor.drag(leap, 0)
} else if (mod) {
terminal.cursor.scale(leap, 0)
} else {
terminal.cursor.move(leap, 0)
}
}
document.onkeydown = (event) => { this.onKeyDown(event) }
document.onkeyup = (event) => { this.onKeyUp(event) }
}
module.exports = Keyboard
|