summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitya Selivanov <automainint@guattari.tech>2025-01-16 23:23:07 +0100
committerMitya Selivanov <automainint@guattari.tech>2025-01-16 23:23:07 +0100
commite8972a0c2f344e109a9763a396f3ef54a646dfaa (patch)
tree50bd048b5431d911f5e0a006feb7dace13c371ae
parentfe0f57ce735297ae6267bd0b78aff38abcf94379 (diff)
downloadreduced_system_layer-e8972a0c2f344e109a9763a396f3ef54a646dfaa.zip
Add wheel event on Web
-rw-r--r--index.htm19
-rw-r--r--reduced_system_layer.c43
2 files changed, 52 insertions, 10 deletions
diff --git a/index.htm b/index.htm
index 437b932..ada10e2 100644
--- a/index.htm
+++ b/index.htm
@@ -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;
}