23 #include "../../SDL_internal.h" 25 #if SDL_VIDEO_DRIVER_EMSCRIPTEN 27 #include <emscripten/html5.h> 29 #include "../../events/SDL_events_c.h" 30 #include "../../events/SDL_keyboard_c.h" 31 #include "../../events/SDL_touch_c.h" 38 #define FULLSCREEN_MASK ( SDL_WINDOW_FULLSCREEN_DESKTOP | SDL_WINDOW_FULLSCREEN ) 45 static const SDL_Scancode emscripten_scancode_table[] = {
274 Emscripten_ConvertUTF32toUTF8(
Uint32 codepoint,
char *
text)
276 if (codepoint <= 0x7F) {
277 text[0] = (char) codepoint;
279 }
else if (codepoint <= 0x7FF) {
280 text[0] = 0xC0 | (char) ((codepoint >> 6) & 0x1F);
281 text[1] = 0x80 | (char) (codepoint & 0x3F);
283 }
else if (codepoint <= 0xFFFF) {
284 text[0] = 0xE0 | (char) ((codepoint >> 12) & 0x0F);
285 text[1] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
286 text[2] = 0x80 | (char) (codepoint & 0x3F);
288 }
else if (codepoint <= 0x10FFFF) {
289 text[0] = 0xF0 | (char) ((codepoint >> 18) & 0x0F);
290 text[1] = 0x80 | (char) ((codepoint >> 12) & 0x3F);
291 text[2] = 0x80 | (char) ((codepoint >> 6) & 0x3F);
292 text[3] = 0x80 | (char) (codepoint & 0x3F);
301 Emscripten_HandleMouseMove(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
305 static double residualx = 0, residualy = 0;
306 EmscriptenPointerlockChangeEvent pointerlock_status;
309 double client_w, client_h, xscale, yscale;
310 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
311 xscale = window_data->
window->
w / client_w;
312 yscale = window_data->
window->
h / client_h;
315 int isPointerLockSupported = emscripten_get_pointerlock_status(&pointerlock_status);
316 int isPointerLocked = isPointerLockSupported == EMSCRIPTEN_RESULT_SUCCESS ? pointerlock_status.isActive :
SDL_FALSE;
318 if (isPointerLocked) {
319 residualx += mouseEvent->movementX * xscale;
320 residualy += mouseEvent->movementY * yscale;
327 mx = mouseEvent->canvasX * xscale;
328 my = mouseEvent->canvasY * yscale;
336 Emscripten_HandleMouseButton(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
340 switch (mouseEvent->button) {
360 Emscripten_HandleMouseFocus(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
364 int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
365 EmscriptenPointerlockChangeEvent pointerlock_status;
368 int isPointerLockSupported = emscripten_get_pointerlock_status(&pointerlock_status);
369 int isPointerLocked = isPointerLockSupported == EMSCRIPTEN_RESULT_SUCCESS ? pointerlock_status.isActive :
SDL_FALSE;
371 if (!isPointerLocked) {
373 double client_w, client_h;
374 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
376 mx = mx * (window_data->
window->
w / client_w);
377 my = my * (window_data->
window->
h / client_h);
386 Emscripten_HandleWheel(
int eventType,
const EmscriptenWheelEvent *wheelEvent,
void *userData)
394 Emscripten_HandleFocus(
int eventType,
const EmscriptenFocusEvent *wheelEvent,
void *userData)
399 if (eventType == EMSCRIPTEN_EVENT_BLUR) {
409 Emscripten_HandleTouch(
int eventType,
const EmscriptenTouchEvent *touchEvent,
void *userData)
413 double client_w, client_h;
414 int preventDefault = 0;
421 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
423 for (i = 0; i < touchEvent->numTouches; i++) {
427 if (!touchEvent->touches[i].isChanged)
430 id = touchEvent->touches[
i].identifier;
431 x = touchEvent->touches[
i].canvasX / client_w;
432 y = touchEvent->touches[
i].canvasY / client_h;
434 if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
446 }
else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
468 return preventDefault;
472 Emscripten_HandleKey(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
477 if (keyEvent->keyCode <
SDL_arraysize(emscripten_scancode_table)) {
478 scancode = emscripten_scancode_table[keyEvent->keyCode];
482 if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
510 return prevent_default;
514 Emscripten_HandleKeyPress(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
517 if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
524 Emscripten_HandleFullscreenChange(
int eventType,
const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent,
void *userData)
527 if(fullscreenChangeEvent->isFullscreen)
545 Emscripten_HandleResize(
int eventType,
const EmscriptenUiEvent *uiEvent,
void *userData)
550 window_data->
pixel_ratio = emscripten_get_device_pixel_ratio();
561 emscripten_get_element_css_size(
NULL, &w, &h);
568 emscripten_set_element_css_size(
NULL, w, h);
587 emscripten_get_element_css_size(
NULL, &css_w, &css_h);
595 Emscripten_HandleVisibilityChange(
int eventType,
const EmscriptenVisibilityChangeEvent *visEvent,
void *userData)
606 emscripten_set_mousemove_callback(
"#canvas", data, 0, Emscripten_HandleMouseMove);
608 emscripten_set_mousedown_callback(
"#canvas", data, 0, Emscripten_HandleMouseButton);
609 emscripten_set_mouseup_callback(
"#document", data, 0, Emscripten_HandleMouseButton);
611 emscripten_set_mouseenter_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
612 emscripten_set_mouseleave_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
614 emscripten_set_wheel_callback(
"#canvas", data, 0, Emscripten_HandleWheel);
616 emscripten_set_focus_callback(
"#window", data, 0, Emscripten_HandleFocus);
617 emscripten_set_blur_callback(
"#window", data, 0, Emscripten_HandleFocus);
619 emscripten_set_touchstart_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
620 emscripten_set_touchend_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
621 emscripten_set_touchmove_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
622 emscripten_set_touchcancel_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
626 if (!keyElement) keyElement =
"#window";
628 emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
629 emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
630 emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
632 emscripten_set_fullscreenchange_callback(
"#document", data, 0, Emscripten_HandleFullscreenChange);
634 emscripten_set_resize_callback(
"#window", data, 0, Emscripten_HandleResize);
636 emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
643 emscripten_set_mousemove_callback(
"#canvas",
NULL, 0,
NULL);
645 emscripten_set_mousedown_callback(
"#canvas",
NULL, 0,
NULL);
646 emscripten_set_mouseup_callback(
"#document",
NULL, 0,
NULL);
648 emscripten_set_mouseenter_callback(
"#canvas",
NULL, 0,
NULL);
649 emscripten_set_mouseleave_callback(
"#canvas",
NULL, 0,
NULL);
651 emscripten_set_wheel_callback(
"#canvas",
NULL, 0,
NULL);
653 emscripten_set_focus_callback(
"#window",
NULL, 0,
NULL);
654 emscripten_set_blur_callback(
"#window",
NULL, 0,
NULL);
656 emscripten_set_touchstart_callback(
"#canvas",
NULL, 0,
NULL);
657 emscripten_set_touchend_callback(
"#canvas",
NULL, 0,
NULL);
658 emscripten_set_touchmove_callback(
"#canvas",
NULL, 0,
NULL);
659 emscripten_set_touchcancel_callback(
"#canvas",
NULL, 0,
NULL);
666 emscripten_set_keydown_callback(target,
NULL, 0,
NULL);
667 emscripten_set_keyup_callback(target,
NULL, 0,
NULL);
669 emscripten_set_keypress_callback(target,
NULL, 0,
NULL);
671 emscripten_set_fullscreenchange_callback(
"#document",
NULL, 0,
NULL);
673 emscripten_set_resize_callback(
"#window",
NULL, 0,
NULL);
675 emscripten_set_visibilitychange_callback(
NULL, 0,
NULL);
int Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
GLint GLint GLint GLint GLint x
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_SetMouseFocus(SDL_Window *window)
uint32_t Uint32
An unsigned 32-bit integer type.
#define SDL_TOUCH_MOUSEID
SDL_FingerID first_finger
void Emscripten_RegisterEventHandlers(SDL_WindowData *data)
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
int SDL_SendTouchMotion(SDL_TouchID id, SDL_FingerID fingerid, float x, float y, float pressure)
#define SDL_GetEventState(type)
GLint GLint GLint GLint GLint GLint y
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
int SDL_SendKeyboardText(const char *text)
SDL_EventType
The types of events that can be delivered.
#define SDL_BUTTON_MIDDLE
int SDL_AddTouch(SDL_TouchID touchID, const char *name)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
static char text[MAX_TEXT_LENGTH]
int requested_fullscreen_mode
void SDL_ResetKeyboard(void)
#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT
override the binding element for keyboard inputs for Emscripten builds
#define SDL_arraysize(array)
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, int x, int y, SDL_MouseWheelDirection direction)
GLubyte GLubyte GLubyte GLubyte w
void Emscripten_UnregisterEventHandlers(SDL_WindowData *data)
int SDL_SendMouseButton(SDL_Window *window, SDL_MouseID mouseID, Uint8 state, Uint8 button)
SDL_Scancode
The SDL keyboard scancode representation.
SDL_bool fullscreen_resize
GLfloat GLfloat GLfloat GLfloat h