diff options
author | Mitya Selivanov <automainint@guattari.tech> | 2025-01-16 23:23:07 +0100 |
---|---|---|
committer | Mitya Selivanov <automainint@guattari.tech> | 2025-01-16 23:23:07 +0100 |
commit | e8972a0c2f344e109a9763a396f3ef54a646dfaa (patch) | |
tree | 50bd048b5431d911f5e0a006feb7dace13c371ae | |
parent | fe0f57ce735297ae6267bd0b78aff38abcf94379 (diff) | |
download | reduced_system_layer-e8972a0c2f344e109a9763a396f3ef54a646dfaa.zip |
Add wheel event on Web
-rw-r--r-- | index.htm | 19 | ||||
-rw-r--r-- | reduced_system_layer.c | 43 |
2 files changed, 52 insertions, 10 deletions
@@ -141,6 +141,13 @@ this.program.exports.js_keyup(ev.key, ev.mod); }, + wheel : (ev) => { + if (this.program === undefined) + return; + + this.program.exports.js_wheel(ev.x * -0.01, ev.y * -0.01); + }, + paste : (ev) => { if (this.program === undefined) return; @@ -559,6 +566,18 @@ }); }); + window.addEventListener("wheel", (ev) => { + ev.preventDefault(); + if (!sound_ready) + return; + + sound_node.port.postMessage({ + id : "wheel", + x : ev.deltaX, + y : ev.deltaY, + }); + }); + window.addEventListener("paste", (ev) => { ev.preventDefault(); if (!sound_ready) diff --git a/reduced_system_layer.c b/reduced_system_layer.c index 8370c46..4043f58 100644 --- a/reduced_system_layer.c +++ b/reduced_system_layer.c @@ -239,6 +239,10 @@ i32 main(i32 argc, c8 **argv); #define DROP_FILES_BUFFER_SIZE (20 * 1024 * 1024) #endif +#ifndef MOUSE_WHEEL_FACTOR +#define MOUSE_WHEEL_FACTOR (1.0) +#endif + // ================================================================ // // Basic declarations @@ -532,8 +536,8 @@ typedef struct { i32 cursor_y; i32 cursor_dx; i32 cursor_dy; - i64 wheel_dx; - i64 wheel_dy; + f64 wheel_dx; + f64 wheel_dy; i64 num_sound_samples_elapsed; i64 num_drop_files; @@ -1678,10 +1682,10 @@ i32 p_handle_events(void) { g_platform.key_down [BUTTON_RIGHT] = 1; g_platform.key_pressed[BUTTON_RIGHT] = 1; break; - case Button4: ++g_platform.wheel_dy; break; - case Button5: --g_platform.wheel_dy; break; - case Button5 + 1: --g_platform.wheel_dx; break; - case Button5 + 2: ++g_platform.wheel_dx; break; + case Button4: g_platform.wheel_dy += MOUSE_WHEEL_FACTOR; break; + case Button5: g_platform.wheel_dy -= MOUSE_WHEEL_FACTOR; break; + case Button5 + 1: g_platform.wheel_dx -= MOUSE_WHEEL_FACTOR; break; + case Button5 + 2: g_platform.wheel_dx += MOUSE_WHEEL_FACTOR; break; default:; } if (!requested_clipboard) { @@ -2175,6 +2179,10 @@ static i32 _frame_width = 0; static i32 _frame_height = 0; static i32 _num_events = 0; static i32 _input_size = 0; +static i32 _cursor_dx = 0; +static i32 _cursor_dy = 0; +static f64 _wheel_dx = 0; +static f64 _wheel_dy = 0; static b8 _wait_events = 0; static i64 _timeout = 0; static i64 _sound_read = 0; @@ -2224,7 +2232,16 @@ void p_init(void) { i32 p_handle_events(void) { g_platform.input_size = _input_size; + g_platform.cursor_dx = _cursor_dx; + g_platform.cursor_dy = _cursor_dy; + g_platform.wheel_dx = _wheel_dx; + g_platform.wheel_dy = _wheel_dy; + _input_size = 0; + _cursor_dx = 0; + _cursor_dy = 0; + _wheel_dx = 0; + _wheel_dy = 0; for (i64 i = 0; i < MAX_NUM_KEYS; ++i) g_platform.key_pressed[i] = _key_pressed[i]; @@ -2528,10 +2545,10 @@ __attribute__((export_name("js_frame"))) void js_frame(i32 frame_width, i32 fram __attribute__((export_name("js_mousemove"))) void js_mousemove(i32 x, i32 y) { ++_num_events; - g_platform.cursor_dx = x - g_platform.cursor_x; - g_platform.cursor_dy = y - g_platform.cursor_y; - g_platform.cursor_x = x; - g_platform.cursor_y = y; + _cursor_dx += x - g_platform.cursor_x; + _cursor_dy += y - g_platform.cursor_y; + g_platform.cursor_x = x; + g_platform.cursor_y = y; } __attribute__((export_name("js_mousedown"))) void js_mousedown(u32 buttons) { @@ -2579,6 +2596,12 @@ __attribute__((export_name("js_keyup"))) void js_keyup(u32 key, u32 mod) { g_platform.key_down[MOD_META] = (mod & 8) ? 1 : 0; } +__attribute__((export_name("js_wheel"))) void js_wheel(f64 delta_x, f64 delta_y) { + ++_num_events; + _wheel_dx += delta_x * MOUSE_WHEEL_FACTOR; + _wheel_dy += delta_y * MOUSE_WHEEL_FACTOR; +} + __attribute__((export_name("js_clipboard_size"))) i32 js_clipboard_size(void) { return g_platform.clipboard_size; } |