mach: wasm: implement key press and release events
This commit is contained in:
parent
d8afc9c88c
commit
32c12f0eaa
2 changed files with 159 additions and 2 deletions
146
src/mach.js
146
src/mach.js
|
|
@ -3,6 +3,137 @@ const text_decoder = new TextDecoder();
|
||||||
const text_encoder = new TextEncoder();
|
const text_encoder = new TextEncoder();
|
||||||
let log_buf = "";
|
let log_buf = "";
|
||||||
|
|
||||||
|
// TODO: Arrange in numberical order of value
|
||||||
|
function convertKeyCode(code) {
|
||||||
|
const mapKeyCode = {
|
||||||
|
KeyA: 0,
|
||||||
|
KeyB: 1,
|
||||||
|
KeyC: 2,
|
||||||
|
KeyD: 3,
|
||||||
|
KeyE: 4,
|
||||||
|
KeyF: 5,
|
||||||
|
KeyG: 6,
|
||||||
|
KeyH: 7,
|
||||||
|
KeyI: 8,
|
||||||
|
KeyJ: 9,
|
||||||
|
KeyK: 10,
|
||||||
|
KeyL: 11,
|
||||||
|
KeyM: 12,
|
||||||
|
KeyN: 13,
|
||||||
|
KeyO: 14,
|
||||||
|
KeyP: 15,
|
||||||
|
KeyQ: 16,
|
||||||
|
KeyR: 17,
|
||||||
|
KeyS: 18,
|
||||||
|
KeyT: 19,
|
||||||
|
KeyU: 20,
|
||||||
|
KeyV: 21,
|
||||||
|
KeyW: 22,
|
||||||
|
KeyX: 23,
|
||||||
|
KeyY: 24,
|
||||||
|
KeyZ: 25,
|
||||||
|
Digit0: 26,
|
||||||
|
Digit1: 27,
|
||||||
|
Digit2: 28,
|
||||||
|
Digit3: 29,
|
||||||
|
Digit4: 30,
|
||||||
|
Digit5: 31,
|
||||||
|
Digit6: 32,
|
||||||
|
Digit7: 33,
|
||||||
|
Digit8: 34,
|
||||||
|
Digit9: 35,
|
||||||
|
Enter: 78,
|
||||||
|
Escape: 79,
|
||||||
|
Backspace: 105,
|
||||||
|
Tab: 80,
|
||||||
|
Space: 106,
|
||||||
|
Minus: 107,
|
||||||
|
Equal: 108,
|
||||||
|
BracketLeft: 109,
|
||||||
|
BracketRight: 110,
|
||||||
|
Backslash: 111,
|
||||||
|
ShiftLeft: 81,
|
||||||
|
ShiftRight: 82,
|
||||||
|
ControlLeft: 83,
|
||||||
|
ControlRight: 84,
|
||||||
|
AltLeft: 85,
|
||||||
|
AltRight: 86,
|
||||||
|
OSLeft: 87,
|
||||||
|
MetaLeft: 87,
|
||||||
|
OSRight: 88,
|
||||||
|
MetaRight: 88,
|
||||||
|
Semicolon: 112,
|
||||||
|
Quote: 113,
|
||||||
|
Backquote: 117,
|
||||||
|
ContextMenu: 89,
|
||||||
|
Comma: 114,
|
||||||
|
Period: 115,
|
||||||
|
Slash: 116,
|
||||||
|
CapsLock: 91,
|
||||||
|
PrintScreen: 92,
|
||||||
|
ScrollLock: 93,
|
||||||
|
Pause: 94,
|
||||||
|
Insert: 100,
|
||||||
|
Home: 96,
|
||||||
|
PageUp: 98,
|
||||||
|
Delete: 95,
|
||||||
|
End: 97,
|
||||||
|
PageDown: 99,
|
||||||
|
ArrowRight: 102,
|
||||||
|
ArrowLeft: 101,
|
||||||
|
ArrowDown: 104,
|
||||||
|
ArrowUp: 103,
|
||||||
|
NumLock: 90,
|
||||||
|
NumpadDivide: 61,
|
||||||
|
NumpadMultiply: 62,
|
||||||
|
NumpadSubtract: 63,
|
||||||
|
NumpadAdd: 64,
|
||||||
|
Numpad1: 66,
|
||||||
|
Numpad2: 67,
|
||||||
|
Numpad3: 68,
|
||||||
|
Numpad4: 69,
|
||||||
|
Numpad5: 70,
|
||||||
|
Numpad6: 71,
|
||||||
|
Numpad7: 72,
|
||||||
|
Numpad8: 73,
|
||||||
|
Numpad9: 74,
|
||||||
|
Numpad0: 65,
|
||||||
|
NumpadDecimal: 75,
|
||||||
|
NumpadEqual: 76,
|
||||||
|
NumpadEnter: 77,
|
||||||
|
F1: 36,
|
||||||
|
F2: 37,
|
||||||
|
F3: 38,
|
||||||
|
F4: 39,
|
||||||
|
F5: 40,
|
||||||
|
F6: 41,
|
||||||
|
F7: 42,
|
||||||
|
F8: 43,
|
||||||
|
F9: 44,
|
||||||
|
F10: 45,
|
||||||
|
F11: 46,
|
||||||
|
F12: 47,
|
||||||
|
F13: 48,
|
||||||
|
F14: 49,
|
||||||
|
F15: 50,
|
||||||
|
F16: 51,
|
||||||
|
F17: 52,
|
||||||
|
F18: 53,
|
||||||
|
F19: 54,
|
||||||
|
F20: 55,
|
||||||
|
F21: 56,
|
||||||
|
F22: 57,
|
||||||
|
F23: 58,
|
||||||
|
F24: 59,
|
||||||
|
F25: 60,
|
||||||
|
};
|
||||||
|
|
||||||
|
const k = mapKeyCode[code];
|
||||||
|
if (k != undefined)
|
||||||
|
return k;
|
||||||
|
return 118; // Unknown
|
||||||
|
}
|
||||||
|
|
||||||
const mach = {
|
const mach = {
|
||||||
canvases: [],
|
canvases: [],
|
||||||
wasm: undefined,
|
wasm: undefined,
|
||||||
|
|
@ -52,6 +183,14 @@ const mach = {
|
||||||
|
|
||||||
canvas.addEventListener("contextmenu", (ev) => ev.preventDefault());
|
canvas.addEventListener("contextmenu", (ev) => ev.preventDefault());
|
||||||
|
|
||||||
|
canvas.addEventListener("keydown", (ev) => {
|
||||||
|
mach.events.push(...[1, convertKeyCode(ev.code)]);
|
||||||
|
});
|
||||||
|
|
||||||
|
canvas.addEventListener("keyup", (ev) => {
|
||||||
|
mach.events.push(...[2, convertKeyCode(ev.code)]);
|
||||||
|
});
|
||||||
|
|
||||||
document.body.appendChild(canvas);
|
document.body.appendChild(canvas);
|
||||||
return mach.canvases.push({ canvas: canvas, title: undefined }) - 1;
|
return mach.canvases.push({ canvas: canvas, title: undefined }) - 1;
|
||||||
},
|
},
|
||||||
|
|
@ -100,6 +239,13 @@ const mach = {
|
||||||
return cv.canvas.height;
|
return cv.canvas.height;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
machEventShift() {
|
||||||
|
if (mach.events.length < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return mach.events.shift();
|
||||||
|
},
|
||||||
|
|
||||||
machPerfNow() {
|
machPerfNow() {
|
||||||
return performance.now();
|
return performance.now();
|
||||||
},
|
},
|
||||||
|
|
|
||||||
15
src/wasm.zig
15
src/wasm.zig
|
|
@ -13,8 +13,9 @@ const js = struct {
|
||||||
extern fn machCanvasGetWindowHeight(canvas: CanvasId) u32;
|
extern fn machCanvasGetWindowHeight(canvas: CanvasId) u32;
|
||||||
extern fn machCanvasGetFramebufferWidth(canvas: CanvasId) u32;
|
extern fn machCanvasGetFramebufferWidth(canvas: CanvasId) u32;
|
||||||
extern fn machCanvasGetFramebufferHeight(canvas: CanvasId) u32;
|
extern fn machCanvasGetFramebufferHeight(canvas: CanvasId) u32;
|
||||||
|
extern fn machEventShift() u32;
|
||||||
extern fn machPerfNow() f64;
|
extern fn machPerfNow() f64;
|
||||||
|
|
||||||
extern fn machLog(str: [*]const u8, len: u32) void;
|
extern fn machLog(str: [*]const u8, len: u32) void;
|
||||||
extern fn machLogWrite(str: [*]const u8, len: u32) void;
|
extern fn machLogWrite(str: [*]const u8, len: u32) void;
|
||||||
extern fn machLogFlush() void;
|
extern fn machLogFlush() void;
|
||||||
|
|
@ -60,7 +61,17 @@ pub const Core = struct {
|
||||||
pub fn setSizeLimits(_: *Core, _: structs.SizeOptional, _: structs.SizeOptional) !void {}
|
pub fn setSizeLimits(_: *Core, _: structs.SizeOptional, _: structs.SizeOptional) !void {}
|
||||||
|
|
||||||
pub fn pollEvent(_: *Core) ?structs.Event {
|
pub fn pollEvent(_: *Core) ?structs.Event {
|
||||||
return null;
|
const event_type = js.machEventShift();
|
||||||
|
|
||||||
|
return switch (event_type) {
|
||||||
|
1 => structs.Event{
|
||||||
|
.key_press = .{ .key = @intToEnum(enums.Key, js.machEventShift()) },
|
||||||
|
},
|
||||||
|
2 => structs.Event{
|
||||||
|
.key_release = .{ .key = @intToEnum(enums.Key, js.machEventShift()) },
|
||||||
|
},
|
||||||
|
else => null,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue