2023-05-02 18:44:27 -07:00
|
|
|
const keyboard = new Map<number, {first: boolean, repeat: boolean, held: boolean}>();
|
2023-05-02 18:17:31 -07:00
|
|
|
|
|
|
|
export const K = {
|
|
|
|
ESCAPE: 256,
|
|
|
|
ENTER: 257,
|
|
|
|
TAB: 258,
|
|
|
|
BACKSPACE: 259,
|
|
|
|
DELETE: 261,
|
|
|
|
ARROW_RIGHT: 262,
|
|
|
|
ARROW_LEFT: 263,
|
|
|
|
ARROW_DOWN: 264,
|
|
|
|
ARROW_UP: 265,
|
|
|
|
CAPS_LOCK: 280,
|
|
|
|
F1: 290,
|
|
|
|
F2: 291,
|
|
|
|
F3: 292,
|
|
|
|
F4: 293,
|
|
|
|
F5: 294,
|
|
|
|
F6: 295,
|
|
|
|
F7: 296,
|
|
|
|
F8: 297,
|
|
|
|
F9: 298,
|
|
|
|
F10: 299,
|
|
|
|
F11: 300,
|
|
|
|
F12: 301,
|
|
|
|
SHIFT_LEFT: 340,
|
|
|
|
CTRL_LEFT: 341,
|
|
|
|
ALT_LEFT: 342,
|
|
|
|
SHIFT_RIGHT: 344,
|
|
|
|
CTRL_RIGHT: 345,
|
|
|
|
ALT_RIGHT: 346,
|
|
|
|
}
|
|
|
|
|
2023-05-02 18:44:27 -07:00
|
|
|
export const shiftMap = {
|
|
|
|
"1": "!",
|
|
|
|
"2": "@",
|
|
|
|
"3": "#",
|
|
|
|
"4": "$",
|
|
|
|
"5": "%",
|
|
|
|
"6": "^",
|
|
|
|
"7": "&",
|
|
|
|
"8": "*",
|
|
|
|
"9": "(",
|
|
|
|
"0": ")",
|
|
|
|
"`": "~",
|
|
|
|
"-": "_",
|
|
|
|
"=": "+",
|
|
|
|
"[": "{",
|
|
|
|
"]": "}",
|
|
|
|
"\\": "|",
|
|
|
|
";": ":",
|
|
|
|
"'": '"',
|
|
|
|
",": "<",
|
|
|
|
".": ">",
|
|
|
|
"/": "?",
|
|
|
|
}
|
|
|
|
|
2023-05-02 18:17:31 -07:00
|
|
|
addEventListener("keydown", (evt) => {
|
|
|
|
console.log("keydown", evt.key, evt.key.charCodeAt(0));
|
2023-05-02 18:44:27 -07:00
|
|
|
const key = evt.key.charCodeAt(0);
|
|
|
|
const isRepeat = keyboard.has(key) && keyboard.get(key)?.held!;
|
|
|
|
keyboard.set(key, {
|
2023-05-02 18:17:31 -07:00
|
|
|
first: !isRepeat,
|
|
|
|
repeat: isRepeat,
|
|
|
|
held: true,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
addEventListener("keyup", (evt) => {
|
|
|
|
console.log("keyup", evt.key, evt.key.charCodeAt(0));
|
2023-05-02 18:44:27 -07:00
|
|
|
const key = evt.key.charCodeAt(0);
|
|
|
|
keyboard.set(key, {
|
2023-05-02 18:17:31 -07:00
|
|
|
first: false,
|
|
|
|
repeat: false,
|
|
|
|
held: false,
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
export const refreshKeyboard = () => {
|
|
|
|
keyboard.forEach(({held}, key) => {
|
|
|
|
if (!held) {
|
|
|
|
keyboard.delete(key);
|
|
|
|
} else {
|
|
|
|
keyboard.set(key, {
|
|
|
|
first: false,
|
|
|
|
repeat: false,
|
|
|
|
held: true,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2023-05-02 18:44:27 -07:00
|
|
|
export const keyPressed = (key: string | number) => {
|
|
|
|
if (typeof key === "string") {
|
|
|
|
key = key.charCodeAt(0);
|
|
|
|
}
|
2023-05-02 18:17:31 -07:00
|
|
|
return keyboard.has(key) && keyboard.get(key)?.repeat!;
|
|
|
|
}
|
|
|
|
|
2023-05-02 18:44:27 -07:00
|
|
|
export const keyDown = (key: string | number) => {
|
|
|
|
if (typeof key === "string") {
|
|
|
|
key = key.charCodeAt(0);
|
|
|
|
}
|
2023-05-02 18:17:31 -07:00
|
|
|
return keyboard.has(key) && keyboard.get(key)?.held!;
|
|
|
|
}
|
|
|
|
|
2023-05-02 18:44:27 -07:00
|
|
|
export const shiftKeyDown = () => {
|
|
|
|
return keyDown(K.SHIFT_LEFT) || keyDown(K.SHIFT_RIGHT);
|
|
|
|
}
|
|
|
|
|
|
|
|
export const keyReleased = (key: string | number) => {
|
|
|
|
if (typeof key === "string") {
|
|
|
|
key = key.charCodeAt(0);
|
|
|
|
}
|
2023-05-02 18:17:31 -07:00
|
|
|
return keyboard.has(key) && !keyboard.get(key)?.held!;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const getKeysPressed = () => {
|
|
|
|
const result = [...keyboard.entries()].filter(([_key, value]) => {
|
|
|
|
return value.first || value.repeat;
|
|
|
|
}).map(([key]) => key);
|
|
|
|
return result;
|
|
|
|
}
|