mach: wasm: Implement mouse press, release, motion and scroll events

This commit is contained in:
iddev5 2022-06-05 18:12:25 +05:30 committed by Stephen Gutekanst
parent efe90fc64f
commit 99dc10e58a
2 changed files with 62 additions and 1 deletions

View file

@ -191,6 +191,22 @@ const mach = {
mach.events.push(...[2, convertKeyCode(ev.code)]);
});
canvas.addEventListener("mousemove", (ev) => {
mach.events.push(...[3, ev.clientX, ev.clientY]);
});
canvas.addEventListener("mousedown", (ev) => {
mach.events.push(...[4, ev.button]);
});
canvas.addEventListener("mouseup", (ev) => {
mach.events.push(...[5, ev.button]);
});
canvas.addEventListener("wheel", (ev) => {
mach.events.push(...[6, ev.deltaX, ev.deltaY]);
});
document.body.appendChild(canvas);
return mach.canvases.push({ canvas: canvas, title: undefined }) - 1;
},
@ -246,6 +262,10 @@ const mach = {
return mach.events.shift();
},
machEventShiftFloat() {
return mach.machEventShift();
},
machPerfNow() {
return performance.now();
},

View file

@ -13,7 +13,8 @@ const js = struct {
extern fn machCanvasGetWindowHeight(canvas: CanvasId) u32;
extern fn machCanvasGetFramebufferWidth(canvas: CanvasId) u32;
extern fn machCanvasGetFramebufferHeight(canvas: CanvasId) u32;
extern fn machEventShift() u32;
extern fn machEventShift() i32;
extern fn machEventShiftFloat() f64;
extern fn machPerfNow() f64;
extern fn machLog(str: [*]const u8, len: u32) void;
@ -76,9 +77,49 @@ pub const Platform = struct {
2 => structs.Event{
.key_release = .{ .key = @intToEnum(enums.Key, js.machEventShift()) },
},
3 => structs.Event{
.mouse_motion = .{
.x = @intToFloat(f64, js.machEventShift()),
.y = @intToFloat(f64, js.machEventShift()),
},
},
4 => structs.Event{
.mouse_press = .{
.button = toMachButton(js.machEventShift()),
},
},
5 => structs.Event{
.mouse_release = .{
.button = toMachButton(js.machEventShift()),
},
},
6 => structs.Event{
.mouse_scroll = .{
.xoffset = @floatCast(f32, sign(js.machEventShiftFloat())),
.yoffset = @floatCast(f32, sign(js.machEventShiftFloat())),
},
},
else => null,
};
}
inline fn sign(val: f64) f64 {
return switch (val) {
0.0 => 0.0,
else => -val,
};
}
fn toMachButton(button: i32) enums.MouseButton {
return switch (button) {
0 => .left,
1 => .middle,
2 => .right,
3 => .four,
4 => .five,
else => unreachable,
};
}
};
pub const BackingTimer = struct {