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_HandlePointerLockChange(
int eventType,
const EmscriptenPointerlockChangeEvent *changeEvent,
void *userData)
311 Emscripten_HandleMouseMove(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
316 static double residualx = 0, residualy = 0;
320 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
321 xscale = window_data->
window->
w / client_w;
322 yscale = window_data->
window->
h / client_h;
324 if (isPointerLocked) {
325 residualx += mouseEvent->movementX *
xscale;
326 residualy += mouseEvent->movementY *
yscale;
333 mx = mouseEvent->canvasX *
xscale;
334 my = mouseEvent->canvasY *
yscale;
342 Emscripten_HandleMouseButton(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
346 Uint8 sdl_button_state;
349 switch (mouseEvent->button) {
363 if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) {
365 emscripten_request_pointerlock(
NULL, 0);
378 Emscripten_HandleMouseFocus(
int eventType,
const EmscriptenMouseEvent *mouseEvent,
void *userData)
382 int mx = mouseEvent->canvasX, my = mouseEvent->canvasY;
385 if (!isPointerLocked) {
387 double client_w, client_h;
388 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
390 mx = mx * (window_data->
window->
w / client_w);
391 my = my * (window_data->
window->
h / client_h);
400 Emscripten_HandleWheel(
int eventType,
const EmscriptenWheelEvent *wheelEvent,
void *userData)
408 Emscripten_HandleFocus(
int eventType,
const EmscriptenFocusEvent *wheelEvent,
void *userData)
413 if (eventType == EMSCRIPTEN_EVENT_BLUR) {
423 Emscripten_HandleTouch(
int eventType,
const EmscriptenTouchEvent *touchEvent,
void *userData)
427 double client_w, client_h;
428 int preventDefault = 0;
435 emscripten_get_element_css_size(
NULL, &client_w, &client_h);
437 for (i = 0; i < touchEvent->numTouches; i++) {
442 if (!touchEvent->touches[i].isChanged)
445 id = touchEvent->touches[
i].identifier;
446 x = touchEvent->touches[
i].canvasX / client_w;
447 y = touchEvent->touches[
i].canvasY / client_h;
449 mx = x * window_data->
window->
w;
450 my = y * window_data->
window->
h;
452 if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) {
464 }
else if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) {
486 return preventDefault;
490 Emscripten_HandleKey(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
497 if (keyEvent->keyCode <
SDL_arraysize(emscripten_scancode_table)) {
498 scancode = emscripten_scancode_table[keyEvent->keyCode];
502 if (keyEvent->location == DOM_KEY_LOCATION_RIGHT) {
527 is_nav_key = keyEvent->keyCode == 8 ||
528 keyEvent->keyCode == 9 ||
529 keyEvent->keyCode == 37 ||
530 keyEvent->keyCode == 38 ||
531 keyEvent->keyCode == 39 ||
532 keyEvent->keyCode == 40 ;
537 return prevent_default;
541 Emscripten_HandleKeyPress(
int eventType,
const EmscriptenKeyboardEvent *keyEvent,
void *userData)
544 if (Emscripten_ConvertUTF32toUTF8(keyEvent->charCode, text)) {
551 Emscripten_HandleFullscreenChange(
int eventType,
const EmscriptenFullscreenChangeEvent *fullscreenChangeEvent,
void *userData)
554 if(fullscreenChangeEvent->isFullscreen)
572 Emscripten_HandleResize(
int eventType,
const EmscriptenUiEvent *uiEvent,
void *userData)
578 window_data->
pixel_ratio = emscripten_get_device_pixel_ratio();
590 emscripten_get_element_css_size(
NULL, &w, &h);
597 emscripten_set_element_css_size(
NULL, w, h);
616 emscripten_get_element_css_size(
NULL, &css_w, &css_h);
624 Emscripten_HandleVisibilityChange(
int eventType,
const EmscriptenVisibilityChangeEvent *visEvent,
void *userData)
634 const char *keyElement;
637 emscripten_set_mousemove_callback(
"#canvas", data, 0, Emscripten_HandleMouseMove);
639 emscripten_set_mousedown_callback(
"#canvas", data, 0, Emscripten_HandleMouseButton);
640 emscripten_set_mouseup_callback(
"#document", data, 0, Emscripten_HandleMouseButton);
642 emscripten_set_mouseenter_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
643 emscripten_set_mouseleave_callback(
"#canvas", data, 0, Emscripten_HandleMouseFocus);
645 emscripten_set_wheel_callback(
"#canvas", data, 0, Emscripten_HandleWheel);
647 emscripten_set_focus_callback(
"#window", data, 0, Emscripten_HandleFocus);
648 emscripten_set_blur_callback(
"#window", data, 0, Emscripten_HandleFocus);
650 emscripten_set_touchstart_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
651 emscripten_set_touchend_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
652 emscripten_set_touchmove_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
653 emscripten_set_touchcancel_callback(
"#canvas", data, 0, Emscripten_HandleTouch);
655 emscripten_set_pointerlockchange_callback(
"#document", data, 0, Emscripten_HandlePointerLockChange);
659 if (!keyElement) keyElement =
"#window";
661 emscripten_set_keydown_callback(keyElement, data, 0, Emscripten_HandleKey);
662 emscripten_set_keyup_callback(keyElement, data, 0, Emscripten_HandleKey);
663 emscripten_set_keypress_callback(keyElement, data, 0, Emscripten_HandleKeyPress);
665 emscripten_set_fullscreenchange_callback(
"#document", data, 0, Emscripten_HandleFullscreenChange);
667 emscripten_set_resize_callback(
"#window", data, 0, Emscripten_HandleResize);
669 emscripten_set_visibilitychange_callback(data, 0, Emscripten_HandleVisibilityChange);
678 emscripten_set_mousemove_callback(
"#canvas",
NULL, 0,
NULL);
680 emscripten_set_mousedown_callback(
"#canvas",
NULL, 0,
NULL);
681 emscripten_set_mouseup_callback(
"#document",
NULL, 0,
NULL);
683 emscripten_set_mouseenter_callback(
"#canvas",
NULL, 0,
NULL);
684 emscripten_set_mouseleave_callback(
"#canvas",
NULL, 0,
NULL);
686 emscripten_set_wheel_callback(
"#canvas",
NULL, 0,
NULL);
688 emscripten_set_focus_callback(
"#window",
NULL, 0,
NULL);
689 emscripten_set_blur_callback(
"#window",
NULL, 0,
NULL);
691 emscripten_set_touchstart_callback(
"#canvas",
NULL, 0,
NULL);
692 emscripten_set_touchend_callback(
"#canvas",
NULL, 0,
NULL);
693 emscripten_set_touchmove_callback(
"#canvas",
NULL, 0,
NULL);
694 emscripten_set_touchcancel_callback(
"#canvas",
NULL, 0,
NULL);
696 emscripten_set_pointerlockchange_callback(
"#document",
NULL, 0,
NULL);
703 emscripten_set_keydown_callback(target,
NULL, 0,
NULL);
704 emscripten_set_keyup_callback(target,
NULL, 0,
NULL);
705 emscripten_set_keypress_callback(target,
NULL, 0,
NULL);
707 emscripten_set_fullscreenchange_callback(
"#document",
NULL, 0,
NULL);
709 emscripten_set_resize_callback(
"#window",
NULL, 0,
NULL);
711 emscripten_set_visibilitychange_callback(
NULL, 0,
NULL);
SDL_Mouse * SDL_GetMouse(void)
GLint GLint GLint GLint GLint x
EM_BOOL Emscripten_HandleCanvasResize(int eventType, const void *reserved, void *userData)
SDL_bool has_pointer_lock
GLfloat GLfloat GLfloat GLfloat h
int SDL_SendTouch(SDL_TouchID id, SDL_FingerID fingerid, SDL_bool down, float x, float y, float pressure)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
void SDL_SetMouseFocus(SDL_Window *window)
#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)
int SDL_SendMouseMotion(SDL_Window *window, SDL_MouseID mouseID, int relative, int x, int y)
int SDL_SendKeyboardText(const char *text)
GLubyte GLubyte GLubyte GLubyte w
SDL_EventType
The types of events that can be delivered.
#define SDL_BUTTON_MIDDLE
GLint GLint GLint GLint GLint GLint y
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)
int SDL_SendMouseWheel(SDL_Window *window, SDL_MouseID mouseID, float x, float y, SDL_MouseWheelDirection direction)
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
GLenum GLenum GLuint GLint GLint GLint yscale
#define SDL_arraysize(array)
GLenum GLenum GLuint GLint GLint xscale
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