Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/system/lib/html5/callback.c
6171 views
1
/*
2
* Copyright 2023 The Emscripten Authors. All rights reserved.
3
* Emscripten is available under two separate licenses, the MIT license and the
4
* University of Illinois/NCSA Open Source License. Both these licenses can be
5
* found in the LICENSE file.
6
*/
7
#include <assert.h>
8
#include <string.h>
9
#include <emscripten/html5.h>
10
11
#include "emscripten_internal.h"
12
13
typedef bool (*event_callback)(int event_type, void *event_data __attribute__((nonnull)), void *user_data);
14
15
typedef struct callback_args_t {
16
event_callback callback;
17
int event_type;
18
void *user_data;
19
uint8_t event_data[];
20
} callback_args_t;
21
22
static void do_callback(void* arg) {
23
callback_args_t* args = (callback_args_t*)arg;
24
args->callback(args->event_type, args->event_data, args->user_data);
25
free(arg);
26
}
27
28
void _emscripten_run_callback_on_thread(pthread_t t,
29
event_callback f,
30
int event_type,
31
void* event_data,
32
size_t event_data_size,
33
void* user_data) {
34
em_proxying_queue* q = emscripten_proxy_get_system_queue();
35
callback_args_t* arg = malloc(sizeof(callback_args_t) + event_data_size);
36
arg->callback = f;
37
arg->event_type = event_type;
38
arg->user_data = user_data;
39
memcpy(arg->event_data, event_data, event_data_size);
40
41
if (!emscripten_proxy_async(q, t, do_callback, arg)) {
42
assert(false && "emscripten_proxy_async failed");
43
}
44
}
45
46
static EMSCRIPTEN_RESULT _get_last_event(void* out, void *latest, size_t len) {
47
if (!latest) {
48
return EMSCRIPTEN_RESULT_NO_DATA;
49
}
50
memcpy(out, latest, len);
51
return EMSCRIPTEN_RESULT_SUCCESS;
52
}
53
54
EMSCRIPTEN_RESULT emscripten_get_deviceorientation_status(EmscriptenDeviceOrientationEvent *out) {
55
return _get_last_event(out, _emscripten_get_last_deviceorientation_event(), sizeof(*out));
56
}
57
58
EMSCRIPTEN_RESULT emscripten_get_devicemotion_status(EmscriptenDeviceMotionEvent *out) {
59
return _get_last_event(out, _emscripten_get_last_devicemotion_event(), sizeof(*out));
60
}
61
62
EMSCRIPTEN_RESULT emscripten_get_mouse_status(EmscriptenMouseEvent *out) {
63
return _get_last_event(out, _emscripten_get_last_mouse_event(), sizeof(*out));
64
}
65
66